FLASH編程注意事項
1.STM32復位后,F(xiàn)PEC模塊是被保護的,不能寫入FLASH_CR寄存器:通過寫入特定的序列到FLASH_KEYR寄存器可以打開FPEC模塊(即寫入KEY1和KEY2),只有在寫保護被解除后,我們才能操作相關(guān)寄存器。叫Unlock,簡直不正確會產(chǎn)生總線錯誤。
2.STM32閃存的編程每次必須寫入16位(不能單純的寫入8位數(shù)據(jù)哦!),當FLASH_CR寄存器的PG位為’1’時,在一個閃存地址寫入一個半字將啟動一次編程;寫入任何非半字的數(shù)據(jù),F(xiàn)PEC都會產(chǎn)生總線錯誤。
3.在編程過程中(FLASH_SR的BSY位為’1’),任何讀寫閃存的操作都會使CPU暫停,知道此次閃存編程結(jié)束。
4.STM32的FLASH在編程的時候,也必須要求其寫入地址的FLASH是被擦除了的(也就是其值必須是0xFFFF),否則無法寫入,在FLASH_SR寄存器的PGERR位將得到一個警告。
FLASH編程過程
1.檢查FLASH_CR的LOCK是否解鎖,如果沒有則先解鎖
2.檢查FLASH_SR寄存器的BSY位,以確認沒有其他正在進行的編程操作
3.設(shè)置FLASH_CR寄存器的PG位為’1’,在指定的地址寫入要編程的半字
4.等待BSY位變?yōu)椤?’
5.讀出寫入的地址并驗證數(shù)據(jù)
STM32的FLASH擦除過程
STM32FLASH編程的時候,要先判斷縮寫地址是否被擦除了,所以,我們有介紹STM32的閃存擦除過程很重要。
STM32的閃存擦除分為兩種:頁擦除和整片擦除。
1.檢查FLASH_CR的LOCK是否解鎖, 如果沒有則先解鎖
2.檢查FLASH_SR寄存器的BSY位,以確認沒有其他正在進行的閃存操作
3.設(shè)置FLASH_CR寄存器的PER位為’1’
4.用FLASH_AR寄存器選擇要擦除的頁
5.設(shè)置FLASH_CR寄存器的STRT位為’1’
6.等待BSY位變?yōu)椤?’
7.讀出被擦除的頁并做驗證
FLASH全片擦除
1.檢查FLASH_SR寄存器的BSY位,已確定沒有其他操作在進行
2.設(shè)置FLASH_CR寄存器的MER位1;
3.設(shè)置FLASH_CR寄存器的STRT為1
4.等待BSY為0
5.讀出所有頁并驗證
FLASH操作總結(jié)
鎖定解鎖函數(shù)
在對FLASH進行寫操作前必須先解鎖,解鎖操作也就是必須在
FLASH_KEYR寄存器寫入特定的序列(KEY1和KEY2),固件庫函數(shù)實現(xiàn);
void FLASH_Unlock(void);
同樣的道理,在對FLASH寫操作完成之后,我們要鎖定FLASH
void FLASH_Lock(void);
寫操作函數(shù)
固件庫提供了三個FLASH寫函數(shù):
FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);
FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);
FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data);
擦除函數(shù)
固件庫提供三個FLASH擦除函數(shù):
FLASH_Status FLASH_ErasePage(uint32_t Page_Address);
FLASH_Status FLASH_EraseAllPages(void);
FLASH_Status FLASH_EraseOptionBytes(void);
第一個是也擦除函數(shù),根據(jù)頁地址擦除特定的頁數(shù)據(jù)
第二個函數(shù)是擦除所有的頁數(shù)據(jù)
第三個函數(shù)是擦除用戶選擇字節(jié)數(shù)據(jù)
獲取狀態(tài)函數(shù)
FLASH_Status FLASH_GetStatus(void);
返回值是通過枚舉類型定義的:
typedef enum
{
FLASH_BUSY = 1, //忙
FLASH_ERROR_PG, //編程錯誤
FLASH_ERROR_WRP, //寫保護錯誤
FLASH_COMPLETE, //操作完成
FLASH_TIMEOUT //操作超時
}FLASH_Status;
等待操作完成函數(shù)
在執(zhí)行閃存寫操作時,任何對閃存的讀操作都會鎖住總線,在寫操作完成后讀操作才能正確地驚醒;即在進行寫或擦除操作時,不能進行代碼或數(shù)據(jù)的讀取操作。所以在每次操作之前,我們都要等待上一次操作完成這次操作才能開始。
FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout);
入口參數(shù)為等待時間,返回值是FLAHS的狀態(tài),這個很容易理解,這個函數(shù)本身我們在固件庫中使用得不多,但是在固件庫函數(shù)體中間可以多次看到。文章來源:http://www.zghlxwxcb.cn/news/detail-846443.html
讀FLASH特定地址數(shù)據(jù)函數(shù)
讀取FLASH指定地址的半字的函數(shù)固件庫并沒有給出來,這里我們需要自己寫一個函數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-846443.html
u16 STMFLASH_ReadHalfWord(u32 faddr)
{
return *(vu16*)faddr;
}
到了這里,關(guān)于【STM32詳解FLASH閃存編程原理與步驟】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!