通过mtd读写flash_敏矽微电子Cortex-M0学习笔记11-FLASH存储器
學習筆記
1、FLASH存儲器簡介
ME32F030采用高可靠的嵌入式Flash 技術,64K用戶區間,支持 IAP/ISP Flash 擦寫技術。MCU Flash 采用 32 位數據總線讀寫,充分利用 32 位 ARM CPU 性能優勢,同時它的 512 字節小扇區結構,管理操作也更加靈活。Flash 存儲器支持的操作如下:
讀操作:
ARM CPU 可以通過讀指令直接從嵌入式 Flash 讀取數據,最高支持達 30MHz 的讀取速度。當 CPU 時鐘超過 Flash 的最大讀取速度時,需要插入延遲時鐘,延遲時鐘由 RDCYC 寄存器控制。
FLASH 擦寫操作:
Flash 擦寫采用扇區擦除,字(WORD)寫入模式,并通過一寄存器組實現。擦寫地址必須是 32 位對齊。擦除扇區流程如下:
①、向地址寄存器寫入要操作的FLASH地址。
②、發FLASH扇區擦除指令0x04。
③、判斷FLASH是否處于忙狀態,不處于忙狀態則流程結束。
字(WORD)編程的流程如下:
①、向地址寄存器寫入要操作的FLASH地址。
②、向數據寄存器寫入要編程的數據。
③、發FLASH扇區擦除指令0x02。
④、判斷FLASH是否處于忙狀態,不處于忙狀態則流程結束。
這里要注意的是如果要編程數據,一定要先進行擦除步驟,然后再向FLASH進行編程操作。否則直接執行編程流程是無效的。
2、FLASH寄存器
ME32F030的FLASH造作十分簡便。相對應的寄存器也較少。
圖1 FLASH寄存器列表
2-1 FLASH操作命令寄存器
該寄存器用來發 Flash 操作命令和讀 Flash 狀態。
圖2 FLASH操作命令寄存器
2-2 FLASH操作編程數據寄存器
該寄存器用于存儲對 Flash 編程的數據,這里有一點需要注意的要求,就是該數據必須在 Flash 操作命令發出之前準備好。并且編寫的數據是32位對齊的。
圖3 FALSH操作編程數據寄存器
2-3 FLASH操作地址寄存器
該寄存器存儲 Flash 操作地址。
圖4 FALSH操作地址寄存器
2-4 FLASH訪問周期寄存器
根據系統時鐘頻率不同,Flash 訪問速度可以配置 FLASH_RDCYC 寄存器來實現(該功能目前禁止使用)。
3、FLASH操作函數
3-1 FLASH擦除函數
該函數用于擦除指定地址段所在扇區的FLASH數據,從起始地址startaddr所在扇區開始擦除,直到結束地址endaddr所在扇區。
void EraseMCUDataMemory(uint32_t startaddr, uint32_t endaddr){//判斷是否到達結束地址while(startaddrADDR = startaddr; ?//FLASH擦除指令FMC->CMD = 0x04; ?//等待FLASH完成操作while ((FMC->CMD & 0x100)!=0);//地址偏移,開始下個地址的擦除startaddr+=512; ??}}3-2 FLASH數據編程
這個函數用于向指定的地址,寫入指定長度的數據。
Dataadd:要寫入的地址Size:要寫入的數據長度Suradd:要寫入的數據內容void SaveDatatoMCU(uint32_t dataadd, uint32_t size, uint32_t suradd){uint32_t n,temp0,temp1,temp2,*dataptr;temp1=size>>2;temp2=dataadd;dataptr=(uint32_t *)suradd;for (n=0;nADDR = temp2; ?? //寫入編程數據FMC->DATA = *dataptr++; ?//FLASH編程指令FMC->CMD = 0x02; ?? //等待FLASH完成操作while ((FMC->CMD & 0x100)!=0); ?//地址偏移,開始下個地址的編程temp2 +=4; ???????????}}3-3 FLASH讀取數據
這個函數用于從指定的地址,讀出指定長度的數據。
Dataadd:要讀取的地址Size:要讀取的數據長度Suradd:要讀取的數據內容void ReadDataFromMCU(uint32_t dataadd, uint32_t size, uint32_t* suradd){uint32_t n,temp1,*dataptr;uint32_t a = 0;temp1=size>>2;dataptr=(uint32_t *)suradd;for (n=0;n4、FLASH例程
接下來做個小實驗來測試下FLASH的擦寫和數據編程,我們向0x0000FC80地址寫入一組數據,隨后讀出校驗是否正確編程FLASH。
int main(void){uint32_t WriteData[4] = {0x12121212,0x34343434,0x56565656,0x78787878};uint32_t ReadData[4] ?= {0x00000000,0x00000000,0x00000000,0x00000000};uint32_t DataAddr = 0x0000FC80;uint32_t EndAddr = 0x0000FFFF;WDT->MOD=0;PB_9_INIT(PB_9_GPIO);GPIO_ConfigPinsAsOutput(PB, IO_PIN9); //擦除FLASHEraseMCUDataMemory(DataAddr,EndAddr);//向Data Addr寫入數據WriteDataSaveDatatoMCU(DataAddr, 16, WriteData);//讀出的數據存放到ReadData?ReadDataFromMCU(DataAddr, 16, ReadData);while (1){PB->NOT_b.NOT9=1;//小燈閃爍,提示程序運行SYS_DelaymS(500);}}程序編譯無誤后,便可以下載仿真測試。首先在如圖所示的位置打上斷點,然后全速運行。
圖5 實例運行1
運行到斷點處后,我們把WriteData和ReadData添加的WATCH1中觀察下,結果如圖所示,此時ReadData的數據全部都是0x000000000,與寫入的數據不一致,這是因為還沒有開始從FLASH中讀取。接下來按快捷鍵F10單步執行下讀取FLASH函數。
圖6 實例運行2
單步執行后的效果如圖所示,這時候數據已經從FLASH中讀取出來并存放到ReadData中,此時的數據已經和寫入的WriteData一致了。
圖7 實例運行3
總結
以上是生活随笔為你收集整理的通过mtd读写flash_敏矽微电子Cortex-M0学习笔记11-FLASH存储器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内温的整体优先效应实验_实验室通风与系统
- 下一篇: pyqt 子窗口控制主窗口绘图_实战Py