操作STM32F030F4P9 Flash注意细节(STM32系列芯片操作步骤是一样的)
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 }