STM32F4——FLASH快閃記憶體程式設計原理
一、簡介:
首先是對FLASH快閃記憶體的一個基本瞭解和認識。FLASH快閃記憶體分為多個模組。其中有:主儲存器、系統儲存器、OTP區域、選項位元組。現在主要認識的是有關主儲存器的相關結構,主儲存器分為了多個扇區,每個扇區都有相關位元組的儲存區域,通過扇區的方式來管理記憶體可以方便資料的儲存。
二、有關FLASH快閃記憶體的操作。
1、鎖定和解鎖操作:
為了對FLASH快閃記憶體資料做好一定的防護工作,需要在不必要操作快閃記憶體資料時鎖定快閃記憶體,同時在需要操作快閃記憶體資料時執行解鎖操作,相關庫函式;void FLASH_Unlock(void)和void FLASH_Lock(void);
2、寫操作:
根據寫入的資料長度的不同可以分為位元組、半字、字、雙字寫入。都分別提供了相應的函式。有關FLASH的寫入操作下邊還會做相關介紹。
3、擦除操作:
由於在向FLASH記憶體入資料之前先要保證FLASH中的資料時被擦除過的,所以在寫入操作之前需要進行擦除操作。擦除可以整個扇區的擦除也可以做整片的擦除。
4、讀操作。
對於讀可以直接通過語句return *(vu32*)faddr來返回地址的資料值。
三、對FLASH運用的相關程式碼分析。
1、寫操作:
void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite) { FLASH_Status status = FLASH_COMPLETE; u32 addrx=0; u32 endaddr=0; if(WriteAddr<STM32_FLASH_BASE||WriteAddr%4)return; //非法地址 FLASH_Unlock(); //解鎖 FLASH_DataCacheCmd(DISABLE);//FLASH擦除期間,必須禁止資料快取 addrx=WriteAddr; //寫入的起始地址 endaddr=WriteAddr+NumToWrite*4; //寫入的結束地址 if(addrx<0X1FFF0000) //只有主儲存區,才需要執行擦除操作!! { while(addrx<endaddr) //掃清一切障礙.(對非FFFFFFFF的地方,先擦除) { if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//有非0XFFFFFFFF的地方,要擦除這個扇區 { status=FLASH_EraseSector(STMFLASH_GetFlashSector(addrx),VoltageRange_3);//VCC=2.7~3.6V之間!! if(status!=FLASH_COMPLETE)break; //發生錯誤了 }else addrx+=4; } } if(status==FLASH_COMPLETE) { while(WriteAddr<endaddr)//寫資料 { if(FLASH_ProgramWord(WriteAddr,*pBuffer)!=FLASH_COMPLETE)//寫入資料 { break; //寫入異常 } WriteAddr+=4; pBuffer++; } } FLASH_DataCacheCmd(ENABLE); //FLASH擦除結束,開啟資料快取 FLASH_Lock();//上鎖 }
對於寫操作需要說明的是:由於資料寫入過程中資料要寫入的扇區必須是整個扇區都是被擦除的,所以有必要在擦除操作之前作出相應的判斷,遍歷扇區的地址是否是被全部擦除的,如果不是就需要對扇區做擦除操作。而且在寫的前後分別做解鎖和上鎖操作。
2、讀操作:
//讀取指定地址的半字(16位資料) u32 STMFLASH_ReadWord(u32 faddr) { return *(vu32*)faddr; } //從指定地址開始讀出指定長度的資料 void STMFLASH_Read(u32 ReadAddr,u32 *pBuffer,u32 NumToRead) { u32 i; for(i=0;i<NumToRead;i++) { pBuffer[i]=STMFLASH_ReadWord(ReadAddr);//讀取4個位元組. ReadAddr+=4;//偏移4個位元組. } }
四、總結:
對於FLASH的學習只是做了一個初步的認識,可以對其做一些基本的操作和運用,其中還有很大一部分沒有做相關認識,需要慢慢積累。這一段時間的學習總體感覺是:感覺學習過程是有很多的困難,但是還是在受著一個方向的吸引和強烈的好奇心,智慧裝置的運作和物聯網相關技術的應用和操作,下邊是一個瞭解到的一個人設計的一些有關家庭裝置,雖然有些簡易,但是卻感覺非常有意思!!還有很多東西需要去學習和慢慢積累,呵呵.....