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中读取写入数据相关推荐

  1. STM32 在flash中存储float数据

    Float 类型数字在计算机中用4个字节存储,遵循IEEE-754格式标准: Float 数据 符号部分(S) 底数部分(M) 指数部分(E) 说明 0 表示正 1 表示负 使用二进制数来表示此浮点数 ...

  2. C# 操作地址 从内存中读取写入数据(初级)

    本示例以植物大战僵尸为例, 实现功能为 每1秒让阳光刷新为 9999.本示例使用的游戏版本为 [植物大战僵尸2010年度版], 使用的辅助查看内存地址的工具是  CE. 由于每次启动游戏, 游戏中阳光 ...

  3. 如何用c语言从txt文件中读取数据

    用C语言从txt文件中读取数据,可以使用C标准库文件自带的文件接口函数进行操作. 一.打开文件: FILE *fopen(const char *filename, const char *mode) ...

  4. emwin从外部flash中读取bmp图片显示

    在emwin中有提供了一个从外部读取图片数据进行显示的函数,如下: 而且提供了官方例程,不过官方历程中从外部读取是从外部文件系统中进行读取的bmp图片进行显示,官方例程如下 /* ********** ...

  5. R语言中读取excel数据的常用方式有哪些?

    R语言中读取excel数据的常用方式有哪些? 目录 R语言中读取excel数据的常用方式有哪些? R语言是解决什么问题的? R语言中读取excel数据的常用方式有哪些? R语言是解决什么问题的? R ...

  6. matlab 十六进制数组,【MATLAB】MATLAB中读取二进制数据文件并加入到矩阵中

    MATLAB中读取二进制数据文件并加入到矩阵中的应用如下: 如果对c语言十分熟悉的话,应该对fopen,fclose,ftell,fseek,fread,fwrite,feof 这些函数非常熟悉了,在 ...

  7. 随机从mysql中读取_如何实现MySQL表数据随机读取?从mysql表中读取随机数据

    文章转自 http://blog.efbase.org/2006/10/16/244/ 如何实现MySQL表数据随机读取?从mysql表中读取随机数据?以前在群里讨论过这个问题,比较的有意思.mysq ...

  8. 禁用Cookie在web浏览器中读取/写入c#应用程序

    我希望网站无法读取cookie或在webbrowser c#控制应用程序中写入新的cookie.当webbrowser c#应用程序运行时,我宁愿禁用所有网站的所有读/写cookie操作,如果不是,那 ...

  9. 使用Java中的FileChannel和ByteBuffer在文件中读取/写入文件

    过去,我讨论过RandomAccessFile以及如何将其用于在Java中进行更快的IO,在本Java NIO教程中,我们将了解如何通过使用FileChannel和ByteBuffer来使用读/写数据 ...

最新文章

  1. Windows脚本初探之PowerShell流程控制if
  2. SpringBoot 2.0 系列001 -- 入门介绍以及相关概念
  3. 中运量71路线路图_浦东临港的中运量呼之欲出:临港地区已经成为上海建设的热土...
  4. 生活在AI的世界是种什么体验?
  5. 群晖218J安装mysql_ds216(群晖218j可以换内存吗)
  6. SharePoint中的富文本编辑器控件
  7. 2017蓝桥杯省赛---java---B---7(日期问题)
  8. C++ vector类详解
  9. GetClientRect相当于GetWindowRect和ScreenToClient区别
  10. c语言输出教学日历表 节假日突出,[蓝桥杯][算法提高VIP]任意年月日历输出 (C语言代码)...
  11. SQL Server 去除节假日天数,获取实际工作日天数
  12. CVE-2015-5254(ActiveMQ 反序列化漏洞)复现
  13. pytorch 支持amd显卡吗_AMD平台上配置PyTorch+Apex开发环境
  14. FTP主动模式和被动模式讲解
  15. 最新计算机学术研讨会,TC预告|CCF 2020第十届全国文字与计算学术研讨会
  16. Go语言的使用结构体、指针和方法
  17. 这本书能教会你的小孩如何理财
  18. django 验证和授权系统
  19. ASP 如何读取 Word 档案内容并显示于网页
  20. 视频教程-2020软考软件设计师下午案例分析视频培训课程-软考

热门文章

  1. C++学习52个经典网站
  2. bmp格式如何转换成jpg?可批量转换
  3. C# internal解析
  4. 华为AC+AP配置笔记
  5. android系统导入u盘音乐播放器,手机歌曲怎么导入U盘?
  6. linux 非root 安装ImageMagick 以及python调用ImageMagick将图片生成gif案例
  7. 销售系统—指引腾讯广告平台对接销售系统操作
  8. 13 rtsp视频服务 基于node+ffmpeg 转换为 flv 视频服务
  9. 遇见这些APP,我觉得世界都变得温柔了
  10. vs code连接服务器卡在Downloading with wget