操作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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM