赞
踩
在嵌入式系统中,实现数据的掉电存储通常是为了确保关键数据在系统断电或重启时不会丢失。
实现方式:数据量不大时将数据保存在片内flash中。(注意flash的读写寿命)
一、STM32内部flash简介
- void flash_write(void)
- {
- /* 解锁 */
- FLASH_Unlock();
-
- /* 清空所有标志位 */
- FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
-
- /* 擦除 */
- FLASHStatus = FLASH_ErasePage(Address);
-
- /* 向内部FLASH写入数据 */
- while(FLASHStatus == FLASH_COMPLETE) //判断是否擦除成功
- {
- FLASHStatus = FLASH_ProgramWord(Address, data); //写入数据
- }
-
- /* 上锁 */
- FLASH_Lock();
- }
2. flash读出函数:使用指针寻址读出地址的内容
- //读取flash的值
- FLASH_Unlock();
- data = (*(__IO uint32_t*) Address);
- FLASH_Lock();
3. 整体显示代码:
- #include "led.h"
- #include "delay.h"
- #include "sys.h"
- #include "usart.h"
- #include "key.h"
-
- uint32_t data = 1000; //定义一个变量,4个字节
- uint32_t Address = 0x08008000; //记录写入的地址
-
- typedef enum
- {
- FAILED = 0,
- PASSED = !FAILED
- } TestStatus;
-
- FLASH_Status FLASHStatus = FLASH_COMPLETE; //记录每次擦除的结果
- TestStatus MemoryProgramStatus = PASSED; //记录整个测试结果
-
- void flash_write(void)
- {
- /* 解锁 */
- FLASH_Unlock();
-
- /* 清空所有标志位 */
- FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
-
- /* 擦除 */
- FLASHStatus = FLASH_ErasePage(Address);
-
- /* 向内部FLASH写入数据 */
- while(FLASHStatus == FLASH_COMPLETE) //判断是否擦除成功
- {
- FLASHStatus = FLASH_ProgramWord(Address, data); //写入数据
- }
-
- /* 上锁 */
- FLASH_Lock();
- }
-
- //按下key1,data减小10
- void key1_handler(void)
- {
- data += 10;
- flash_write();
-
- }
-
- //按下key2,data增加10
- void key2_handler(void)
- {
- data -= 10;
- flash_write();
-
- }
-
-
- u16 count=0;
-
- int main(void)
- {
-
- delay_init(); //延时函数初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
- uart_init(115200); //串口初始化为115200
- LED_Init(); //初始化与LED连接的硬件接口
- KEY_Init();
-
- printf("\r\n STM32 flash 读写测试 \r\n");
-
- //读取flash的值
- FLASH_Unlock();
- data = (*(__IO uint32_t*) Address);
- FLASH_Lock();
-
- while(1)
- {
- u8 t=0;
- if(0==count%1)
- {
- t=KEY_Scan(0); //得到键值
- switch(t)
- {
- case 1:
- {
- key1_handler();
- }
- break;
- case 2:
- {
- key2_handler();
- }
- break;
- default:
- break;
- }
- }
-
- if(0==count%1000)
- {
- printf("The duchu
4. 实现效果:
通过按键修改数值为:6160
重新断电重启,观察数值:
可以看到数值就是最后保存的数值。
完整代码:https://download.csdn.net/download/qq_39742246/88582982
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。