嵌入式C语言STM32在FLASH中读取写入数据
STM32F4XX向指定FLASH地址读写
向FLASH中写入数据的主体思想就是先解锁,然后清标志位,然后找到要写入的地址,然后改变标志准备写入,然后在按已有的函数按地址一字节一字节的写入,最后要将FLASH上锁
1.写入函数代码如下:
int32_t Flash_WriteData(uint32_t address, uint8_t *data, uint32_t len) //向FLASH中写入数据
{uint32_t i;uint32_t StartSector = 0; //数据存放开始的扇区uint32_t EndSector = 0; //数据存放结束的扇区StartSector = Flash_GetSector(address);EndSector = Flash_GetSector(address + len - 1);{FLASH_Unlock();FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR); do {if (FLASH_EraseSector(StartSector, VoltageRange_3) != FLASH_COMPLETE) { /* Error occurred while sector erase. User can add here some code to deal with this error */return 0;}/* 切换到下一扇区 */if(StartSector == FLASH_Sector_11) {StartSector = FLASH_Sector_12;} else {StartSector += 0x0008; }} while(StartSector < EndSector);FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR); for(i = 0;i < len;i++) {FLASH_ProgramByte(address + i, *(data + i));}FLASH_Lock();}return 0;
}
这其中的FLASH_ProgramByt,FLASH_Unlock,FLASH_Lock函数已经在头文件中包含,传入的数据分别是想要写入的地址,想要写入的数据,还有写入数据的长度,所以提前给出想要写入的地址例如0x8000000
如果没有查找盘符的函数也可以参考如下函数给出
uint32_t Flash_GetSector(uint32_t address)
{uint32_t sector = 0;if((address < ADDR_FLASH_SECTOR_1) && (address >= ADDR_FLASH_SECTOR_0)) {sector = FLASH_Sector_0; } else if((address < ADDR_FLASH_SECTOR_2) && (address >= ADDR_FLASH_SECTOR_1)) {sector = FLASH_Sector_1; } else if((address < ADDR_FLASH_SECTOR_3) && (address >= ADDR_FLASH_SECTOR_2)) {sector = FLASH_Sector_2; } else if((address < ADDR_FLASH_SECTOR_4) && (address >= ADDR_FLASH_SECTOR_3)) {sector = FLASH_Sector_3; } else if((address < ADDR_FLASH_SECTOR_5) && (address >= ADDR_FLASH_SECTOR_4)) {sector = FLASH_Sector_4; } else if((address < ADDR_FLASH_SECTOR_6) && (address >= ADDR_FLASH_SECTOR_5)) {sector = FLASH_Sector_5; } else if((address < ADDR_FLASH_SECTOR_7) && (address >= ADDR_FLASH_SECTOR_6)) {sector = FLASH_Sector_6; } else if((address < ADDR_FLASH_SECTOR_8) && (address >= ADDR_FLASH_SECTOR_7)) {sector = FLASH_Sector_7; } else if((address < ADDR_FLASH_SECTOR_9) && (address >= ADDR_FLASH_SECTOR_8)) {sector = FLASH_Sector_8; } else if((address < ADDR_FLASH_SECTOR_10) && (address >= ADDR_FLASH_SECTOR_9)){sector = FLASH_Sector_9; } else if((address < ADDR_FLASH_SECTOR_11) && (address >= ADDR_FLASH_SECTOR_10)) {sector = FLASH_Sector_10; } else if((address < ADDR_FLASH_SECTOR_12) && (address >= ADDR_FLASH_SECTOR_11)) {sector = FLASH_Sector_11; } else if((address < ADDR_FLASH_SECTOR_13) && (address >= ADDR_FLASH_SECTOR_12)) {sector = FLASH_Sector_12; } else if((address < ADDR_FLASH_SECTOR_14) && (address >= ADDR_FLASH_SECTOR_13)) {sector = FLASH_Sector_13; } else if((address < ADDR_FLASH_SECTOR_15) && (address >= ADDR_FLASH_SECTOR_14)) {sector = FLASH_Sector_14; } else if((address < ADDR_FLASH_SECTOR_16) && (address >= ADDR_FLASH_SECTOR_15)) {sector = FLASH_Sector_15; } else if((address < ADDR_FLASH_SECTOR_17) && (address >= ADDR_FLASH_SECTOR_16)) {sector = FLASH_Sector_16; } else if((address < ADDR_FLASH_SECTOR_18) && (address >= ADDR_FLASH_SECTOR_17)) {sector = FLASH_Sector_17; } else if((address < ADDR_FLASH_SECTOR_19) && (address >= ADDR_FLASH_SECTOR_18)) {sector = FLASH_Sector_18; } else if((address < ADDR_FLASH_SECTOR_20) && (address >= ADDR_FLASH_SECTOR_19)) {sector = FLASH_Sector_19; } else if((address < ADDR_FLASH_SECTOR_21) && (address >= ADDR_FLASH_SECTOR_20)) {sector = FLASH_Sector_20; } else if((address < ADDR_FLASH_SECTOR_22) && (address >= ADDR_FLASH_SECTOR_21)) {sector = FLASH_Sector_21; } else if((address < ADDR_FLASH_SECTOR_23) && (address >= ADDR_FLASH_SECTOR_22)) {sector = FLASH_Sector_22; } else if(address >= ADDR_FLASH_SECTOR_23) {sector = FLASH_Sector_23; }return sector;
}
到此写入的函数主题就以大体完成,我们可以像这样调用此函数
char test[] = "想要写入的内容,例如:测试";
int Len = sizeof(test);
Flash_WriteData(ADDR, (uint8_t *)IAPID, Len);
注意地址一定要给出,我这里使用的宏定义
#define ADDR 0x8000000
到此,我们就可以在地址为0x8000000的地方写入测试的内容
接下来我们来写一个读取指定地址,指定长度的函数来将我们写入的东西在别的地方调用出来
void ReadData(uint32_t ReadAddress, uint16_t *dest_Data, uint32_t num)
{int i = 0;while(i < num) {*(dest_Data+i) = *(uint16_t*) ReadAddress;ReadAddress += 2;i++;}
}
读取函数相对简单,简单理解就是把指定地址位置上的数据分别覆在我们的指针上,然后读出,这里我们要将读取的地址和长度传入函数,然后函数会将读取出来的数据内容传出
ReadData(IAPID_ADDRESS, (uint16_t *)Date, Len)
在使用时也比较简单,直接给到地址,sizeof一下想要的长度,就可以读取出数据了。
嵌入式C语言STM32在FLASH中读取写入数据相关推荐
- STM32 在flash中存储float数据
Float 类型数字在计算机中用4个字节存储,遵循IEEE-754格式标准: Float 数据 符号部分(S) 底数部分(M) 指数部分(E) 说明 0 表示正 1 表示负 使用二进制数来表示此浮点数 ...
- C# 操作地址 从内存中读取写入数据(初级)
本示例以植物大战僵尸为例, 实现功能为 每1秒让阳光刷新为 9999.本示例使用的游戏版本为 [植物大战僵尸2010年度版], 使用的辅助查看内存地址的工具是 CE. 由于每次启动游戏, 游戏中阳光 ...
- 如何用c语言从txt文件中读取数据
用C语言从txt文件中读取数据,可以使用C标准库文件自带的文件接口函数进行操作. 一.打开文件: FILE *fopen(const char *filename, const char *mode) ...
- emwin从外部flash中读取bmp图片显示
在emwin中有提供了一个从外部读取图片数据进行显示的函数,如下: 而且提供了官方例程,不过官方历程中从外部读取是从外部文件系统中进行读取的bmp图片进行显示,官方例程如下 /* ********** ...
- R语言中读取excel数据的常用方式有哪些?
R语言中读取excel数据的常用方式有哪些? 目录 R语言中读取excel数据的常用方式有哪些? R语言是解决什么问题的? R语言中读取excel数据的常用方式有哪些? R语言是解决什么问题的? R ...
- matlab 十六进制数组,【MATLAB】MATLAB中读取二进制数据文件并加入到矩阵中
MATLAB中读取二进制数据文件并加入到矩阵中的应用如下: 如果对c语言十分熟悉的话,应该对fopen,fclose,ftell,fseek,fread,fwrite,feof 这些函数非常熟悉了,在 ...
- 随机从mysql中读取_如何实现MySQL表数据随机读取?从mysql表中读取随机数据
文章转自 http://blog.efbase.org/2006/10/16/244/ 如何实现MySQL表数据随机读取?从mysql表中读取随机数据?以前在群里讨论过这个问题,比较的有意思.mysq ...
- 禁用Cookie在web浏览器中读取/写入c#应用程序
我希望网站无法读取cookie或在webbrowser c#控制应用程序中写入新的cookie.当webbrowser c#应用程序运行时,我宁愿禁用所有网站的所有读/写cookie操作,如果不是,那 ...
- 使用Java中的FileChannel和ByteBuffer在文件中读取/写入文件
过去,我讨论过RandomAccessFile以及如何将其用于在Java中进行更快的IO,在本Java NIO教程中,我们将了解如何通过使用FileChannel和ByteBuffer来使用读/写数据 ...
最新文章
- Windows脚本初探之PowerShell流程控制if
- SpringBoot 2.0 系列001 -- 入门介绍以及相关概念
- 中运量71路线路图_浦东临港的中运量呼之欲出:临港地区已经成为上海建设的热土...
- 生活在AI的世界是种什么体验?
- 群晖218J安装mysql_ds216(群晖218j可以换内存吗)
- SharePoint中的富文本编辑器控件
- 2017蓝桥杯省赛---java---B---7(日期问题)
- C++ vector类详解
- GetClientRect相当于GetWindowRect和ScreenToClient区别
- c语言输出教学日历表 节假日突出,[蓝桥杯][算法提高VIP]任意年月日历输出 (C语言代码)...
- SQL Server 去除节假日天数,获取实际工作日天数
- CVE-2015-5254(ActiveMQ 反序列化漏洞)复现
- pytorch 支持amd显卡吗_AMD平台上配置PyTorch+Apex开发环境
- FTP主动模式和被动模式讲解
- 最新计算机学术研讨会,TC预告|CCF 2020第十届全国文字与计算学术研讨会
- Go语言的使用结构体、指针和方法
- 这本书能教会你的小孩如何理财
- django 验证和授权系统
- ASP 如何读取 Word 档案内容并显示于网页
- 视频教程-2020软考软件设计师下午案例分析视频培训课程-软考