单片机之flash读写
生活随笔
收集整理的這篇文章主要介紹了
单片机之flash读写
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 《雅特力MCU的flash讀寫操作》
- 一、背景知識
- 二、雅特力官方固件提供的API接口函數
- 2-1解鎖上鎖函數
- 2-2獲取flash狀態函數
- 2-3擦除函數
- 2-4寫操作函數
- 2-5等待操作完成函數
- 2-6讀操作
- 三、操作步驟
- 3-1流程
- 四、注意事項
《雅特力MCU的flash讀寫操作》
引用:AT32F421系列超詳細參考手冊-中文版
一、背景知識
1、MCU的flash是存儲芯片的一種,通過特定的程序可以修改里面的數據。FLASH在電子以及半導體領域內往往表示Flash Memory的意思,即平時所說的“閃存”,全名叫Flash EEPROM Memory。 flash存儲器又稱閃存,它結合了ROM和RAM的長處,不僅具備電子可擦除可編程(EEPROM)的性能,還可以快速讀取數據(NVRAM的優勢),使數據不會因為斷電而丟失 ; 本篇文章按照雅特力MCU(AT32F421)官方提供的庫函數來編寫的,其固件庫大部分兼容ST系列的固件。二、雅特力官方固件提供的API接口函數
2-1解鎖上鎖函數
void FLASH_Unlock(void); //解鎖函數:在對Flash操作之前必須解鎖 void FLASH_Lock(void); //鎖定函數:同理,操作完Flash之后必須重新上鎖2-2獲取flash狀態函數
FLASH_Status FLASH_GetStatus(void); 通過獲取Flash狀態函數,獲取Flash的狀態,以便于根據狀態對Flash進行操作。該函數返回值是通過枚舉類型定義的,在代碼中可以看到FLASH_Status類型定義如下(具體含義看注釋即可): typedef enum {FLASH_BSY = 1, //忙FLASH_PGRM_FLR, //編程錯誤FLASH_WRPRT_FLR,//寫保護錯誤FLASH_PRC_DONE, //操作結束FLASH_TIMEOUT //超時 } FLASH_Status;2-3擦除函數
FLASH_Status FLASH_ErasePage(uint32_t Page_Address); //擦除一頁 FLASH_Status FLASH_EraseAllPages(void); //擦除所有頁2-4寫操作函數
FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data); //32位字寫入函數 FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data); //16位半字寫入函數 FLASH_Status FLASH_ProgramByte(uint32_t Address, uint8_t Data); //一個字節寫入函數 FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data); //用戶選擇字節寫入函數2-5等待操作完成函數
FLASH_Status FLASH_WaitForProcess(uint32_t Timeout)注:在執行閃存寫操作時,任何對閃存的讀操作都會鎖住總線,在寫操作完成后讀操作才能正確地進行;既在進行寫或擦除操作時,不能進行代碼或數據的讀取操作。所以在每次操作之前,我們都要等待上一次操作完成這次操作才能開始。
2-6讀操作
該操作沒有相對應的API函數,而是直接從地址處把地址的內容通過指針賦予數組或者變量來保存使用。
三、操作步驟
注:任何有關于flash的操作都必須通過解鎖操作來進行接下來的步驟
3-1流程
寫入數據程序 /* ********************************************************************************************************* * 函 數 名: bsp_FLASH_WriteBuffer * 功能說明: 寫數據到 CPU FLASH * 形 參: * ulFlashAddr: FLASH地址 * pByte: 數據緩沖區(2個字節) * ulSize: 數據大小 * 返 回 值: * FLASH_BSY = 1 忙 * FLASH_PGRM_FLR 編程錯誤 * FLASH_WRPRT_FLR 寫保護錯誤 * FLASH_PRC_DONE 操作結束 * FLASH_TIMEOU 超時 * ********************************************************************************************************* */ uint16_t bsp_FLASH_WriteBuffer(uint32_t ulFlashAddr, uint16_t *pByte, uint32_t ulSize) {uint16_t ulCnt;uint16_t sign = 0; //標志位if (ulFlashAddr < FLASH_BASE || ulFlashAddr + ulSize >= USER_FLASH_END_ADDRESS){return FLASH_PGRM_FLR;}if (ulSize == 0){return FLASH_PGRM_FLR;}/* FLASH 解鎖 */FLASH_Unlock();FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_PRCDN | FLASH_FLAG_PRGMFLR | FLASH_FLAG_WRPRTFLR | FLASH_FLAG_UOBFLR)sign = FLASH_ErasePage(STARTADDR); //擦除整頁if(sign != FLASH_PRC_DONE) //如果沒有擦除完成則返回return;for (ulCnt = 0; ulCnt < ulSize; ulCnt++){if (FLASH_ProgramHalfWord(ulFlashAddr, *pByte++) != FLASH_PRC_DONE){return FLASH_PGRM_FLR;}ulFlashAddr+=2;}/* FLASH加鎖,禁止寫FLASH控制寄存器 */FLASH_Lock();return FLASH_PRC_DONE; } 讀出數據程序 /* ********************************************************************************************************* * 函 數 名: bsp_FLASH_ReadBuffer * 功能說明: 讀取CPU Flash的內容 * 形 參: * ulFlashAddr: FLASH地址 * pByte: 數據緩沖區(2字節) * ulSize: 數據大小 * 返 回 值: 0.成功 1.失敗 ********************************************************************************************************* */ uint16_t bsp_FLASH_ReadBuffer(uint32_t ulFlashAddr, uint16_t *pByte, uint32_t ulSize) {uint16_t ulCnt;if (ulFlashAddr < FLASH_BASE || ulFlashAddr + ulSize >= USER_FLASH_END_ADDRESS){return FLASH_PGRM_FLR;}if (ulSize == 0){return 1;}for (ulCnt = 0; ulCnt < ulSize; ulCnt++){*(pByte++) = *(uint16_t *)ulFlashAddr;ulFlashAddr+=2;}return 0; }四、注意事項
1、每一次的讀寫操作都需要解鎖和上鎖,否則可能會造成MCU內地址的讀寫錯亂。
2、寫入數據之前需要擦除地址上的數據(每次擦除以整頁擦除為單位)
總結
以上是生活随笔為你收集整理的单片机之flash读写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决Windows无法加载中文(中国)-
- 下一篇: IMSettings 1.5.1 发布,