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

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

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

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

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