文章目錄
- 前言
- STM32F105的內部ROM分布
- STM32F10x的閃存擦寫
- 解鎖FPEC
- Main FLASH 的編寫
- main Flash的擦除
- 注意點
前言
在通過OTA的方式對設備進行升級,若在使用內部FLASH裝載固件程序的方式下,需要擦寫 內部FLASH 從而實現把新的固件程序寫入到 內部FLASH。
參考文檔:ST的閃存編程文檔
STM32F105的內部ROM分布
F105屬于互聯型設備,其內部的主存儲器ROM有256KB。
這256KB 由 128頁 ,每頁2KB的頁面組成
Information block 分為兩個部分:System memory 和 Option bytes
- System memory:
這個部分存儲了是STM32官方系統的bootloader程序,在通過選擇對應的BOOT模式可以進入該bootloader程序;該bootloader程序是通過 把USART1的傳輸過來的程序 寫入到Main memory中。
在互聯型產品中,bootloader程序 還可以讀取 USART2(重映射)等接口,從而燒錄程序。 - Option bytes
有兩種保護方式:①寫包含;②讀保護
注意:
1.只有在寫FLASH完畢后,才能正確的讀取FLASH。在 寫FLASH時讀取FLASH,將會造成寫失敗;
2.只有在內部高速晶振開啟時,才能寫入/擦除內部FLASH。
3.在低功耗模式下,對FLASH的任何訪問將被中止。
STM32F10x的閃存擦寫
STM32F10x的閃存擦寫由 FPEC 控制。
FPEC指Flash program and erase controller,FPEC由7個32位的寄存器組成。
注意:只有CPU沒有訪問 正在操作的FLASH,CPU將不會因操作FLASH而阻塞。
解鎖FPEC
在復位后,FPEC是被保護著。
需要往 FLASH_KEYR 寄存器寫入固定的值,才可解開FPEC的鎖。
如果這個值寫錯了,那么只有在下一次復位后,才能再次接口FPEC的鎖。
Main FLASH 的編寫
每次只能往main flash寫入16位數據。
在寫入main flash的指定地址時,若該地址并未被擦除,則FLASH_SR的 PGERR 將會被置位。
若該地址是寫保護的(通過 FLASH_WRPR 設置),則FLASH_SR的 WRPRTERR 將會被置位。
標志的擦寫 main Flash的步驟如下:
main Flash的擦除
在編寫 main Flash 之前,需要先擦除。
擦除 main Flash 的方式有兩種:頁擦除,全擦除。
頁擦除:頁擦除是擦除 main Flash的一個頁面。
map 0x40000000,0x40080000 read write
注意點
在使用stm32自帶的flash保存數據時候,如下特點必須知道:
1、必須是先擦除一個扇區,才能寫入
2、讀數據沒有限制
3、寫數據必須是偶數(2字節、4字節),同時寫入地址以一定要考慮字節對齊,
4、一般都是在最后幾頁進行數據保存的,確保數據量不超過flash的的大小,比如f103大容量是2k字節,其實一個扇區只能寫入1k數量的2字節的數據。
http://eeskill.com/article/id/29479
5、寫入數據時,采用大端模式,如想往 0x0800 0000寫入0x31 0x32 0x33 0x34
,則寫入的數據是uint32_t data = 0x31 + 0x32<<8 + 0x33<<16 + 0x34<<24;
即寫入0x34333231
6、一旦寫入數據,無論你寫的是FLASH擦除后的默認值0xff
還是其他值,若在不擦除的情況下再次往該地址寫數據,必定失敗。
7、若遇到寫入 或 擦除失敗的清空,需要清除標志位后才能再繼續寫入或擦除。
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
flash_sta=FLASH_ErasePage(UPDAFLAG_FLASH_56K);