嵌入式技術(shù)及應(yīng)用(STM32CubeMX版)課件 任務(wù)19 讀寫Flash存儲(chǔ)器_第1頁
嵌入式技術(shù)及應(yīng)用(STM32CubeMX版)課件 任務(wù)19 讀寫Flash存儲(chǔ)器_第2頁
嵌入式技術(shù)及應(yīng)用(STM32CubeMX版)課件 任務(wù)19 讀寫Flash存儲(chǔ)器_第3頁
嵌入式技術(shù)及應(yīng)用(STM32CubeMX版)課件 任務(wù)19 讀寫Flash存儲(chǔ)器_第4頁
嵌入式技術(shù)及應(yīng)用(STM32CubeMX版)課件 任務(wù)19 讀寫Flash存儲(chǔ)器_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

任務(wù)19 讀寫Flash存儲(chǔ)器嵌入式技術(shù)及應(yīng)用(STM32CubeMX版)電子工業(yè)出版社任務(wù)要求STM32的串口1作異步通信口,波特率BR=115200bps,用來向計(jì)算機(jī)發(fā)送數(shù)據(jù),STM32上電后就將Flash存儲(chǔ)器中第255頁(地址范圍:0x0807F800~0x0807FFFF)的最開始的5個(gè)半字單元中的內(nèi)容讀出,并用串口1輸出至計(jì)算機(jī)中顯示。然后將0~4共5個(gè)數(shù)據(jù)寫入Flash存儲(chǔ)器的第255頁最開始的5個(gè)半字單元中,再將所寫入的數(shù)據(jù)讀出,并用串口輸出至計(jì)算機(jī)中顯示,核查讀寫Flash存儲(chǔ)器是否正確。知識(shí)儲(chǔ)備

1.STM32的Flash存儲(chǔ)器STM32F103片內(nèi)集成了32KB~512KB的FLASH存儲(chǔ)器,用來存放程序和用戶數(shù)據(jù),也可以用作用戶EEPROM。不同的STM32其FLASH容量不同,小容量產(chǎn)品的FLASH為32KB,中容量產(chǎn)品的FLASH為128KB,大容量產(chǎn)品的FLASH為512KB,互聯(lián)型產(chǎn)品的FLASH為256KB。STM32F103中各FLASH存儲(chǔ)器的組織詳見《STM32F10xxx參考手冊(cè)》P30~P32。STM32F103VET6為大容量產(chǎn)品,其FLASH存儲(chǔ)器的主存儲(chǔ)塊按照每頁2KB方式組織,地址范圍為0x08000000~0807FFFF,如下表所示。

1.STM32的Flash存儲(chǔ)器模塊名稱地址大小主存儲(chǔ)塊頁00x08000000-0x080007ff2KB頁10x08000800-0x08000fff2KB………頁2550x0807f800-0x0807ffff2KB信息塊系統(tǒng)存儲(chǔ)器0x1ffff000-0x1ffff7ff2KB選擇字節(jié)0x1ffff800-0x1ffff80f16B閃存存儲(chǔ)器接口寄存器FLASH_ACR0x40022000-0x400220034BFLASH_KEYR0x40022004-0x400220074BFLASH_OPTKEYR0x40022008-0x4002200b4BFLASH_SR0x4002200c-0x4002200f4BFLASH_CR0x40022010-0x400220134BFLASH_AR0x40022014-0x400220174B保留0x40022018-0x4002201b4BFLASH_OBR0x4002201c-0x4002201f4BFLASH_WRPR0x40022020-0x400220234B大容量產(chǎn)品的FLASH存儲(chǔ)器函數(shù)的用法(1)HAL_FLASH_Unlock()函數(shù)2.HAL庫中有關(guān)FLASH操作的函數(shù)原型HAL_StatusTypeDefHAL_FLASH_Unlock(void);功能解鎖FLASH存儲(chǔ)器。參數(shù)無返回值HAL的狀態(tài)。函數(shù)的用法(2)HAL_FLASH_Lock()函數(shù)原型HAL_StatusTypeDefHAL_FLASH_Lock(void);功能給FLASH存儲(chǔ)器上鎖。參數(shù)無返回值HAL的狀態(tài)。函數(shù)的用法(3)HAL_FLASH_Program()函數(shù)2.HAL庫中有關(guān)FLASH操作的函數(shù)原型HAL_StatusTypeDefHAL_FLASH_Program(uint32_tTypeProgram,uint32_tAddress,uint64_tData);功能將數(shù)據(jù)以半字、字或者雙字的方式寫入FLASH存儲(chǔ)器的指定的地址中。參數(shù)1TypeProgram:數(shù)據(jù)寫入的方式。取值如下:FLASH_TYPEPROGRAM_HALFWORD:半字,16位FLASH_TYPEPROGRAM_WORD:字,32位FLASH_TYPEPROGRAM_DOUBLEWORD:雙字,64位參數(shù)2Address:數(shù)據(jù)寫入的地址。要求所寫入的地址為有效地址,對(duì)于大容量的STM32F103而言,其值為0x08000000~0x0807ffff。參數(shù)3Data:所要寫入的數(shù)據(jù)。返回值HAL的狀態(tài)?!咀⒁狻吭谡{(diào)用HAL_FLASH_Program()函數(shù)之前需用HAL_FLASH_Unlock()解鎖FLASH存儲(chǔ)器,函數(shù)執(zhí)行結(jié)束后,需用HAL_FLASH_Lock()給FLASH存儲(chǔ)器上鎖。如果頁內(nèi)的內(nèi)容不為0,則在用HAL_FLASH_Program()函數(shù)向FLASH存儲(chǔ)器寫數(shù)之前需先擦除所訪問的頁?!九e例】將變量m中的數(shù)以半字方式寫入FLASH存儲(chǔ)器的wAddr地址處,其程序如下:HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,wAddr,m);(3)HAL_FLASH_Program()函數(shù)2.HAL庫中有關(guān)FLASH操作的函數(shù)函數(shù)的用法(4)HAL_FLASHEx_Erase()函數(shù)2.HAL庫中有關(guān)FLASH操作的函數(shù)原型HAL_StatusTypeDefHAL_FLASHEx_Erase(FLASH_EraseInitTypeDef*pEraseInit,uint32_t*PageError);功能擦除FLASH存儲(chǔ)器的指定頁或塊。參數(shù)1pEraseInit:包含擦除配置信息的FLASH_EraseInitTypeDef結(jié)構(gòu)體的指針。參數(shù)2PageError:包含出錯(cuò)頁上的配置信息的指針。返回值HAL的狀態(tài)。【說明】在調(diào)用HAL_FLASHEx_Erase()函數(shù)之前需用HAL_FLASH_Unlock()解鎖FLASH存儲(chǔ)器,函數(shù)執(zhí)行后,需用HAL_FLASH_Lock()給FLASH存儲(chǔ)器上鎖。2.HAL庫中有關(guān)FLASH操作的函數(shù)1)先定義一個(gè)FLASH_EraseInitTypeDef類型的結(jié)構(gòu)體變量fe和一個(gè)uint32_t型的變量PageErr,PageErr變量用來存放擦除出錯(cuò)誤時(shí)出錯(cuò)處的地址,fe變量用來存放擦除的相關(guān)參數(shù),如擦除的方式、擦除的頁首址、擦除的頁數(shù)等。FLASH_EraseInitTypeDef結(jié)構(gòu)體的定義如下:typedefstruct{uint32_tTypeErase;/*擦除類型*/uint32_tBanks;/*塊擦除時(shí)所要擦除的組,頁擦除時(shí)該成員無用*/uint32_tPageAddress;/*頁首址*/uint32_tNbPages;/*擦除的頁數(shù)*/

}FLASH_EraseInitTypeDef;HAL_FLASHEx_Erase()函數(shù)的使用方法2.HAL庫中有關(guān)FLASH操作的函數(shù)其中,TypeErase成員定義了擦除的類型,取值為FLASH_TYPEERASE_PAGES(頁擦除)、FLASH_TYPEERASE_MASSERASE(塊擦除)。2)對(duì)結(jié)構(gòu)體變量fe的各成員賦值3)按下列形式調(diào)用HAL_FLASHEx_Erase()函數(shù):HAL_FLASHEx_Erase(&fe,&PageErr);HAL_FLASHEx_Erase()函數(shù)的使用方法2.HAL庫中有關(guān)FLASH操作的函數(shù)擦除頁首址為addr的頁,其程序如下:HAL_StatusTypeDef ErasePage(uint32_taddr){HAL_StatusTypeDef res;FLASH_EraseInitTypeDef fe; //定義擦除初始化變量(結(jié)構(gòu)體變量)uint32_t PageErr; //PageErr擦除出錯(cuò)誤時(shí)存放出錯(cuò)處的地址fe.TypeErase=FLASH_TYPEERASE_PAGES;//擦除方式:頁擦除fe.PageAddress=addr; //設(shè)置擦除的頁首址fe.NbPages=1; //擦除1頁P(yáng)ageErr=0; //出錯(cuò)的地址為0res=HAL_FLASHEx_Erase(&fe,&PageErr); //擦除頁return res; //返回擦結(jié)果}舉例以絕對(duì)地址的方式直接從FLASH存儲(chǔ)器的地址單元中讀取存儲(chǔ)單元的內(nèi)容,讀取的方式可以是字節(jié)、半字或者字,其讀取的方法如下:data_8bit=*(__IOuint8_t*)Address;//讀1字節(jié)數(shù)據(jù)到data_8bit變量中data_16bit=*(__IOuint16_t*)Address;//讀半字的數(shù)據(jù)至data_16bit變量中data_32bit=*(__IOuint32_t*)Address;//讀1字的數(shù)據(jù)至daya_32bit變量中例如,從FLASH存儲(chǔ)器的0x0807f800地址處讀取16位數(shù)據(jù)(半字?jǐn)?shù)據(jù))到uint16_t型變量m中的程序如下:uint16_t m;m=*(__IOuint16_t*)0x0807f800;(1)讀FLASH存儲(chǔ)器的方法3.讀寫FLASH存儲(chǔ)器的方法假定存儲(chǔ)區(qū)中字節(jié)數(shù)據(jù)是以半字方式存儲(chǔ)的,從FLASH存儲(chǔ)器的255頁的offset偏移地址處以半字的方式讀取len個(gè)字節(jié)數(shù)據(jù),并存放至Buf所指向的緩沖區(qū)中,其程序如下:#defineRW_FLASH_PAGE_ADDR 0x0807f800 //FLASH存儲(chǔ)器的頁首址(第255頁)void ReadFlash(uint16_toffset,uint8_t*Buf,uint8_tlen){uint32_t rAddr;rAddr=RW_FLASH_PAGE_ADDR+offset; //讀數(shù)地址:頁首址+頁內(nèi)偏移地址while(len--){ *Buf++=*(__IOuint16_t*)(rAddr); /*按半字方式讀存儲(chǔ)單元的內(nèi)容*/ rAddr+=2; //地址加2}}3.讀寫FLASH存儲(chǔ)器的方法舉例1)先用HAL_FLASH_Unlock()函數(shù)解鎖FLASH;2)再HAL_FLASHEx_Erase()擦除FLASH存儲(chǔ)器中指定地址所在的頁;3)用HAL_FLASH_Program()函數(shù)將數(shù)據(jù)寫入FLASH存儲(chǔ)器中;4)最后用HAL_FLASH_Lock()函數(shù)鎖住FLASH。舉例將Buf所指向的緩沖器中的len個(gè)數(shù)據(jù)以半字的方式寫入FLASH存儲(chǔ)器第255頁中偏移地址為offset的存儲(chǔ)單元中,其程序如下:(2)寫FLASH存儲(chǔ)器的方法3.讀寫FLASH存儲(chǔ)器的方法#defineRW_FLASH_PAGE_ADDR 0x0807f800 //FLASH存儲(chǔ)器的頁首址(第255頁)void WriteFlash(uint16_toffset,uint8_t*Buf,uint8_tlen){uint8_t i;uint32_t wAddr;FLASH_EraseInitTypeDef fe; //擦除初始化變量3.讀寫FLASH存儲(chǔ)器的方法uint32_t PageErr; //擦除出錯(cuò)時(shí)出錯(cuò)處的地址fe.TypeErase=FLASH_TYPEERASE_PAGES; //擦除方式:頁擦除fe.PageAddress=RW_FLASH_PAGE_ADDR; //設(shè)置頁首址fe.NbPages=1; //擦除的頁數(shù):1頁P(yáng)ageErr=0; //出錯(cuò)頁賦初值:第0頁HAL_FLASH_Unlock(); //解鎖FLASH存儲(chǔ)器HAL_FLASHEx_Erase(&fe,&PageErr); //擦除頁wAddr=RW_FLASH_PAGE_ADDR+offset;//計(jì)算寫地址:頁首址+頁內(nèi)偏移地址for(i=0;i<len;i++) //寫len個(gè)數(shù)據(jù){

HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,wAddr+i*2,*Buf);/*半字方式寫數(shù)*/

Buf++; //指針下移至下一數(shù)據(jù)}HAL_FLASH_Lock(); //給FLASH存儲(chǔ)器上鎖}實(shí)現(xiàn)方法與步驟任務(wù)19的硬件電路:

1.搭建電路

2.生成硬件初始化代碼步驟任務(wù)19只是在任務(wù)9的基礎(chǔ)上增加了Flash存儲(chǔ)器的訪問操作,其初始化代碼與任務(wù)9中的初始化代碼相同,可以通過修改任務(wù)9的STM32CubeMX工程來形成任務(wù)19的STM32CubeMX工程,其生成過程如下:(1)在“D:\ex”文件夾中新建Task19子文件夾。(2)將任務(wù)9的STM32CubeMX工程文件Task9.ioc(位于“D:\ex\Task9”文件夾中)復(fù)制到Task19文件夾中,并將其改名為Task19.ioc。(3)雙擊Task19.ioc文件圖標(biāo),打開任務(wù)19的STM32CubeMX工程文件,然后在工程窗口中點(diǎn)擊“GENERATECODE”按鈕,生成Task19的Keil工程代碼。

3.編寫讀寫FLASH存儲(chǔ)器的應(yīng)用程序任務(wù)19中我們按照模塊化程序設(shè)計(jì)要求,用UserFlash.c、UserFlash.h和main.c等3個(gè)文件保存讀寫FLASH存儲(chǔ)器的應(yīng)用程序。步驟第1步:在D:\ex文件夾中新建User文件夾,然后將任務(wù)10中所編寫的Serial.c文件和Serial.h文件復(fù)制到D:\ex\User文件夾中。第2步:打開Keil工程,然后新建UserFlash.c文件,并將UserFlash.c文件保存到D:\ex\User文件夾中。其中UserFlash.c文件的內(nèi)容詳見鏈接。第3步:新建UserFlash.h文件,并將UserFlash.h文件保存到D:\ex\User文件夾中。其中UserFlash.h文件的內(nèi)容詳見鏈接。第4步:在Keil工程中新建User組,然后將D:\ex\User文件夾中的Serial.c文件和UserFlash.c文件添加至User組中。

3.編寫讀寫FLASH存儲(chǔ)器的應(yīng)用程序步驟第5步:在Keil工程的include路徑中添加“D:\ex\User”文件夾,該文件夾是Serial.h和UserFlash.h文件所在的文件夾。第6步:在main.c文件中編寫讀寫FLASH存儲(chǔ)器的應(yīng)用層程序,其代碼詳見鏈接。第7步:編譯調(diào)試程序直至程序正確無誤。

4.調(diào)試與下載程序步驟(1)連接仿真器和串口的USB線,并給開發(fā)板上電。(2)對(duì)程序進(jìn)行編

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論