历史上的今天
今天是:2025年01月31日(星期五)
2020年01月31日 | stm32中flash的写入与读取
2020-01-31 来源:eefocus
stm32中flash应用的常见函数:
1.擦除函数:
FLASH_Status FLASH_ErasePage(u32 Page_Address)只要()里面的数是flash第xx页中对应的任何一个地址!就是擦除xx页全部内容。
2.flash写入函数:
STMFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite)
入参:
WriteAddr:要写入flash中的首地址,stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片flash大小不同,因此从理论上来说该地址可以从0x08000000进行写入,但实际要考虑代码所占空间大小,所以该地址要错过代码段的地址,以防擦除时将代码也擦除了。
pBuffer:该参数为要写入flash中的数据的地址。
NumToWrite:该参数为要写入的数据的长度。
源码展示:
int STMFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite)
{
FLASH_EraseInitTypeDef FlashEraseInit;
HAL_StatusTypeDef FlashStatus=HAL_OK;
uint32_t SectorError=0;
uint32_t addrx=0;
uint32_t endaddr=0;
int result = 0;
if(WriteAddr } HAL_FLASH_Unlock(); //解锁 addrx=WriteAddr; //写入的起始地址 endaddr=WriteAddr+(NumToWrite)*4; //写入的结束地址 if(addrx<0X1FFF0000) { while(addrx if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//有非0XFFFFFFFF的地方,要擦除这个扇区 { FlashEraseInit.TypeErase=FLASH_TYPEERASE_PAGES; //擦除类型,整页擦除 FlashEraseInit.PageAddress=FLASH_SAVE_ADDR; //要擦除的页 FlashEraseInit.NbPages=1; //一次只擦除一个页 if(HAL_FLASHEx_Erase(&FlashEraseInit,&SectorError)!=HAL_OK) { result = -1; break;//发生错误了 } }else addrx+=4; FLASH_WaitForLastOperation(FLASH_WAITETIME); //等待上次操作完成 } } FlashStatus=FLASH_WaitForLastOperation(FLASH_WAITETIME); //等待上次操作完成 if(FlashStatus==HAL_OK) { while(WriteAddr if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,WriteAddr,*pBuffer)!=HAL_OK)//写入数据 { result = -1; break; //写入异常 } WriteAddr+=4; pBuffer++; } } HAL_FLASH_Lock(); //上锁 return result; } 3.从flash中读取指定地址的字: uint32_t STMFLASH_ReadWord(uint32_t faddr) { return *(uint32_t*)faddr; } 函数入参: faddr:要读取字的地址。 4.从flash中读取多个字节函数: STMFLASH_Read(uint32_t ReadAddr,uint8_t *pBuffer,uint32_t NumToRead) 函数入参: ReadAddr:要读取数据的首地址。 pBuffer:读取数据之后的地址。 NumToRead:要读取字节的大小。 函数源码: void STMFLASH_Read(uint32_t ReadAddr,uint8_t *pBuffer,uint32_t NumToRead) { uint32_t i; uint32_t tmp; for(i=0;i tmp = STMFLASH_ReadWord(ReadAddr + i*4);//读取4个字节. memcpy(&pBuffer[i*4], (void *)&tmp, 4); } //处理NumToRead不是4的整倍数情况,处理余数. int remain = NumToRead % 4; tmp = STMFLASH_ReadWord(ReadAddr + i*4); memcpy(&pBuffer[i*4], (void *)&tmp, remain); } 总之从flash中读取和写入数据的关键在于数据的大小以及对地址的处理上,其他部分基本一样。
史海拾趣
|
本信息来自合作QQ群:AVR单片机学习与交流群(17727270) 群管理员在坛子里的ID:铜河 100M、4通道,2G采样,25k记录 据说,这个虽然是100M,但实测是200M… 查看全部问答> |
|
最近遇到一个问题: 环境如下 wince下串口每秒发送15K数据,我的串口读写缓冲区设置4K,全局数据设置为20K 现在有两个解决办法 请大家分析一下那个更好 1.wince socket同步发送 ...… 查看全部问答> |
|
我现在用一个运算放大器调整单片机的采样信号.放大器的型号为LF412,资料里电源连接方式是双电源供电,如接+/-15v,由于我现在的输入信号只有正的.我把负电源接地,正电源接+15v,请问这样做行吗?… 查看全部问答> |
|
LED护栏管(数码管)现今已是非常普遍、流行的夜景照明亮化产品,因此,各个行业及酒店KTV、事业单位纷纷安装,用于展示自我形象、产品及服务。 一、考虑价格 商家常用招数之一。当然是越便宜客户越高兴;不过,羊毛出在羊身上,太便宜肯 ...… 查看全部问答> |
|
06.23【每周讨论】我们年轻,富有正义。对于社会中的不文明现象该怎样看待呢? 06.23【每周讨论】年轻的我们,富有正义、满怀激情。对于社会中的不文明现象该怎样看待呢?我们年轻人,富有正义、满怀激情,眼里容不下一粒沙。社会中那些不文明的现象经常在我们的周围发生,却让我们感到无可奈何。若为此感到懊恼的话,那你永远 ...… 查看全部问答> |
|
【M4 开发板入门】EKK-LM4F232 开发起步摘要(README FIRST ABSTRACT) EEWORLD 的朋友,当拿到 LM4F232 的评估板后,可以先看看我的 README FIRST 摘要,希望能有些帮助。 一、开发板简介 1.板上主要资源:三轴加速度测量器,OLED 屏,Stellaris ICDI 仿真器,温度传感器,具备 USB Host,Device 和 OTG 功能。 2.打 ...… 查看全部问答> |
|
1.在烧写程序时,是不是芯片的所有memory都要先进行校验? 2.在程序没使用内部flash的情况下,会不会在烧写程序也要对flash的memory进行校验。 3.以上校验memory时,是要先对flash解锁的吗? 经过查阅TI的CSM相 ...… 查看全部问答> |




