STM32F103內部FLASH及位址表

2021-09-22 12:50:57 字數 2527 閱讀 6998

在我們應用開發時,經常會有一些程式執行引數需要儲存,如一些修正係數。這些資料的特點是:數量少而且不需要經常修改,但又不能定義為常量,因為每台裝置可能不一樣而且在以後還有修改的可能。將這類資料存在指定的位置,需要修改時直接修改儲存位置的數值,需要使用時則直接讀取,會是一種方便的做法。考慮到這些資料量比較少,使用專門的儲存單元既不經濟,也沒有必要,而stm32f103內部的flash容量較大,而且st的庫函式中還提供了基本的flash操作函式,實現起來也比較方便。

以大容量產品stm32f103ve為例,其flash容量達到512k,可以將其中一部分用作資料儲存。如下是大容量的flash組織模式:

根據上面的flash組織模式,我們可以根據自己的使用方便來作相應的定義。因為大容量每個扇區定義為2k,而小容量和中容量都定義為1k,所以我們做如下巨集定義:

#define flash_size 512 //所選mcu的flash容量大小(單位為k)

#if flash_size<256

#definesector_size 1024 //位元組

#else

#definesector_size 2048 //位元組

#endif

雖然st的庫函式比較全面,但都是基本操作,為了使用方面,根據我們自己的需要對其進行再次封裝。

對於讀操作相對比較簡單,內建快閃儲存器模組可以在通用位址空間直接定址,就像讀取變數一樣。

//從指定位址開始讀取多個資料

void flash_readmoredata(uint32_tstartaddress,uint16_t *readdata,uint16_t counttoread)

uint16_tdataindex;

for(dataindex=0;dataindexreaddata[dataindex]=flash_readhalfword(startaddress+dataindex*2);

//讀取指定位址的半字(16位資料)

uint16_t flash_readhalfword(uint32_t address)

return*(__io uint16_t*)address;

//讀取指定位址的全字(32位資料)

uint32_t flash_readword(uint32_t address)

uint32_ttemp1,temp2;

temp1=(__io uint16_t)address;

temp2=(__io uint16_t)(address+2);

return(temp2<<16)+temp1;

對於寫操作相對來說要複雜得多,寫操作包括對使用者資料的寫入和擦除。為了防止誤操作還有寫保護鎖。但這些基本的操作st的庫函式已經為我們寫好了,我們只需要呼叫即可。

stm32復位後,fpec模組是被保護的,只有在寫保護被解除後,我們才能操作相關暫存器。stm32快閃儲存器的程式設計每次必須寫入16位,任何不是半字的操作都會造成錯誤。如下圖是flash寫的過程:

stm32的flash在程式設計的時候,也必須要求其寫入位址的flash是被擦除了的(也就是其值必須是0xffff),否則無法寫入。flash的擦除要求必須整頁擦除,所以也必須整頁寫入,否則可能會丟失資料。如下圖是flash頁擦除過程:

如下為flash全擦除過程,

根據以上圖示我們便寫資料寫入函式如下:

//從指定位址開始寫入多個資料

void flash_writemoredata(uint32_tstartaddress,uint16_t *writedata,uint16_t counttowrite)

if(startaddress2)>=(flash_base+1024flash_size)))

return;//非法位址

flash_unlock(); //解鎖寫保護

uint32_toffsetaddress=startaddress-flash_base; //計算去掉0x08000000後的實際偏移位址

uint32_tsectorposition=offsetaddress/sector_size; //計算扇區位址,對於stm32f103vet6為0~255

uint32_tsectorstartaddress=sectorposition*sector_size+flash_base; //對應扇區的首位址

flash_erasepage(sectorstartaddress);//擦除這個扇區

uint16_tdataindex;

for(dataindex=0;dataindexflash_programhalfword(startaddress+dataindex*2,writedata[dataindex]);

flash_lock();//上鎖寫保護

原文:

STM32F103使用內部Flash儲存引數

在我們應用開發時,經常會有一些程式執行引數需要儲存,如一些修正係數。這些資料的特點是 數量少而且不需要經常修改,但又不能定義為常量,因為每台裝置可能不一樣而且在以後還有修改的可能。將這類資料存在指定的位置,需要修改時直接修改儲存位置的數值,需要使用時則直接讀取,會是一種方便的做法。考慮到這些資料量比...

STM32F103內部定時器TIM

1 stm32f103內部定時器有哪些?stm32一共有8個通用16位timer,其中timer1和timer8是高階定時器,其它的timer2 timer7是普通定時器。此外還有乙個systick 系統滴答定時器 這個定時器通常在作業系統中作為系統的任務切換週期。還有乙個rtc,是乙個毫秒定時器,...

stm32f103外部中斷

void extix init void 外部中斷0服務程式 void exti9 5 irqhandler void 這是簡單的外部中斷的配置,pc7作為中斷輸入 上面補充io口的初始化 gpio initstructure.gpio mode gpio mode ipu pc6配置為快充指示 1...