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中读取和写入数据的关键在于数据的大小以及对地址的处理上,其他部分基本一样。
设计资源 培训 开发板 精华推荐
- ESP8266EX-无线遥控笔
- LT8330HS6 4V 至 16V 输入、-5V 反相转换器的典型应用电路
- OP497FSZ精密运算放大器正峰值检波器典型应用电路
- LM317 限流 6V 充电器稳压器的典型应用
- MIC23451 的典型应用:具有超轻负载和电源良好的 3MHz、2A 三重同步降压稳压器
- 具有突发模式操作的 LTC3130IMSE-1 宽输入电压范围 15V 转换器的典型应用
- 使用 ROHM Semiconductor 的 BU4224 的参考设计
- 使用 AD9958 直接数字合成器的相位相干 FSK 调制器
- ip5328p
- AM3GW-4815SZ 15V 3 瓦 DC-DC 转换器的典型应用
- 下载文章:“深入了解信号发生器”丰富知识赢取好礼
- 免费申请|Maxim 高性能模拟工具包(内含78个器件)
- 【EE团】尽享TI MSP-EXP430FR5739实验板套件!
- 富士通白皮书有奖下载|FRAM高性能存储器优化车载电子系统
- 中秋芯币兑大礼
- 【1月14日 技术直播】工程师请就位,Keysight计量专家开讲啦 ~电子仪器计量校准基础知识与校准周期探讨
- 注册泰克MDO示波器礼券 拿蓝牙耳机和纤细激光笔!
- 如何用3个关键步骤,来确保下一代设计安全性,深入解读嵌入式设备DeepCover加密控制器,看视频答题赢好礼!
- 现场抽取PS5等诸多好礼 SiFive RISC-V 中国技术论坛 上海、北京、深圳 3场线下活动邀您出席!
- 【TI 教室】学电源,晒成绩,挖楼有礼!