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 }