專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> STM32 >> 瀏覽文章

IAR環(huán)境下STM32+IAP方案的實(shí)現(xiàn)

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年09月15日   【字體:

--基于STM32F103ZET6UART通訊實(shí)現(xiàn)

 
、什么IAP,為什么要IAP
      IAP即為In Application Programming(在應(yīng)用中編程),一般情況下,STM32F10x系列芯片為主控制器的設(shè)備在出廠時(shí)就已經(jīng)使用J-Link仿真器將應(yīng)用代碼燒錄了,如果在設(shè)備使用過程中需要進(jìn)行應(yīng)用代碼更換、升級(jí)等操作的話,則可能需要將設(shè)備返回原廠拆解出來再使用J-Link重新燒錄代碼,這就增加了很多不必要的麻煩。站在用戶的角度來說,就是能讓用戶自己來更換設(shè)備里邊的代碼程序而廠家這邊只需要提供給用戶一個(gè)代碼文件即可。
      IAP卻能很好的解決掉這個(gè)難題,一片STM32芯片的Code(代碼)區(qū)內(nèi)一般只有一個(gè)用戶程序而IAP方案則是將代碼區(qū)劃分為兩部分,兩部分區(qū)域各存放一個(gè)程序,一個(gè)叫bootloader(引導(dǎo)加載程序),另一個(gè)user application(用戶應(yīng)用程序)。bootloader出廠時(shí)固定下來了,在需要變更user application時(shí)只需要通過觸發(fā)bootloader對(duì)userapplication擦除和重新寫入即可完成用戶應(yīng)用的更換。1-1所示
圖 1-1
      STM32F103ZET6的啟動(dòng)方式有三種:內(nèi)置FLASH啟動(dòng)、內(nèi)置SRAM啟動(dòng)、系統(tǒng)存儲(chǔ)器ROM啟動(dòng),通過BOOT0和BOOT1引腳設(shè)置可以選擇從哪中方式啟動(dòng),這里選擇內(nèi)置的FLASH啟動(dòng)。FLASH地址為0x08000000—0x0807ffff,512KB,這些都能從芯片數(shù)據(jù)手冊(cè)中直接得到。這里首要的一個(gè)問題是中斷的問題。正常情況下發(fā)生中斷的過程為:發(fā)生中斷(中斷請(qǐng)求)à中斷向量表查找中斷函數(shù)入口地址à跳轉(zhuǎn)到中斷函數(shù)à執(zhí)行中斷函數(shù)à中斷返回也就是說在STM32內(nèi)置的Flash中一個(gè)中斷向量表存放各個(gè)中斷服務(wù)函數(shù)的入口地址,內(nèi)置Flash的分配情況大致如下圖2-1
圖2-1
圖2-2
      STM32F10x有一個(gè)中斷向量表,這個(gè)中斷向量表存放在代碼開始部分的后4個(gè)字節(jié)處(即0x08000004),代碼開始的4個(gè)字節(jié)存放的是堆棧棧頂?shù)牡刂罚?/span>當(dāng)發(fā)生中斷后程序通過查找該表得到相應(yīng)的中斷服務(wù)程序入口地址,然后再跳到相應(yīng)的中斷服務(wù)程序中執(zhí)行。上電后從0x08000004處取出復(fù)位中斷向量的地址,然后跳轉(zhuǎn)到復(fù)位中斷程序的入口(標(biāo)號(hào)所示)執(zhí)行結(jié)束后跳轉(zhuǎn)到main函數(shù)中(標(biāo)號(hào)②所示)。在執(zhí)行main函數(shù)的過程中發(fā)生中斷,STM32強(qiáng)制PC指針指回中斷向量(標(biāo)號(hào)所示),從中斷向量表中找到相應(yīng)的中斷函數(shù)入口地址,跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)函數(shù)(標(biāo)號(hào)所示),執(zhí)行完中斷函數(shù)后返回到main函數(shù)中來(標(biāo)號(hào)所示)。
圖2-3
圖2-2
      對(duì)于步驟④⑤,網(wǎng)友認(rèn)為是:“在main執(zhí)行的過程中,如果CPU得到一個(gè)中斷請(qǐng)求,PC指針強(qiáng)制跳轉(zhuǎn)到地址0x08000004中斷向量表處,而不是新的中斷向量表,圖標(biāo)號(hào)所示,程序再根據(jù)我們設(shè)置的中斷向量表偏移量,跳轉(zhuǎn)對(duì)應(yīng)中斷源新的中斷服務(wù)程序,如圖標(biāo)號(hào)所示”。我對(duì)此的理解是:“當(dāng)發(fā)生中斷后,程序從0x08000004()處的中斷向量表中得到相應(yīng)的中斷服務(wù)函數(shù)入口地址,繼而跳轉(zhuǎn)相應(yīng)的中斷服務(wù)程序。但是舊的中斷向量列表里邊存放的是IAP程序中斷函數(shù)的入口地址,它是如何得到user程序中斷函數(shù)的入口地址?所以覺得此種說法是錯(cuò)誤的。當(dāng)發(fā)生中斷時(shí)PC指針強(qiáng)制會(huì)跳轉(zhuǎn)到0x08000004處”這種說法并沒有錯(cuò),只是忽略了后續(xù)的一些知識(shí)要點(diǎn)導(dǎo)致這個(gè)說法出現(xiàn)矛盾。
圖3-1
圖3-2
圖3-3
數(shù)據(jù)通過串口來傳輸文件常用的協(xié)議有XModem、YModem、ZModem這三種協(xié)議,在PC端使用這些協(xié)議傳輸文件只需要PC的超級(jí)終端或者終端工具SecureCRT即可,但是在STM32這邊的編程會(huì)增加一些困難(因?yàn)?/span>要先去讀懂、解析這些協(xié)議,在通過編程來實(shí)現(xiàn))。也可選擇自己定義一套簡(jiǎn)單的傳輸協(xié)議,同樣會(huì)有一些困難(因?yàn)?/span>要在PC進(jìn)行文件和串口編程)?傊不管通過什么辦法都行,只要能將xxx.bin文件數(shù)據(jù)通過串口全部發(fā)送到STM32并且STM32夠全部接收到這些數(shù)據(jù)并寫入Flash即可(我選擇后者,自定義傳輸協(xié)議并用VC進(jìn)行文件和串口編程)
關(guān)閉窗口