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