stm32寫flash時候,注意必須是4字節(jié)對齊,這跟它的內(nèi)部接口是有關(guān)的。
最近在學STM32,要用到內(nèi)部flash存點數(shù)據(jù),一開始在網(wǎng)上看了很多例程,自己寫了一個,當?shù)絾纹瑱C中,一點反應沒有,于是又到網(wǎng)上看了又看,找啊找,發(fā)現(xiàn)這樣的讀寫內(nèi)部flash的軟件不多,而且說的也不是很明確(個人觀點),特地總結(jié)了一下,希望對剛學STM32的小伙伴有幫助。
注意:寫數(shù)據(jù)的地址(紅色字),如果你的boot1=x,boot0=0,那么你的啟動模式是用戶閃存存儲器,而這個用戶閃存存儲器的地址就是0x08000000。這個很重要!!!!!我用的是STM32F103VET6,下面是寫內(nèi)部flash的子程序: #include "flash.h"
#define STARTADDR 0x0807F800 //主存儲器第255頁首地址 volatileFLASH_Status FLASHStatus = FLASH_COMPLETE;
void ReadFlashNBtye(uint32_t ReadAddress, uint8_t *ReadBuf,int32_t ReadNum) { int DataNum= 0; ReadAddress = (uint32_t)STARTADDR +ReadAddress; while(DataNum < ReadNum) { *(ReadBuf + DataNum) =*(__IO uint8_t*) ReadAddress++; DataNum++; }
// return DataNum; }
void WriteFlashOneWord(uint32_t WriteAddress,uint32_tWriteData) { FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_BSY |FLASH_FLAG_EOP | FLASH_FLAG_PGERR |
FLASH_FLAG_WRPRTERR); FLASHStatus = FLASH_ErasePage(STARTADDR);//擦除一頁 FLASH_EraseAllPages():擦除全
// 部 FLASH 頁面 if(FLASHStatus ==FLASH_COMPLETE) { FLASHStatus= FLASH_ProgramWord(STARTADDR + WriteAddress, WriteData); }
FLASH_Lock();
}
函數(shù)調(diào)用:例:u8 Temp_Data[4] = { 0};
WriteFlashOneWord( 0 , 0x12345678 );delay_ms(10);
ReadFlashNBtye( 0 , Temp_Data , 4 ); delay_ms(10);
這樣數(shù)據(jù)就寫入了內(nèi)部flash,讀出時就放在了Temp_Data[4]中。
|