在我們應用開發時,經常會有一些程式執行引數需要儲存,如一些修正係數。這些資料的特點是:數量少而且不需要經常修改,但又不能定義為常量,因為每台裝置可能不一樣而且在以後還有修改的可能。將這類資料存在指定的位置,需要修改時直接修改儲存位置的數值,需要使用時則直接讀取,會是一種方便的做法。考慮到這些資料量比較少,使用專門的儲存單元既不經濟,也沒有必要,而stm32f103內部的flash容量較大,而且st的庫函式中還提供了基本的flash操作函式,實現起來也比較方便。
以大容量產品stm32f103ve為例,其flash容量達到512k,可以將其中一部分用作資料儲存。如下是大容量的flash組織模式:
根據上面的flash組織模式,我們可以根據自己的使用方便來作相應的定義。因為大容量每個扇區定義為2k,而小容量和中容量都定義為1k,所以我們做如下巨集定義:
按 ctrl+c 複製**
#define flash_size 512 //所選mcu的flash容量大小(單位為k)
#if flash_size<256
#define sector_size 1024 //位元組
#else
#define sector_size 2048 //位元組
#endif按 ctrl+c 複製**
雖然st的庫函式比較全面,但都是基本操作,為了使用方面,根據我們自己的需要對其進行再次封裝。
對於讀操作相對比較簡單,內建快閃儲存器模組可以在通用位址空間直接定址,就像讀取變數一樣。
按 ctrl+c 複製**
//從指定位址開始讀取多個資料
void flash_readmoredata(uint32_t startaddress,uint16_t *readdata,uint16_t counttoread)
flash_unlock(); //解鎖寫保護
uint32_t offsetaddress=startaddress-flash_base; //計算去掉0x08000000後的實際偏移位址
uint32_t sectorposition=offsetaddress/sector_size; //計算扇區位址,對於stm32f103vet6為0~255
uint32_t sectorstartaddress=sectorposition*sector_size+flash_base; //對應扇區的首位址
flash_erasepage(sectorstartaddress);//擦除這個扇區
uint16_t dataindex;
for(dataindex=0;dataindex按 ctrl+c 複製**
在擦除之前應該將頁面上的資料讀取出來與要寫入的資料合併,待擦除後再寫入,但這樣資料量很大(大容量是2k乙個扇區),所以考慮到是少量資料儲存,所以每次都將全部資料同時寫入,簡化操作,也減少資料處理量。經測試以上程式寫入和讀出資料均正確,可以實現內部flash的讀寫操作。需要更深入了解可以參考《stm32f10*** 快閃儲存器程式設計參考手冊》。
STM32F103內部定時器TIM
1 stm32f103內部定時器有哪些?stm32一共有8個通用16位timer,其中timer1和timer8是高階定時器,其它的timer2 timer7是普通定時器。此外還有乙個systick 系統滴答定時器 這個定時器通常在作業系統中作為系統的任務切換週期。還有乙個rtc,是乙個毫秒定時器,...
STM32F103內部FLASH及位址表
在我們應用開發時,經常會有一些程式執行引數需要儲存,如一些修正係數。這些資料的特點是 數量少而且不需要經常修改,但又不能定義為常量,因為每台裝置可能不一樣而且在以後還有修改的可能。將這類資料存在指定的位置,需要修改時直接修改儲存位置的數值,需要使用時則直接讀取,會是一種方便的做法。考慮到這些資料量比...
stm32f103外部中斷
void extix init void 外部中斷0服務程式 void exti9 5 irqhandler void 這是簡單的外部中斷的配置,pc7作為中斷輸入 上面補充io口的初始化 gpio initstructure.gpio mode gpio mode ipu pc6配置為快充指示 1...