HAL库实现内部FLASh清除,存储

本文记录了在STM32芯片中实现内部FLASH清除和数据存储的过程,通过分析.map文件确定可用内存位置,然后进行解锁、擦除、写入和锁定操作。经过调试,成功实现了数据在断电后仍能保持的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了让数据不再掉电清零,百度一堆终于找到一个解决方案,调试一天,终于调试成功这个功能了。为了防止忘记(节约大家像我一样白忙活的时间)写个博客记录一下,首先打开.map文件。找不到的编译
在这里插入图片描述
成功后双击上图就会弹出来,如果没有就找到编译生成的文件夹,在hex文件下面,打开map文件,滑到最下面,可以看到程序所占内存有多大,如图在这里插入图片描述
18840转化为16进制为4998,所以程序所占空间加上0x08000000等于0x08004998,数一数看看在第几页在这里插入图片描述
之后,在没用到的空间里进行擦除和写入操作即可。
代码实现
1.给flash开锁

HAL_FLASH_Unlock();

2.进行擦除


                
### STM32 HAL数据写入内部Flash #### 使用HAL实现数据写入内部Flash的功能 STM32微控制器提供了丰富的片上资源,其中包括内部Flash存储器。通过STM32 HAL可以方便地操作这些硬件资源。为了将数据写入内部Flash,需要完成以下几个方面的设置和编程工作。 1. **启用Flash接口** 需要初始化Flash接口并确保其处于可写的模式下。这通常涉及解锁Flash访问权限以及配置必要的时钟源。这部分可以通过调用`HAL_FLASH_Unlock()`函数来实现[^1]。 2. **擦除目标扇区** Flash存储器的操作遵循先擦后写的原则。因此,在向指定地址写入新数据之前,必须清除该区域的内容。此过程由`HAL_FLASHEx_Erase()`函数负责执行。需要注意的是,每次擦除会清空整个扇区的数据,所以在实际应用中应合理规划存储布局以减少不必要的覆盖操作[^3]。 3. **编写具体数据至Flash** 当前已准备好待更新的目标位置之后,则可通过循环调用`HAL_FLASH_Program()`方法逐字节或者半字形式填充所需保的信息片段进去相应物理内单元里去完成最终目的即持久化记录某些重要参数或状态标志位等信息项以便下次开机加载恢复使用。 以下是基于上述理论构建的一个简单示例程序: ```c #include "stm32f4xx_hal.h" void WriteToFlash(uint32_t address, uint64_t data){ FLASH_EraseInitTypeDef EraseInitStruct; uint32_t PAGEError = 0; /* Unlock the Flash to enable the flash control register access *************/ HAL_FLASH_Unlock(); /* Fill EraseInit structure**************************************************/ EraseInitStruct.TypeErase = TYPEERASE_PAGES; EraseInitStruct.PageAddress = address & (uint32_t)(~(FLASH_PAGE_SIZE -1)); // Align start page addr. EraseInitStruct.NbPages = 1 ; if(HAL_OK != HAL_FLASHEx_Erase(&EraseInitStruct,&PAGEError)){ Error_Handler(); } /* Program Data */ for(int i=0;i<8;i+=2){ if(HAL_OK != HAL_FLASH_Program(TYPEPROGRAM_HALFWORD,address,(uint64_t)((data >>i*8)&0xFFFF))){ Error_Handler(); } address += sizeof(uint16_t); } /* Lock the Flash to disable the flash control register access (recommended** *to protect the Flash memory against possible unwanted operation)***********/ HAL_FLASH_Lock(); } // Example usage of function defined above int main(void){ uint32_t writeAddr = 0x0801F800;//example address within user area uint64_t myData = 0xDEADBEEFFEEDFACEULL; SystemClock_Config();//configure system clock as per your needs MX_GPIO_Init(); //initialize GPIOs etc. WriteToFlash(writeAddr ,myData); while (1){ //do other stuff here... } } ``` #### 注意事项 - 上述代码中的`writeAddr`应当位于用户可用的Flash空间范围内,避免越界写入破坏引导码或其他关键系统数据。 - `SystemClock_Config()` 和 `MX_GPIO_Init()` 函数假定来自CubeMX生成的标准项目框架;如果采用手动编码方式则需自行定义相关内容。 - 错误处理机制在此仅示意性给出,生产环境中建议加入更详尽的日志记录与报警提示功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值