




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
實驗12——讀/寫內(nèi)部Flash卓越工程師培養(yǎng)系列本書獲深圳大學(xué)教材出版資助STM32F1開發(fā)標準教程01實驗內(nèi)容實驗內(nèi)容向STM32內(nèi)部Flash起始地址為0x0800C000的存儲空間寫入“0xFFFFFFFF,OXFFEEFEFF”,合計8節(jié)按下按鍵KEY2,向STM32內(nèi)部ash起始地址為0x0800C000的存儲空間寫入“0x76543210,0x89ABCDEF”,合計8字節(jié);按下按鍵KEY3,讀取STM32內(nèi)部Fash起始地址為0x800C000的存儲空間中的數(shù)據(jù),依次讀出8字節(jié)數(shù)據(jù)圖13-1所示是向STM32內(nèi)部Flash起始地址為0x0800C000的存儲空間寫入“0x76543210,0x89ABCDEF”的示意圖。按下按鍵KEY102實驗原理1.STM32的內(nèi)部Flash和內(nèi)部SRAMSTM32片內(nèi)自帶Flash和SRAM。Flash主要用于存儲程序。SRAM主要用于存儲程序運行過程中的中間變量,通常不同型號STM32的Flash和SRAM大小是不相同的。Flash存儲器又稱為閃存,它與EEPROM都是掉電后數(shù)據(jù)不丟失的存儲器,但是Flash的存儲容量普遍大于EEPROM。另外,F(xiàn)lash的編程原理是寫1時保持該位為1不變,寫0時將原先的1改寫為0,因此,編程之前必須將對應(yīng)的塊擦除,而擦除的過程就是向該塊所有位寫入1,而EEPROM可以按照單字節(jié)進行讀/寫。SRAM是靜態(tài)隨機存取存儲器,它是一種具有靜止存取功能的內(nèi)存,讀/寫速度都比Flash要快,但是掉電后數(shù)據(jù)會丟失,而且價格比Flash貴。2.STM32的內(nèi)部Flash簡介STM32的內(nèi)部Flash地址起始于0x08000000結(jié)束地址是0x08000000加上芯片實際的Flash大小,不同的芯片內(nèi)部Flash容量大小也不同最小的有16KB,最大的有512KB。STM32核心板使用的STM32芯片型號為STM32F103RCT6,其內(nèi)部Flash容量為256KB(0x40000B),因此,該芯片的內(nèi)部Flash地址范圍為0x08000000~0x0803FFFF。按照不同容量,存儲器組織成32個1K字節(jié)/頁(小容量)、128個1K字節(jié)/頁(中容量)128個2K字節(jié)/頁(互聯(lián)型)256個2K字節(jié)/頁(大容量)的主存儲器塊和一個信息塊,表13-1是大容量產(chǎn)品閃存模塊組織。由于STM32F103RCT6屬于大容量產(chǎn)品,而且內(nèi)部Flash只有256KB,因此,STM32F103RCT6的內(nèi)部Flash只有頁0~127有效每頁的長度為2KB。2.STM32的內(nèi)部Flash簡介STM32的內(nèi)部Flash由主存儲器、信息塊和閃存存儲器接口寄存器3部分組成。主存儲器除了可以存儲程序之外,還可以存儲常數(shù)類型的數(shù)據(jù),當然,也可以存儲掉電之后用戶依然需要使用的數(shù)據(jù),但是存儲地址一定要安排在程序存儲區(qū)之后,畢竟,對內(nèi)部Flash中的代碼區(qū)進行修改,會導(dǎo)致意想不到的后果產(chǎn)生,有可能會導(dǎo)致整個STM32系統(tǒng)崩潰。2.STM32的內(nèi)部Flash簡介信息塊由系統(tǒng)存儲器(0x1FFFFO00~0x1FFFF7FF)和選項字節(jié)(0x1FFFF800~0x1FFFF80F)組成。系統(tǒng)存儲器用于存放在系統(tǒng)存儲器自舉模式下的啟動程序代碼(BootLoader),當使用ISP方式下載程序時,就是由這個程序執(zhí)行的,該區(qū)域由芯片廠寫入BootLoader,然后鎖死,用戶是無法改變的。選項字節(jié)存儲芯片的配置信息和對主存儲塊的保護信息。閃存存儲器接口寄存器包括FLASH_ACR、FLASH_KEYR、FLASH_OPTKEYR、FLASH_SR、FLASH_CR、FLASH_AR、FLASH_OBR和FLASH_WRPR,這些寄存器主要用于控制內(nèi)部Flash的讀/寫、指示內(nèi)部Flash的狀態(tài)等。3.STM32啟動模式STM32有3種啟動模式,通過BOOTO和BOOT1引腳進行選擇,如表13-2所示。3啟動模式對應(yīng)3種存儲介質(zhì),分別是內(nèi)部Flash、系統(tǒng)存儲器和內(nèi)部SRAM。當BOOT=X、BOOT0=0時,STM32從內(nèi)部Flash啟動,也就是從0x08000000開始運行代碼,絕大多數(shù)情況下使用這種模式。當BOOT1=0BOOTO=1時,STM32從系統(tǒng)存儲器啟動:當BOOT1=1.BOOT0=1時,STM32從內(nèi)部SRAM啟動,這兩種模式主要用于調(diào)試。4.Flash編程過程Flash編程過程如圖13-2所示,下面對Flash的編程過程進行說明。(1)讀FLASH_CR的LOCK位,并判斷LOCK位是否為1。(2)如果LOCK位為1表示Flash已上鎖通過向FLASH→KEYR依次寫入0x45670123和0xCDEF89AB執(zhí)行解鎖操作。(3)如果LOCK位為0,表示Flash未上鎖,接著就可以執(zhí)行寫Flash操作。(4)在執(zhí)行寫Flash操作之前,還需要將FLASH_CR的PG位置為1,該位相當于編程操作使能位。(5)在指定的地址寫入字(4字節(jié))。4.Flash編程過程(6)檢查FLASH_SR的BSY位是否為1。(7)如果BSY位為1,即Flash正在執(zhí)行操作,繼續(xù)等待。(8)當Flash完成操作后,即BSY位為0,讀編程地址并檢查寫入的數(shù)據(jù)。需要特別注意的是,BSY位為1時,不能對任何寄存器執(zhí)行寫操作。5.Flash頁擦除過程Flash頁擦除過程如圖13-3所示,下面對Flash頁的擦除過程進行說明。(1)讀FLASH_CR的LOCK位,并判斷LOCK位是否為1。(2)如果LOCK位為1表示Flash已上鎖通過向FLASH→KEYR依次寫入0x45670123和0xCDEF89AB執(zhí)行解鎖操作。(3)如果LOCK位為0,表示Flash未上鎖,接著就可以執(zhí)行Flash頁擦除操作。(4)在執(zhí)行Flash頁擦除操作之前,還需要將FLASH_CR的PER位置為1,該位相當于頁擦除操作的使能位。5.Flash頁擦除過程(5)在FLASH_AR中選擇要擦除的頁。(6)將FLASH_CR的STRT位置為1,即執(zhí)行一次擦除操作。(7)檢查FLASH_SR的BSY位是否為1。(8)如果BSY位為1,即Flash正在執(zhí)行操作,繼續(xù)等待。(9)當Flash完成操作后,即BSY位為0,讀出并驗證被擦除頁的數(shù)據(jù)。6.Flash部分寄存器FLASH_ACR的結(jié)構(gòu)偏移地址和復(fù)位值如圖13-4所示對部分位的解釋說明如表13-3所示。1.閃存訪問控制寄存(FLASH_ACR)6.Flash部分寄存器FLASH_KEYR的結(jié)構(gòu)偏移地址和復(fù)位值如圖13-5所示對部分位的解釋說明如表13-4所示。2.FPEC鍵寄存器(FLASH_KEYR)6.Flash部分寄存器FLASH_OPTKEYR的結(jié)構(gòu)、偏移地址和復(fù)位值如圖13-6所示,對部分位的解釋說明如表13-5所示。3.閃存OPTKEY寄存器(FLASH_OPTKEYR)6.Flash部分寄存器FLASH_SR的結(jié)構(gòu)偏移地址和復(fù)位值如圖13-7所示,對部分的解釋說明如表13-6所示。4閃存狀態(tài)寄存器(FLASH_SR)6.Flash部分寄存器FLASH_CR的結(jié)構(gòu)、偏移地址和復(fù)位值如圖13-8所示,對部分位的解釋說明如表13-7所示。5閃存控制寄存器(FLASH_CR)6.Flash部分寄存器FLASH_AR的結(jié)構(gòu)、偏移地址和復(fù)位值如圖13-9所示,對部分位的解釋說明如表13-8所示。6.閃存地址寄存器(FLASH_AR)6.Flash部分寄存器FLASH_OBR的結(jié)構(gòu)偏移地址和復(fù)位值如圖13-10所示對部分位的解釋說明如表13-9所示。7.選項字節(jié)寄存器(FLASH_OBR)6.Flash部分寄存器FLASH_WRPR的結(jié)構(gòu)、偏移地址和復(fù)位值如圖13-11所示,對部分位的解釋說明如表13-10所示。8.寫保護寄存器(FLASH_WRPR)7.Flash部分固件庫函數(shù)FLASH_ProgramWord函數(shù)的功能是在指定地址編寫一個字。具體描述如表13-11所示。1.FLASH_ProgramWord7.Flash部分固件庫函數(shù)FLASH_Unlock函數(shù)的能是解鎖Flash編寫擦除控制器,通過向FLASH→KEYR和FLASH→CR寫入?yún)?shù)來實現(xiàn)。具體描述如表13-12所示。2.FLASH_Unlock7.Flash部分固件庫函數(shù)FLASH_ErasePage函數(shù)的功能是擦除一個Flash頁面,通過向FLASH→CR、FLASH→AR寫入?yún)?shù)來實現(xiàn)。具體描述如表13-13所示。3.FLASH_ErasePage7.Flash部分固件庫函數(shù)FLASH_Lock函數(shù)的功能是鎖定Flash編寫擦除控制器,通過向FLASH→CR寫入?yún)?shù)來實現(xiàn)。具體描述如表13-14所示。4.FLASH_Lock03實驗步驟步驟1:首先,將“D:STM32KeilTestlMaterial12讀寫內(nèi)部Flash實驗”文件夾復(fù)制到“D:STM32KeilTestProduct”文件夾中。然后,雙擊運行“D:STM32KeilTestProduct12讀寫內(nèi)部Flash實驗Project”文件夾中的STM32KeilPrjuvprojx,單擊工具欄中的按鈕。當BuildOutput欄出現(xiàn)FromELF:creatinghexfile時,表示已經(jīng)成功生成hex文件,出現(xiàn)0Error(s)Warning(s)表示編譯成功。最后,將axf文件下載到STM32的內(nèi)部Flash,觀察STM32核心板上的兩個LED是否交替閃爍。如果兩個LED交替閃爍,串口正常輸出字符串,表示原始工程是正確的,接著就可以進入下一步操作。復(fù)制并編譯原始工程步驟2:首先將“D:STM32KeilTestProduct\12讀寫內(nèi)部Flash實驗HWFlash”文件夾中的Flashc添加到HW分組,具體操作可參見2.3節(jié)步8然后,將“D:STM32KeilTestProduct12讀寫內(nèi)部Flash實驗HWFlash”路徑添加到IncludePaths欄具體操作可參見2.3節(jié)步驟11。添加Flash文件對步驟3:單擊
按鈕進行編譯,編譯結(jié)束后,在Proiect面板中,雙擊Flashc下的Flashh在Flashh文件的“包含頭文件”區(qū),添加代碼#include"DataTypeh”,然后在Flashh文件的“宏定義區(qū)添加Flash起始地址宏定義的代碼,如程序清單13-1所示。完善Flash.h文件步驟3:在Flashh文件的“API函數(shù)聲明”區(qū),添加如程序清單13-2所示的API函數(shù)聲明代碼InitFlash函數(shù)用于初始化Flash模塊,STM32FlashWriteWord函數(shù)用于寫內(nèi)部Flash,STM32FlashReadWord函數(shù)用于讀內(nèi)部Flash。完善Flash.h文件步驟4:在Flashc文件的“包含頭文件”區(qū),添加代碼#include"stm32f10x_confh",另外該模塊還使用了printf,因此還需要添加代碼#include"UART1.h”。在Flashc文件的“宏定義”區(qū),添加如程序清單13-3所示的宏定義代碼。FLASH_PAGE_SIZE是大容量STM32芯片1頁的大小2字節(jié)用十進制表示是2048字節(jié),用十六進制表示是0x0800字節(jié)。完善Flash.c文件步驟4:在Flashc文件的“內(nèi)部變量”區(qū),添加內(nèi)部變量的定義代碼,如程序清單13-4所示。s_arrFlashBuf數(shù)組用于存放1頁數(shù)據(jù),這里以字(32位)為單位,因此,s_arrFlashBuf數(shù)組大小為2048/4=512。完善Flash.c文件步驟4:在Flash.c文件的“內(nèi)部函數(shù)聲明”區(qū),添加內(nèi)部函數(shù)的聲明代碼,如程序清單13-5所示。ReadWord函數(shù)用于讀取內(nèi)部Flash指定地址的數(shù)據(jù),WriteWordNoCheck函數(shù)用于向內(nèi)部Flash寫入數(shù)據(jù),這兩個函數(shù)的數(shù)據(jù)均以字為單位。完善Flash.c文件步驟4:在Flash.c文件的“內(nèi)部函數(shù)實現(xiàn)”區(qū),添加內(nèi)部函數(shù)的實現(xiàn)代碼,如程序清單13-6所示。Flash.c文件的內(nèi)部靜態(tài)函數(shù)有兩個,下面按照順序?qū)@兩個函數(shù)中的語句進行解釋說明。(1)vu32等效于volatileunsignedint,在addr前加“(vu32*)”,就強制將addr轉(zhuǎn)換為指向以字(4字節(jié))為單位的數(shù)據(jù)地址,因此ReadWord函數(shù)的參數(shù)addr必須是4的倍數(shù)“*(vu32*)addr”表示取出addr地址存放的數(shù)據(jù),該數(shù)據(jù)以字為單位,長度為4字節(jié)。變量前帶volatile關(guān)鍵字,可以確保對該地址的穩(wěn)定訪問,比如第一條指令剛剛從addr地址讀取過數(shù)據(jù),如果后面的指令又需要讀取addr地址存放的數(shù)據(jù),編譯器優(yōu)化代碼之后就有可能只在第一條指令位置讀取一次,而添加volatile之后,編譯器就不會對addr的代碼進行優(yōu)化,每次都會讀取addr地址存放的數(shù)據(jù)。完善Flash.c文件步驟4:(2)通過FLASHProgramWord函數(shù)向內(nèi)部Flash寫入以字(4字節(jié))為單位的數(shù)據(jù)參數(shù)startAddr是內(nèi)部Flash待寫入?yún)^(qū)域的起始地址,pBuf是存放待寫入數(shù)據(jù)數(shù)組的起始地址numToWrite是待寫入數(shù)據(jù)的數(shù)量。由于大容量STM32芯片1頁的大小是2K字節(jié),即512個字,WriteWordNoCheck函數(shù)是以字為單位向內(nèi)部Flash寫入數(shù)據(jù),如果起始地址startAddi是500,待寫入數(shù)據(jù)的數(shù)量大于12,數(shù)據(jù)就會寫入下一頁,因此,WriteWordNoCheck函數(shù)不帶自檢查功能。完善Flash.c文件步驟4:在Flashc文件的“API函數(shù)實現(xiàn)”區(qū),添加IitFlash函數(shù)的實現(xiàn)代碼,如程序清單13-7所示。InitFlash函數(shù)用于初始化Flash模塊,因為沒有需要初始化的內(nèi)容,所以函數(shù)體留空即可,如果后續(xù)升級版有需要初始化的代碼,直接填入即可。但是,用戶在使用該模塊的時候依然要養(yǎng)成初始化Flash模塊的習(xí)慣,即在IitHardware函數(shù)中調(diào)用InitFlash。完善Flash.c文件步驟4:在Flashc文件的“API函數(shù)實現(xiàn)”區(qū)在itFlash函數(shù)實現(xiàn)區(qū)的后面添加STM32FlashWriteWord函數(shù)的實現(xiàn)代碼,如程序清單13-8所示。STM32FlashWriteWord函數(shù)從指定地址開始寫入指定長度的數(shù)據(jù),其中,參數(shù)startAddr是起始地址,該地址必須是4的倍數(shù),pBuf是待寫入內(nèi)部Flash的數(shù)據(jù)存放的地址,numToWrite是需要寫入的以字為單位的數(shù)據(jù)個數(shù)。下面對STM32FlashWriteWord函數(shù)進行解釋說明。(1)由于STM32核心板使用的STM32芯片型號為STM32F103RCT6其內(nèi)部Flash容量為256KB(0x40000B),因此,起始地址必須在0x08000000~0x0803FFFC范用內(nèi)。完善Flash.c文件步驟4:(2)通過STM32FlashWriteWord函數(shù)寫內(nèi)部Flash,需要調(diào)用FLASH_ProgramWord函數(shù)對內(nèi)部Flash進行編程,調(diào)用FLASH_ErasePage函數(shù)對內(nèi)部Fash進行頁擦除。編程和擦除操作都要先通過FLASH_Unlock函數(shù)進行解鎖操作,編程和擦除操作結(jié)束之后,還需要通過FLASH_Lock函數(shù)進行上鎖操作。(3)通過STM32FashReadWord函數(shù)讀出整頁內(nèi)容,并判斷該頁的每一位是否都為1,如果有些位為0就需要先通過FLASH_ErasePage函數(shù)擦除該頁,然后再通過WriteWordNoCheck寫數(shù)據(jù)到內(nèi)部Flash。如果該頁的所有位都為1,就不需要通過FLASHErasePage函數(shù)擦除該頁,直接通過WriteWordNoCheck寫數(shù)據(jù)到內(nèi)部Flash即可。完善Flash.c文件步驟4:(4)如果內(nèi)部Flash某頁已經(jīng)被擦除,即該頁全部位都為1,向該頁的某些存儲空間寫入新數(shù)據(jù),直接調(diào)用WriteWordNoCheck函數(shù)即可。但是,如果該頁已經(jīng)有數(shù)據(jù),假設(shè)該頁由A區(qū)域和B區(qū)域組成,需要向A區(qū)域?qū)懭胄聰?shù)據(jù)就需要通過STM32FlashReadWord函數(shù)讀出整頁數(shù)據(jù)到s_arrFlashBuf數(shù)組(實際上是STM32的SRAM)然后將新數(shù)據(jù)寫入SRAM的A區(qū)域,B區(qū)域的數(shù)據(jù)保持不變。在將更新之后的SRAM寫入該頁之前,要先通過FLASHErasePage函數(shù)進行頁擦除操作,執(zhí)行完頁擦除操作之后,再將更新之后的SRAM通過WriteWordNoCheck函數(shù)寫入該頁。(5)STM32FlashWriteWord函數(shù)還具有跨頁寫數(shù)據(jù)功能,通過變量pagePos指定當前寫入頁的編號。完善Flash.c文件步驟4:完善Flash.c文件步驟4:在Flashc文件的“API函數(shù)實現(xiàn)”區(qū),在STM32FlashWriteWord函數(shù)實現(xiàn)區(qū)的后面添加STM32FlashReadWord函數(shù)的實現(xiàn)代碼,如程序清單13-9所示。STM32FlashReadWord函數(shù)從指定地址開始讀出指定長度的數(shù)據(jù),其中,參數(shù)startAddr是起始地址,該地址必須是4的倍數(shù),pBuf是讀取到的數(shù)據(jù)存放的地址,numToRead是需要讀取的以字為單位的數(shù)據(jù)個數(shù)。完善Flash.c文件步驟5:首先在ProcKeyOne.c的“包含頭文件”區(qū)的最后,添加代碼#include"Flashh"。然后在ProcKeyOnec的“宏定義”區(qū)添加宏定義的代碼,如程序清單13-10所示。MAX_WR_LEN為數(shù)據(jù)最大寫入長度,F(xiàn)LASH_START_ADDR1為讀/寫內(nèi)部Flash的起始地址,BUF_SIZE為數(shù)組長度,將其定義為8,即8字節(jié)。完善ProcKeyOne.c文件步驟5:接下來在ProcKeyOne.c的“內(nèi)部變量”區(qū)定義兩個數(shù)組分別為BUF0_U32和BUF1_U32。第一個數(shù)組用于存放0xFFFFFFFF和OXFFFFFFFF,第二個數(shù)組用于存放0x76543210和0x89ABCDEF,這兩個數(shù)組分別通過KEY1和KEY2寫入內(nèi)部Flash,如程序清單13-11所示。完善ProcKeyOne.c文件步驟5:注釋掉ProcKeyOne.c文件中所有的printf語句,然后,在ProcKeyDownKey1、ProcKeyDownKey2和ProcKeyDownKey3函數(shù)中增加相應(yīng)的處理程序,如程序清單13-12所示。下面按照順序?qū)@3個函數(shù)中的語句進行解釋說明。(1)ProcKeyDownKey1函數(shù)用于處理按鍵KEY1按下事件,該函數(shù)調(diào)用STM32FlashWriteWord函數(shù),向起始地址為0x0800C000的存儲空間寫入0XFFFFFFFF和OXFFFFFFFF,共8字節(jié)。(2)ProcKeyDownKey2函數(shù)用于處理按鍵KEY2按下事件,該函數(shù)調(diào)用STM32FlashWriteWord函數(shù),向起始地址為0x0800C000的存儲空
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司簽訂試用合同范本
- 兼職美工合同范本
- 勞務(wù)合同范本西安
- 企業(yè)辦公裝修合同范本
- 個人出售工程煤炭合同范本
- 全款售房合同范本
- 2025年胚毒滅活苗項目規(guī)劃申請報告模板
- 2025年車輛專用照明、信號及其裝置項目申請報告模板
- 2025年安替比林項目規(guī)劃申請報告模板
- 2025年翻譯筆項目立項申請報告
- 教師師德和專業(yè)發(fā)展課件
- 服務(wù)器巡檢報告模版
- 2023年中國煤化工行業(yè)全景圖譜
- 2023年高中生物新教材人教版(2023年)必修二全冊教案
- 小學(xué)美術(shù) 四年級 人教版《造型?表現(xiàn)-色彩表現(xiàn)與創(chuàng)作》“色彩”單元美術(shù)作業(yè)設(shè)計《色彩的明與暗》《色彩的漸變》《色彩的情感》
- 中國心臟重癥鎮(zhèn)靜鎮(zhèn)痛專家共識專家講座
- 川教版七年級生命生態(tài)安全下冊第1課《森林草原火災(zāi)的危害》教案
- 護理人員心理健康
- 安全技術(shù)說明書粗苯
- 單招面試技巧范文
- 情報信息收集報知
評論
0/150
提交評論