![嵌入式技術(shù)及應(yīng)用(STM32CubeMX版)課件 任務(wù)19 讀寫(xiě)Flash存儲(chǔ)器_第1頁(yè)](http://file4.renrendoc.com/view11/M00/01/02/wKhkGWWT9lKAIDneAAF0abVXXzk160.jpg)
![嵌入式技術(shù)及應(yīng)用(STM32CubeMX版)課件 任務(wù)19 讀寫(xiě)Flash存儲(chǔ)器_第2頁(yè)](http://file4.renrendoc.com/view11/M00/01/02/wKhkGWWT9lKAIDneAAF0abVXXzk1602.jpg)
![嵌入式技術(shù)及應(yīng)用(STM32CubeMX版)課件 任務(wù)19 讀寫(xiě)Flash存儲(chǔ)器_第3頁(yè)](http://file4.renrendoc.com/view11/M00/01/02/wKhkGWWT9lKAIDneAAF0abVXXzk1603.jpg)
![嵌入式技術(shù)及應(yīng)用(STM32CubeMX版)課件 任務(wù)19 讀寫(xiě)Flash存儲(chǔ)器_第4頁(yè)](http://file4.renrendoc.com/view11/M00/01/02/wKhkGWWT9lKAIDneAAF0abVXXzk1604.jpg)
![嵌入式技術(shù)及應(yīng)用(STM32CubeMX版)課件 任務(wù)19 讀寫(xiě)Flash存儲(chǔ)器_第5頁(yè)](http://file4.renrendoc.com/view11/M00/01/02/wKhkGWWT9lKAIDneAAF0abVXXzk1605.jpg)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
任務(wù)19 讀寫(xiě)Flash存儲(chǔ)器嵌入式技術(shù)及應(yīng)用(STM32CubeMX版)電子工業(yè)出版社任務(wù)要求STM32的串口1作異步通信口,波特率BR=115200bps,用來(lái)向計(jì)算機(jī)發(fā)送數(shù)據(jù),STM32上電后就將Flash存儲(chǔ)器中第255頁(yè)(地址范圍:0x0807F800~0x0807FFFF)的最開(kāi)始的5個(gè)半字單元中的內(nèi)容讀出,并用串口1輸出至計(jì)算機(jī)中顯示。然后將0~4共5個(gè)數(shù)據(jù)寫(xiě)入Flash存儲(chǔ)器的第255頁(yè)最開(kāi)始的5個(gè)半字單元中,再將所寫(xiě)入的數(shù)據(jù)讀出,并用串口輸出至計(jì)算機(jī)中顯示,核查讀寫(xiě)Flash存儲(chǔ)器是否正確。知識(shí)儲(chǔ)備
1.STM32的Flash存儲(chǔ)器STM32F103片內(nèi)集成了32KB~512KB的FLASH存儲(chǔ)器,用來(lái)存放程序和用戶(hù)數(shù)據(jù),也可以用作用戶(hù)EEPROM。不同的STM32其FLASH容量不同,小容量產(chǎn)品的FLASH為32KB,中容量產(chǎn)品的FLASH為128KB,大容量產(chǎn)品的FLASH為512KB,互聯(lián)型產(chǎn)品的FLASH為256KB。STM32F103中各FLASH存儲(chǔ)器的組織詳見(jiàn)《STM32F10xxx參考手冊(cè)》P30~P32。STM32F103VET6為大容量產(chǎn)品,其FLASH存儲(chǔ)器的主存儲(chǔ)塊按照每頁(yè)2KB方式組織,地址范圍為0x08000000~0807FFFF,如下表所示。
1.STM32的Flash存儲(chǔ)器模塊名稱(chēng)地址大小主存儲(chǔ)塊頁(yè)00x08000000-0x080007ff2KB頁(yè)10x08000800-0x08000fff2KB………頁(yè)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庫(kù)中有關(guān)FLASH操作的函數(shù)原型HAL_StatusTypeDefHAL_FLASH_Unlock(void);功能解鎖FLASH存儲(chǔ)器。參數(shù)無(wú)返回值HAL的狀態(tài)。函數(shù)的用法(2)HAL_FLASH_Lock()函數(shù)原型HAL_StatusTypeDefHAL_FLASH_Lock(void);功能給FLASH存儲(chǔ)器上鎖。參數(shù)無(wú)返回值HAL的狀態(tài)。函數(shù)的用法(3)HAL_FLASH_Program()函數(shù)2.HAL庫(kù)中有關(guān)FLASH操作的函數(shù)原型HAL_StatusTypeDefHAL_FLASH_Program(uint32_tTypeProgram,uint32_tAddress,uint64_tData);功能將數(shù)據(jù)以半字、字或者雙字的方式寫(xiě)入FLASH存儲(chǔ)器的指定的地址中。參數(shù)1TypeProgram:數(shù)據(jù)寫(xiě)入的方式。取值如下:FLASH_TYPEPROGRAM_HALFWORD:半字,16位FLASH_TYPEPROGRAM_WORD:字,32位FLASH_TYPEPROGRAM_DOUBLEWORD:雙字,64位參數(shù)2Address:數(shù)據(jù)寫(xiě)入的地址。要求所寫(xiě)入的地址為有效地址,對(duì)于大容量的STM32F103而言,其值為0x08000000~0x0807ffff。參數(shù)3Data:所要寫(xiě)入的數(shù)據(jù)。返回值HAL的狀態(tài)?!咀⒁狻吭谡{(diào)用HAL_FLASH_Program()函數(shù)之前需用HAL_FLASH_Unlock()解鎖FLASH存儲(chǔ)器,函數(shù)執(zhí)行結(jié)束后,需用HAL_FLASH_Lock()給FLASH存儲(chǔ)器上鎖。如果頁(yè)內(nèi)的內(nèi)容不為0,則在用HAL_FLASH_Program()函數(shù)向FLASH存儲(chǔ)器寫(xiě)數(shù)之前需先擦除所訪問(wèn)的頁(yè)?!九e例】將變量m中的數(shù)以半字方式寫(xiě)入FLASH存儲(chǔ)器的wAddr地址處,其程序如下:HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,wAddr,m);(3)HAL_FLASH_Program()函數(shù)2.HAL庫(kù)中有關(guān)FLASH操作的函數(shù)函數(shù)的用法(4)HAL_FLASHEx_Erase()函數(shù)2.HAL庫(kù)中有關(guān)FLASH操作的函數(shù)原型HAL_StatusTypeDefHAL_FLASHEx_Erase(FLASH_EraseInitTypeDef*pEraseInit,uint32_t*PageError);功能擦除FLASH存儲(chǔ)器的指定頁(yè)或塊。參數(shù)1pEraseInit:包含擦除配置信息的FLASH_EraseInitTypeDef結(jié)構(gòu)體的指針。參數(shù)2PageError:包含出錯(cuò)頁(yè)上的配置信息的指針。返回值HAL的狀態(tài)?!菊f(shuō)明】在調(diào)用HAL_FLASHEx_Erase()函數(shù)之前需用HAL_FLASH_Unlock()解鎖FLASH存儲(chǔ)器,函數(shù)執(zhí)行后,需用HAL_FLASH_Lock()給FLASH存儲(chǔ)器上鎖。2.HAL庫(kù)中有關(guān)FLASH操作的函數(shù)1)先定義一個(gè)FLASH_EraseInitTypeDef類(lèi)型的結(jié)構(gòu)體變量fe和一個(gè)uint32_t型的變量PageErr,PageErr變量用來(lái)存放擦除出錯(cuò)誤時(shí)出錯(cuò)處的地址,fe變量用來(lái)存放擦除的相關(guān)參數(shù),如擦除的方式、擦除的頁(yè)首址、擦除的頁(yè)數(shù)等。FLASH_EraseInitTypeDef結(jié)構(gòu)體的定義如下:typedefstruct{uint32_tTypeErase;/*擦除類(lèi)型*/uint32_tBanks;/*塊擦除時(shí)所要擦除的組,頁(yè)擦除時(shí)該成員無(wú)用*/uint32_tPageAddress;/*頁(yè)首址*/uint32_tNbPages;/*擦除的頁(yè)數(shù)*/
}FLASH_EraseInitTypeDef;HAL_FLASHEx_Erase()函數(shù)的使用方法2.HAL庫(kù)中有關(guān)FLASH操作的函數(shù)其中,TypeErase成員定義了擦除的類(lèi)型,取值為FLASH_TYPEERASE_PAGES(頁(yè)擦除)、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庫(kù)中有關(guān)FLASH操作的函數(shù)擦除頁(yè)首址為addr的頁(yè),其程序如下: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;//擦除方式:頁(yè)擦除fe.PageAddress=addr; //設(shè)置擦除的頁(yè)首址fe.NbPages=1; //擦除1頁(yè)P(yáng)ageErr=0; //出錯(cuò)的地址為0res=HAL_FLASHEx_Erase(&fe,&PageErr); //擦除頁(yè)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.讀寫(xiě)FLASH存儲(chǔ)器的方法假定存儲(chǔ)區(qū)中字節(jié)數(shù)據(jù)是以半字方式存儲(chǔ)的,從FLASH存儲(chǔ)器的255頁(yè)的offset偏移地址處以半字的方式讀取len個(gè)字節(jié)數(shù)據(jù),并存放至Buf所指向的緩沖區(qū)中,其程序如下:#defineRW_FLASH_PAGE_ADDR 0x0807f800 //FLASH存儲(chǔ)器的頁(yè)首址(第255頁(yè))void ReadFlash(uint16_toffset,uint8_t*Buf,uint8_tlen){uint32_t rAddr;rAddr=RW_FLASH_PAGE_ADDR+offset; //讀數(shù)地址:頁(yè)首址+頁(yè)內(nèi)偏移地址while(len--){ *Buf++=*(__IOuint16_t*)(rAddr); /*按半字方式讀存儲(chǔ)單元的內(nèi)容*/ rAddr+=2; //地址加2}}3.讀寫(xiě)FLASH存儲(chǔ)器的方法舉例1)先用HAL_FLASH_Unlock()函數(shù)解鎖FLASH;2)再HAL_FLASHEx_Erase()擦除FLASH存儲(chǔ)器中指定地址所在的頁(yè);3)用HAL_FLASH_Program()函數(shù)將數(shù)據(jù)寫(xiě)入FLASH存儲(chǔ)器中;4)最后用HAL_FLASH_Lock()函數(shù)鎖住FLASH。舉例將Buf所指向的緩沖器中的len個(gè)數(shù)據(jù)以半字的方式寫(xiě)入FLASH存儲(chǔ)器第255頁(yè)中偏移地址為offset的存儲(chǔ)單元中,其程序如下:(2)寫(xiě)FLASH存儲(chǔ)器的方法3.讀寫(xiě)FLASH存儲(chǔ)器的方法#defineRW_FLASH_PAGE_ADDR 0x0807f800 //FLASH存儲(chǔ)器的頁(yè)首址(第255頁(yè))void WriteFlash(uint16_toffset,uint8_t*Buf,uint8_tlen){uint8_t i;uint32_t wAddr;FLASH_EraseInitTypeDef fe; //擦除初始化變量3.讀寫(xiě)FLASH存儲(chǔ)器的方法uint32_t PageErr; //擦除出錯(cuò)時(shí)出錯(cuò)處的地址fe.TypeErase=FLASH_TYPEERASE_PAGES; //擦除方式:頁(yè)擦除fe.PageAddress=RW_FLASH_PAGE_ADDR; //設(shè)置頁(yè)首址fe.NbPages=1; //擦除的頁(yè)數(shù):1頁(yè)P(yáng)ageErr=0; //出錯(cuò)頁(yè)賦初值:第0頁(yè)HAL_FLASH_Unlock(); //解鎖FLASH存儲(chǔ)器HAL_FLASHEx_Erase(&fe,&PageErr); //擦除頁(yè)wAddr=RW_FLASH_PAGE_ADDR+offset;//計(jì)算寫(xiě)地址:頁(yè)首址+頁(yè)內(nèi)偏移地址for(i=0;i<len;i++) //寫(xiě)len個(gè)數(shù)據(jù){
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,wAddr+i*2,*Buf);/*半字方式寫(xiě)數(shù)*/
Buf++; //指針下移至下一數(shù)據(jù)}HAL_FLASH_Lock(); //給FLASH存儲(chǔ)器上鎖}實(shí)現(xiàn)方法與步驟任務(wù)19的硬件電路:
1.搭建電路
2.生成硬件初始化代碼步驟任務(wù)19只是在任務(wù)9的基礎(chǔ)上增加了Flash存儲(chǔ)器的訪問(wèn)操作,其初始化代碼與任務(wù)9中的初始化代碼相同,可以通過(guò)修改任務(wù)9的STM32CubeMX工程來(lái)形成任務(wù)19的STM32CubeMX工程,其生成過(guò)程如下:(1)在“D:\ex”文件夾中新建Task19子文件夾。(2)將任務(wù)9的STM32CubeMX工程文件Task9.ioc(位于“D:\ex\Task9”文件夾中)復(fù)制到Task19文件夾中,并將其改名為T(mén)ask19.ioc。(3)雙擊Task19.ioc文件圖標(biāo),打開(kāi)任務(wù)19的STM32CubeMX工程文件,然后在工程窗口中點(diǎn)擊“GENERATECODE”按鈕,生成Task19的Keil工程代碼。
3.編寫(xiě)讀寫(xiě)FLASH存儲(chǔ)器的應(yīng)用程序任務(wù)19中我們按照模塊化程序設(shè)計(jì)要求,用UserFlash.c、UserFlash.h和main.c等3個(gè)文件保存讀寫(xiě)FLASH存儲(chǔ)器的應(yīng)用程序。步驟第1步:在D:\ex文件夾中新建User文件夾,然后將任務(wù)10中所編寫(xiě)的Serial.c文件和Serial.h文件復(fù)制到D:\ex\User文件夾中。第2步:打開(kāi)Keil工程,然后新建UserFlash.c文件,并將UserFlash.c文件保存到D:\ex\User文件夾中。其中UserFlash.c文件的內(nèi)容詳見(jiàn)鏈接。第3步:新建UserFlash.h文件,并將UserFlash.h文件保存到D:\ex\User文件夾中。其中UserFlash.h文件的內(nèi)容詳見(jiàn)鏈接。第4步:在Keil工程中新建User組,然后將D:\ex\User文件夾中的Serial.c文件和UserFlash.c文件添加至User組中。
3.編寫(xiě)讀寫(xiě)FLASH存儲(chǔ)器的應(yīng)用程序步驟第5步:在Keil工程的include路徑中添加“D:\ex\User”文件夾,該文件夾是Serial.h和UserFlash.h文件所在的文件夾。第6步:在main.c文件中編寫(xiě)讀寫(xiě)FLASH存儲(chǔ)器的應(yīng)用層程序,其代碼詳見(jiàn)鏈接。第7步:編譯調(diào)試程序直至程序正確無(wú)誤。
4.調(diào)試與下載程序步驟(1)連接仿真器和串口的USB線,并給開(kāi)發(fā)板上電。(2)對(duì)程序進(jìn)行編
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)療器械工程居間合同范本
- 施工電梯布置專(zhuān)項(xiàng)方案
- 食品安全風(fēng)險(xiǎn)評(píng)估與管理技術(shù)作業(yè)指導(dǎo)書(shū)
- 承包山林合同書(shū)
- 市場(chǎng)營(yíng)銷(xiāo)策略制定與實(shí)施作業(yè)指導(dǎo)書(shū)
- 停車(chē)場(chǎng)管理服務(wù)合同
- 住房和城鄉(xiāng)建設(shè)委員會(huì)
- 林業(yè)經(jīng)濟(jì)管理與政策作業(yè)指導(dǎo)書(shū)
- 雞舍租賃合同
- 技術(shù)服務(wù)合同格式
- 關(guān)于進(jìn)行小區(qū)第一屆業(yè)主委員會(huì)選舉投票的公告
- 2023年山西國(guó)際能源集團(tuán)有限公司招聘筆試題庫(kù)及答案解析
- YC/T 295-2009卷煙制造過(guò)程能力測(cè)評(píng)導(dǎo)則
- 仁愛(ài)英語(yǔ)八年級(jí)閱讀理解測(cè)試題和答案
- 山東省中考物理總復(fù)習(xí) 八上 第4講 光現(xiàn)象
- DB11∕T 1875-2021 市政工程施工安全操作規(guī)程
- 心肺康復(fù)完整版本課件
- 傳統(tǒng)節(jié)日春節(jié)英文介紹課件
- 質(zhì)量獎(jiǎng)現(xiàn)場(chǎng)評(píng)審問(wèn)題集錦精編版
- 裝配式結(jié)構(gòu)技術(shù)課程教學(xué)大綱
- 水資源論證報(bào)告
評(píng)論
0/150
提交評(píng)論