在我們應用開發時,經常會有一些程序運行參數需要保存,如一些修正系數。這些數據的特點是:數量少而且不需要經常修改,但又不能定義為常量,因為每臺設備可能不一樣而且在以后還有修改的可能。將這類數據存在指定的位置,需要修改時直接修改存儲位置的數值,需要使用時則直接讀取,會是一種方便的做法。考慮到這些數據量比較少,使用專門的存儲單元既不經濟,也沒有必要,而STM32F103內部的Flash容量較大,而且ST的庫函數中還提供了基本的Flash操作函數,實現起來也比較方便。
以大容量產品STM32F103VE為例,其Flash容量達到512K,可以將其中一部分用作數據存儲。如下是大容量的Flash組織模式:
根據上面的Flash組織模式,我們可以根據自己的使用方便來作相應的定義。因為大容量每個扇區定義為2K,而小容量和中容量都定義為1K,所以我們做如下宏定義:
#define FLASH_SIZE 512 //所選MCU的FLASH容量大小(單位為K)
#if FLASH_SIZE<256
#define SECTOR_SIZE 1024 //字節
#else
#define SECTOR_SIZE 2048 //字節
#endif
雖然ST的庫函數比較全面,但都是基本操作,為了使用方面,根據我們自己的需要對其進行再次封裝。
對于讀操作相對比較簡單,內置閃存模塊可以在通用地址空間直接尋址,就像讀取變量一樣。
//從指定地址開始讀取多個數據
void FLASH_ReadMoreData(uint32_t startAddress,uint16_t *readData,uint16_t countToRead)
{
uint16_t dataIndex;
for(dataIndex=0;dataIndex { readData[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_t temp1,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_t startAddress,uint16_t *writeData,uint16_t countToWrite) { if(startAddress { return;//非法地址 } 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 { FLASH_ProgramHalfWord(startAddress+dataIndex*2,writeData[dataIndex]); } FLASH_Lock();//上鎖寫保護 } 在擦除之前應該將頁面上的數據讀取出來與要寫入的數據合并,待擦除后再寫入,但這樣數據量很大(大容量是2K一個扇區),所以考慮到是少量數據存儲,所以每次都將全部數據同時寫入,簡化操作,也減少數據處理量。經測試以上程序寫入和讀出數據均正確,可以實現內部Flash的讀寫操作。需要更深入了解可以參考《STM32F10xxx 閃存編程參考手冊》。
上一篇:STM32F103系列 PB4引腳問題
下一篇:STM32 Flash讀寫;Flash地址對應的存儲內容及方式
推薦閱讀
史海拾趣
隨著公司業務的不斷發展,益升華(Essentra)公司意識到海外市場的重要性。于是,公司開始積極拓展海外市場,通過設立海外分公司、與當地企業合作等方式,將產品推向全球。在拓展海外市場的過程中,益升華(Essentra)公司始終堅持品質第一的原則,贏得了海外客戶的信賴和好評。如今,公司的工業零部件全球網絡已覆蓋23個國家或地區,成為國際知名的塑料及金屬零部件生產商和銷售商。
隨著電子行業的快速發展,市場競爭日益激烈。Abbotec在面對市場變革時,果斷進行了戰略調整。公司加大了對新興技術的研發投入,同時優化了生產流程,降低了成本。這些措施使得Abbotec在激烈的市場競爭中保持了穩健的發展態勢。
隨著環保意識的提高,ECE公司積極響應環保號召,致力于推廣綠色環保理念。公司采用環保材料和生產工藝,減少廢棄物排放和能源消耗。同時,ECE公司還積極參與環保公益活動,宣傳環保知識,提高公眾的環保意識。這些努力使ECE公司成為電子行業中綠色環保的倡導者和實踐者。
自1981年成立以來,ECE公司始終將技術創新作為發展的核心驅動力。早期,公司專注于電子元器件的研發和生產,通過引進國際先進技術,并結合本地市場需求進行創新,成功推出了一系列具有競爭力的產品。隨著技術的不斷進步,ECE公司不斷加大研發投入,積極探索新的應用領域,逐漸成為電子行業的領軍企業。
隨著公司的發展,Avalon Photonics開始尋求國際合作,以進一步拓展市場。公司與歐洲一家知名的科研機構建立了戰略合作關系,共同研發新一代的光子學設備。這一合作不僅帶來了技術上的互補,也為Avalon打開了歐洲市場的大門。通過國際合作,Avalon的產品逐漸在國際市場上獲得認可,公司規模也逐步擴大。
隨著公司規模的擴大和市場份額的提升,C&T開始積極拓展海外市場。通過設立分支機構、參加國際展會等方式,C&T的產品逐漸打入國際市場,贏得了全球客戶的認可。同時,C&T還積極與海外企業開展合作,共同推動半導體技術的發展和應用。
一.過孔的基本概念 過孔(via)是多層PCB的重要組成部分之一,鉆孔的費用通常占PCB制板費用的30%到40%。簡單的說來,PCB上的每一個孔都可以稱之為過孔。從作用上看,過孔可以分成兩類:一是用作各層間的電氣連接;二是用作器件的... … 查看全部問答∨ |
請教大家: 我最近在調試cc1100,通了,但是必須在發送端延時30ms左右才能無誤的接受(通過串口顯示在PC上)。如果小于30ms的延時或則不延時就不能完整的接收數據。我測了一下,一次發送4字節需要40ms的時間。問題是收發之間的準備過程是怎樣的啊, ...… 查看全部問答∨ |
這個東西連續讀寫的話一定要按頁讀寫? 例如有一個uchar[8] 我從地址0x0d出開始寫,那么uchar[3-7]會寫到哪去? A:0x10-0x14 B:0x00-0x04 C:0x08-0x0b? 有精通這個的告訴我下啊,我這兩天得到的慘痛教訓是不一定選A… 查看全部問答∨ |
|
ZwOpenFile與ZwCreateFile有什么關系? 我寫一個驅動監控了所有的ZwCreateFile,一般的文件建立都可以攔截到,但一個應用的安裝程序在安裝文件時,卻監控不到?不知道是何道理?難道它沒有用zwcreatefile而用了zwopenfile?那么兩個函數之間有何關 ...… 查看全部問答∨ |
|
各位: 本人有大量單片機設計的畢業設計,可以提供給大家參考,內含大量全套單片機畢業設計,回帖即可下載!!!! 部分設計你需要回帖才能下載!!! 如果在下載過程中遇到任何問題,請聯系我們QQ:273546746 ...… 查看全部問答∨ |
|
各位大俠好!!!我想制作一個用筆記本無線遙控的智能車,配件有ATmega128最小系統板,減速電機,驅動器,還有XL03-232AP2-1無線收發模塊(兩個),XLUSB-TTL轉接器一個,現在小車基本上已經做好了,無線收發模塊也配置好了,但沒有接到小車上去, ...… 查看全部問答∨ |