




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、STM32中存儲區(qū)分為:隨機(jī)存取存儲器RAM和只讀存儲器ROM。 其中:RAM為常說的內(nèi)存,比如手機(jī)的2G內(nèi)存4G內(nèi)存等,就是程序跑起來的時候所占用的存儲空間,特點是掉電數(shù)據(jù)丟失。ROM為常說的硬盤,比如手機(jī)的64G和128G等,可以簡單的理解為硬盤的存儲空間,特點是掉電數(shù)據(jù)不丟失,所以又叫“非易失性存儲器件”。 ROM又包含:EEPROM和flash。作為ROM的一份子,flash的特點自然是掉電數(shù)據(jù)不丟失。但是,flash在STM32中比較重要,程序也是保存在這個地方,所以輕易不讓用戶進(jìn)行隨意的讀寫,以避免不必要的問題。1、STM32 FLASH操作流程Flash操作已經(jīng)屬于嵌入式設(shè)備中很
2、底層的操作了,直接對地址進(jìn)行存取,簡單描述,F(xiàn)lash操作大致需要以下流程:1、確定要寫入Flash的首地址(稍后介紹確定地址的方法)2、解鎖Flash3、對Flash進(jìn)行操作(寫入數(shù)據(jù))4、對Flash重新上鎖1.1 如何查找并選定要寫入Flash十六進(jìn)制地址值的方法要想選定安全的Flash地址進(jìn)行讀寫,可以根據(jù)自己的STM32 MCU型號,查找數(shù)據(jù)手冊,確定FLASH的地址區(qū)段,因為起始段會存儲代碼,所以一定要避開起始段,以避免數(shù)據(jù)錯誤。(我一般是根據(jù)Flash大小計算Flash的最末尾地址,往前推一段地址空間,在這里一般不會對代碼中的數(shù)據(jù)產(chǎn)生覆蓋等影響)我此次操作Flash使用的MCU是
3、STM32103C8T6,所以以該型號MCU為例進(jìn)行描述:在數(shù)據(jù)手冊中,可以看到STM32103C8T6的flash起始地址是0x0800 0000(如下圖所示),而STM32103C8T6的Flash大小為64K,可以計算出STM32103C8T6的Flash地址范圍是:0x0800 00000x0800 FFFF(計算方法參考另一篇博客:STM32內(nèi)存大小與地址的對應(yīng)關(guān)系以及計算方法)。這里選取0x0800 F000作為讀寫操作的起始地址,對于C8T6這款MCU,操作這個起始地址應(yīng)該算是很安全的范圍了。 主存儲器,該部分用來存放代碼和數(shù)據(jù)常數(shù)(如 const 類型的數(shù)據(jù))。對于大容量產(chǎn)品,
4、其被劃分為 256 頁,每頁 2K 字節(jié)。注意,小容量和中容量產(chǎn)品則每頁只有 1K 字節(jié)。從上圖可以看出主存儲器的起始地址就是 0X08000000, B0、B1 都接 GND 的時候,就是從 0X08000000開始運(yùn)行代碼的2、Flash基本知識點2.1 Flash容量Flash根據(jù)容量大小可以分為以下三種:1、小容量產(chǎn)品:Flash大小為1-32KB(STM32F10X_LD)2、中容量產(chǎn)品:Flash大小為64-128KB(STM32F10X_MD)3、大容量產(chǎn)品:Flash大小為256KB以上(STM32F10X_HD)2.2 ST庫對Flash操作的支持ST庫中對Flash操作主要
5、提供了以下幾類操作API函數(shù):1、Flash解鎖、鎖定函數(shù) void FLASH_Unlock(void);/解鎖函數(shù):在對Flash操作之前必須解鎖void FLASH_Lock(void);/鎖定函數(shù):同理,操作完Flash之后必須重新上鎖2、Flash寫操作函數(shù) FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);/32位字寫入函數(shù)FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);/16位半字寫入函數(shù)FLASH_Status F
6、LASH_ProgramOptionByteData(uint32_t Address, uint8_t Data);/用戶選擇字節(jié)寫入函數(shù) 注:這里需要說明,32 位字節(jié)寫入實際上是寫入的兩次 16 位數(shù)據(jù),寫完第一次后地址+2,這與我們前面講解的 STM32 閃存的編程每次必須寫入 16 位并不矛盾。寫入 8位實際也是占用的兩個地址了,跟寫入 16 位基本上沒啥區(qū)別。3、Flash擦除函數(shù) FLASH_Status FLASH_ErasePage(uint32_t Page_Address);FLASH_Status FLASH_EraseAllPages(void);FLASH_Stat
7、us FLASH_EraseOptionBytes(void);4、獲取Flash狀態(tài) FLASH_Status FLASH_GetStatus(void); 獲取Flash狀態(tài)函數(shù),主要是為了獲取Flash的狀態(tài),以便于根據(jù)狀態(tài)對Flash進(jìn)行操作。該函數(shù)返回值是通過枚舉類型定義的,在代碼中可以看到FLASH_Status類型定義如下(具體含義看注釋即可):
8、; typedef enum
9、0;
10、60; FLASH_BUSY = 1, /忙 &
11、#160; FLASH_ERROR_PG, /編程錯誤
12、160; FLASH_ERROR_WRP,
13、60; /寫保護(hù)錯誤 &
14、#160; FLASH_COMPLETE, /操作完成
15、160; FLASH_TIMEOUT /操作超時
16、; FLASH_Status;5、等待操作完成函數(shù) FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout); 注:在執(zhí)行閃存寫操作時,任何對閃存的讀操作都會鎖住總線,在寫操作完成后讀操作才能正確地進(jìn)行;既在進(jìn)行寫或擦除操作時,不能進(jìn)行代碼或數(shù)據(jù)的讀取操作。所以在每次操作之前,我們都要等待上一次操作完
17、成這次操作才能開始。根據(jù)ST庫提供的上述函數(shù),我們可以自己編寫Flash的讀寫操作代碼如下:3.1 先定義一個Flash操作的起始地址宏定義和Flash狀態(tài)指示標(biāo)志位#define STARTADDR 0x0800F000 /STM32F103C8T6適用volatile FLASH_Status FLASHStatus = FLASH_BUSY; /Flash操作狀態(tài)變量3.2 編寫各個讀寫函數(shù)/ Name: WriteFlashOneWord/ Function: 向內(nèi)部Flash寫入32位數(shù)據(jù)/ Input: WriteAddress:數(shù)據(jù)要寫入的目標(biāo)地址(偏移地址)/ WriteDat
18、a: 寫入的數(shù)據(jù)/void WriteFlashOneWord(uint32_t WriteAddress, uint32_t WriteData) FLASH_UnlockBank1(); FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); FLASHStatus = 1; /清空狀態(tài)指示標(biāo)志位 FLASHStatus = FLASH_ErasePage(STARTADDR); if(FLASHStatus = FLASH_COMPLETE) FLASHStatus = 1; /清空狀態(tài)指示標(biāo)志位
19、 FLASHStatus = FLASH_ProgramWord(STARTADDR+WriteAddress, WriteData); /flash.c 中API函數(shù) FLASHStatus = 1; /清空狀態(tài)指示標(biāo)志位 FLASH_LockBank1(); / Name: WriteFlashData/ Function: 向內(nèi)部Flash寫入數(shù)據(jù)/ Input: WriteAddress:數(shù)據(jù)要寫入的目標(biāo)地址(偏移地址)/ data: 寫入的數(shù)據(jù)首地址/ num: 寫入數(shù)據(jù)的個數(shù)/void WriteFlashData(uint32_t WriteAddress, uint8_t da
20、ta, uint32_t num) uint32_t i = 0; uint16_t temp = 0; FLASH_UnlockBank1(); /解鎖flash FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); FLASHStatus = 1; /清空狀態(tài)指示標(biāo)志位 FLASHStatus = FLASH_ErasePage(STARTADDR);/擦除整頁 if(FLASHStatus = FLASH_COMPLETE)/flash操作完成 FLASHStatus = 1; /清空狀態(tài)指示標(biāo)
21、志位 for(i=0; i<num; i+) temp = (uint16_t)datai; FLASHStatus = FLASH_ProgramHalfWord(STARTADDR+WriteAddress+i*2, temp);/寫入數(shù)據(jù) FLASHStatus = 1; /清空狀態(tài)指示標(biāo)志位 FLASH_LockBank1(); /鎖定flash / Name: ReadFlashNBtye/ Function: 從內(nèi)部Flash讀取N字節(jié)數(shù)據(jù)/ Input: ReadAddress:數(shù)據(jù)地址(偏移地址)/ ReadBuf:讀取到的數(shù)據(jù)存放位置指針/ ReadNum:讀取字節(jié)個數(shù)/ Output: 讀取的字節(jié)數(shù)/int
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 抖音商戶編導(dǎo)短視頻開頭吸引力制度
- 全球石油市場供需格局調(diào)整與價格走勢對能源市場供需預(yù)測技術(shù)的應(yīng)用研究報告
- 浙江省寧波市鎮(zhèn)海區(qū)仁愛中學(xué)2024-2025學(xué)年數(shù)學(xué)七年級第一學(xué)期期末質(zhì)量檢測試題含解析
- 貴州黔南經(jīng)濟(jì)學(xué)院《可摘局部義齒工藝技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江杭州上城區(qū)2025屆化學(xué)九年級第一學(xué)期期末達(dá)標(biāo)檢測試題含解析
- 2024-2025學(xué)年陜西省咸陽市秦嶺中學(xué)數(shù)學(xué)七年級第一學(xué)期期末達(dá)標(biāo)檢測模擬試題含解析
- 公路客運(yùn)行業(yè)2025年轉(zhuǎn)型升級與智能停車場建設(shè)研究報告
- 公路貨運(yùn)行業(yè)數(shù)字化轉(zhuǎn)型效率提升的關(guān)鍵瓶頸與突破路徑報告
- 共享出行市場共享出行市場潛力與2025年行業(yè)政策法規(guī)分析報告
- 國際合作與交流策略研究報告
- 水庫管理制度
- 《防爆安全管理》課件
- 華潤守正評標(biāo)專家考試試題及答案
- 濟(jì)南市天橋區(qū)2025年小學(xué)六年級第二學(xué)期小升初數(shù)學(xué)試卷含解析
- 2025年電子商務(wù)法律法規(guī)知識測試題及答案
- 2025年人教版小學(xué)五年級下冊奧林匹克數(shù)學(xué)競賽試卷(附參考答案)
- 四川阿壩州公開招聘社區(qū)工作者考試全真模擬測試帶答案2024年
- 2024年寧夏中衛(wèi)公開招聘社區(qū)工作者考試試題答案解析
- 遼寧省沈陽市皇姑區(qū)2025屆小升初全真模擬數(shù)學(xué)檢測卷含解析
- 居住權(quán)登記合同協(xié)議
- 人工智能與大數(shù)據(jù)融合-全面剖析
評論
0/150
提交評論