操作STM32F030F4P9 Flash注意细节

1、读Flash某一个地址上存储的数据的方式可以直接读取,实例如下  

1 #define ADDR ((uint32_t)0x8003C00)
2 uint32_t data = (uint32_t)(*((uint32_t*)ADDR));//读取地址0x8003C00上的数据

2、往Flash中写入数据

  1)、在往Flash中写入数据之前,必须关闭所有中断,防止进入中断程序,从而导致触发硬件异常。因为在写Flash时,Flash是不能被读取指令代码的。

       2)、解锁Flash

       2)、选择要写入Flash地址所在的Flash页,对该页进行擦除操作,如果需要,可先将数据读取出来进行缓存,然后再往Flash中写数据。

       3)、每次往地址写入数据完成,应该重新在该地址获取一遍数据,判断是否数据写入成功。
       4)、写入完成之后,对Flash加锁

       5)、开启所有中断

示例代码如下:(基于CubeMX库)

 1 #define PAPARM_PAGE_ADD ((uint32_t)0x8003C00)
 2 #define RGB_PARAM_CRC_ADD (PAPARM_PAGE_ADD+4*8)
 3 
 4 static uint8_t save_param(void){
 5     
 6     uint32_t add;
 7      
 8     FLASH_EraseInitTypeDef pageinit= { FLASH_TYPEERASE_PAGES, PAPARM_PAGE_ADD, 1 }; //页擦除、擦除地址,擦除页数(有些芯片FLASH支持块擦除)
 9     uint32_t PageError = 0;
10         
11     __set_PRIMASK(1);   //关闭所有中断
12     
13     if( HAL_OK!=HAL_FLASH_Unlock() ) { HAL_FLASH_Lock();     __set_PRIMASK(0); return 0; }  //解锁Flash
14         
15     HAL_FLASHEx_Erase(&pageinit, &PageError);  //擦除页
16 
17     /* 往Flash中写入数据 */
18     add = PAPARM_PAGE_ADD;
19     
20     HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, add, set_param.open_delay_time);
21     if(set_param.open_delay_time!= (*((uint32_t*)add))) { HAL_FLASH_Lock(); __set_PRIMASK(0); return 0; } //进行数据校验
22     
23     add += 4;
24     HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, add, set_param.open_high_enable);
25     if(set_param.open_high_enable!= (*((uint32_t*)add))) { HAL_FLASH_Lock(); __set_PRIMASK(0); return 0; }
26     
27     add += 4;
28     HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, add, set_param.open_led_blink_time);
29     if(set_param.open_led_blink_time!= (*((uint32_t*)add))) { HAL_FLASH_Lock(); __set_PRIMASK(0); return 0; }
30     
31     add += 4;
32     HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, add, set_param.close_led_blink_time);
33     if(set_param.close_led_blink_time!= (*((uint32_t*)add))) { HAL_FLASH_Lock(); __set_PRIMASK(0); return 0; }
34     
35     add += 4;
36     HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, add, set_param.none_pwm_time);
37     if(set_param.none_pwm_time!= (*((uint32_t*)add))) { HAL_FLASH_Lock(); __set_PRIMASK(0); return 0; }
38     
39     add += 4;
40     HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, add, set_param.debug_sw);
41     if(set_param.debug_sw!= (*((uint32_t*)add))) { HAL_FLASH_Lock(); __set_PRIMASK(0); return 0; }
42         
43     HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, RGB_PARAM_CRC_ADD, 0xaa);
44     if(0xaa!=(uint8_t)(*((uint32_t*)RGB_PARAM_CRC_ADD))) { HAL_FLASH_Lock(); __set_PRIMASK(0); return 0; }
45     
46     HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, RGB_PARAM_CRC_ADD+4, 0x55);
47     if(0x55!=(uint8_t)(*((uint32_t*)RGB_PARAM_CRC_ADD+4))) { HAL_FLASH_Lock(); __set_PRIMASK(0); return 0; }
48     
49     
50     HAL_FLASH_Lock();  //加锁Flash
51     
52     __set_PRIMASK(0);  //开启所有中断
53     
54     return 1;   //写入数据成功,返回1,错误返回为0
55 }

 

上一篇:【C语言】查找一组数中的最大、最小值


下一篇:Server.Transfer VS Response.Redirect – Simplified