STM32存儲(chǔ)器知識(shí)的相關(guān)應(yīng)用“>STM32存儲(chǔ)器 — STM32存儲(chǔ)器知識(shí)的相關(guān)應(yīng)用
2、想操作Peripherals中Bit Band區(qū)地址為0x4000 0021字節(jié)的第7位
(可能是一個(gè)功能寄存器);
計(jì)算別名區(qū)對(duì)應(yīng)子地址:0x4200 0000+(21*32)+(7*4)=0x4200 02BC
所以,對(duì)0x4200 02BC的操作,就是對(duì)0x4000 0021字節(jié)的第7位進(jìn)行操作;
對(duì)比使用Bit Banding功能和直接訪問(wèn)Bit Band區(qū)域,如圖:
5 STM32的IAP
In Application Programming,在應(yīng)用編程。
5.1什么是IAP
IAP是In Application Programming的首字母縮寫(xiě),IAP是用戶自己的程序在運(yùn)行過(guò)程中對(duì)User Flash的部分區(qū)域進(jìn)行燒寫(xiě),目的是為了在產(chǎn)品發(fā)布后可以方便地通過(guò)預(yù)留的通信口對(duì)產(chǎn)品中的固件程序進(jìn)行更新升級(jí)。通常在用戶需要實(shí)現(xiàn)IAP功能時(shí),即用戶程序運(yùn)行中作自身的更新操作,需要在設(shè)計(jì)固件程序時(shí)編寫(xiě)兩個(gè)項(xiàng)目代碼,第一個(gè)項(xiàng)目程序不執(zhí)行正常的功能操作,而只是通過(guò)某種通信管道(如USB、USART)接收程序或數(shù)據(jù),執(zhí)行對(duì)第二部分代碼的更新;第二個(gè)項(xiàng)目代碼才是真正的功能代碼。這兩部分項(xiàng)目代碼都同時(shí)燒錄在User Flash中,當(dāng)芯片上電后,首先是第一個(gè)項(xiàng)目代碼開(kāi)始運(yùn)行,它作如下操作:
1)檢查是否需要對(duì)第二部分代碼進(jìn)行更新
2)如果不需要更新則轉(zhuǎn)到4)
3)執(zhí)行更新操作
4)跳轉(zhuǎn)到第二部分代碼執(zhí)行
第一部分代碼必須通過(guò)其它手段,如JTAG或ISP燒入;第二部分代碼可以使用第一部分代碼IAP功能燒入,也可以和第一部分代碼一道燒入,以后需要程序更新是再通過(guò)第一部分IAP代碼更新。
對(duì)于STM32來(lái)說(shuō),因?yàn)樗闹袛嘞蛄勘砦挥诔绦虼鎯?chǔ)器的最低地址區(qū),為了使第一部分代碼能夠正確地響應(yīng)中斷,通常會(huì)安排第一部分代碼處于Flash的開(kāi)始區(qū)域,而第二部分代碼緊隨其后。
在第二部分代碼開(kāi)始執(zhí)行時(shí),首先需要把CPU的中斷向量表映像到自己的向量表,然后再執(zhí)行其他的操作。
如果IAP程序被破壞,產(chǎn)品必須通過(guò)JTAG或ISP重新燒寫(xiě)程序,這是很麻煩并且非常耗費(fèi)時(shí)間和金錢(qián)的。針對(duì)這樣的需求,STM32在對(duì)Flash區(qū)域?qū)嵭凶x保護(hù)的同時(shí),自動(dòng)地對(duì)用戶Flash區(qū)的開(kāi)始4頁(yè)設(shè)置為寫(xiě)保護(hù),這樣可以有效地保證IAP程序(第一部分代碼)區(qū)域不會(huì)被意外地破壞。
如圖為IAP示意圖:
5.2設(shè)計(jì)自己獨(dú)特的IAP
IAP程序可以自己設(shè)計(jì),這樣能夠符合自身對(duì)在先下載的特殊需求。針對(duì)這一要求,本文進(jìn)行了一個(gè)IAP程序的結(jié)構(gòu)設(shè)計(jì),并已經(jīng)通過(guò)測(cè)試。
帶IAP的系統(tǒng)由兩個(gè)工程需要編寫(xiě),一個(gè)是IAP工程,一個(gè)User App工程。
設(shè)計(jì)將IAP程序放在0x0800 0000——0x0800 2000這段空間中,User App放在0x0800 2000之后的余下空間;
下面描述如何友好的處理著兩個(gè)工程之間程序運(yùn)行的關(guān)系,達(dá)到IAP這個(gè)功能:
1)
2)
3)
4)
5)
6)
以上6個(gè)步驟能夠保證IAP和User App之間的良好關(guān)系,實(shí)現(xiàn)STM32的IAP功能。
如圖所示:
5.3 IAP例程
IAP程序設(shè)計(jì)思路:
1)IAP程序設(shè)計(jì)放置在Flash的起始地址,當(dāng)用戶選擇從Main Flash memory啟動(dòng)時(shí),系統(tǒng)進(jìn)入了0x0800 0000地址,也就是進(jìn)入了IAP程序;
2)在IAP中,判斷UserApp程序是否有效(通過(guò)對(duì)標(biāo)志地址內(nèi)容的判斷),若有效則直接跳轉(zhuǎn)到UserApp程序地址0x08002000,也就是進(jìn)入了UserApp程序(跳轉(zhuǎn)到4));若UserApp程序標(biāo)志無(wú)效,則更新UserApp。
3)在IAP中,需要更新的UserApp程序數(shù)據(jù)來(lái)自于USART,將從USART接收到的數(shù)據(jù)寫(xiě)入到UserApp程序地址中去,達(dá)到更新UserApp程序的目的;當(dāng)UserApp程序完成更新之后,設(shè)置UserApp程序有效標(biāo)志,然后跳轉(zhuǎn)到UserApp程序地址0x08002000;
4)在UserApp程序中,可以實(shí)現(xiàn)系統(tǒng)功能;當(dāng)有需要IAP信號(hào)產(chǎn)生之后,首先設(shè)置UserApp程序?yàn)闊o(wú)效,然后跳轉(zhuǎn)到IAP程序首地址0x0800 0000,程序又進(jìn)入IAP(跳轉(zhuǎn)到2));
評(píng)論