娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

一、什么是IAP,為什么要IAP


IAP即為In Application Programming(在應用中編程),一般情況下,以STM32F10x系列芯片為主控制器的設備在出廠時就已經使用J-Link仿真器將應用代碼燒錄了,如果在設備使用過程中需要進行應用代碼的更換、升級等操作的話,則可能需要將設備返回原廠并拆解出來再使用J-Link重新燒錄代碼,這就增加了很多不必要的麻煩。站在用戶的角度來說,就是能讓用戶自己來更換設備里邊的代碼程序而廠家這邊只需要提供給用戶一個代碼文件即可。


而IAP卻能很好的解決掉這個難題,一片STM32芯片的Code(代碼)區內一般只有一個用戶程序。而IAP方案則是將代碼區劃分為兩部分,兩部分區域各存放一個程序,一個叫bootloader(引導加載程序),另一個較user application(用戶應用程序)。bootloader在出廠時就固定下來了,在需要變更user application時只需要通過觸發bootloader對userapplication的擦除和重新寫入即可完成用戶應用的更換。如圖1-1所示

圖 1-1


在程序執行初始進入bootloader,在bootloader里面檢測條件是否被觸發(可通過按鍵是否被按下、串口是否接收到特定的數據、U盤是否插入等等),如果有則進行對user application進行擦除和重新寫入操作,如果沒有則直接跳轉到user application執行應用;如果有則進行擦除用戶代碼并重新寫入新的用戶代碼。


二、STM32F103ZET6硬件條件


STM32F103ZET6的啟動方式有三種:內置FLASH啟動、內置SRAM啟動、系統存儲器ROM啟動,通過BOOT0和BOOT1引腳的設置可以選擇從哪中方式啟動,這里選擇內置的FLASH啟動。其FLASH的地址為0x08000000—0x0807ffff,共512KB,這些都能從芯片數據手冊中直接得到。而這里首要的一個問題是中斷的問題。正常情況下發生中斷的過程為:發生中斷(中斷請求)à到中斷向量表查找中斷函數入口地址à跳轉到中斷函數à執行中斷函數à中斷返回。也就是說在STM32的內置的Flash中有一個中斷向量表來存放各個中斷服務函數的入口地址,內置Flash的分配情況大致如下圖2-1。

圖2-1


在只有一個程序的情況下,程序執行的走向應該如圖2-2所示(借用網友的原圖)。

圖2-2


STM32F10x有一個中斷向量表,這個中斷向量表存放在代碼開始部分的后4個字節處(即0x08000004),代碼開始的4個字節存放的是堆棧棧頂的地址,當發生中斷后程序通過查找該表得到相應的中斷服務程序入口地址,然后再跳到相應的中斷服務程序中執行。上電后從0x08000004處取出復位中斷向量的地址,然后跳轉到復位中斷程序的入口(標號①所示),執行結束后跳轉到main函數中(標號②所示)。在執行main函數的過程中發生中斷,則STM32強制將PC指針指回中斷向量表處(標號③所示),從中斷向量表中找到相應的中斷函數入口地址,跳轉到相應的中斷服務函數(標號④所示),執行完中斷函數后再返回到main函數中來(標號⑤所示)。


若在STM32F103x中使用IAP方案,則內置的Flash分配情況大致如下圖2-3。



圖2-3


在內置的Flash里面添加一個BootLoader程序,BootLoader程序和userapplication各有一個中斷向量表,假設BootLoader程序占用的空間為N+M字節,則程序的走向應該如圖2-2所示(借用網友的原圖并做改動,其中虛線部分為原圖步驟④⑤的走向,本人改為指向灰色部分)。


圖2-2


上電初始程序依然從0x08000004處取出復位中斷向量地址,執行復位中斷函數后跳轉到IAP的main(標號①所示),在IAP的main函數執行完成后強制跳轉到0x08000004+N+M處(標號②所示),最后跳轉到新的main函數中來(標號③所示),當發生中斷請求后,程序跳轉到新的中斷向量表中取出新的中斷函數入口地址,再跳轉到新的中斷服務函數中執行(標號④⑤所示),執行完中斷函數后再返回到main函數中來(標號⑥所示)。


對于步驟④⑤,網友認為是:“在main執行的過程中,如果CPU得到一個中斷請求,PC指針仍強制跳轉到地址0x08000004中斷向量表處,而不是新的中斷向量表,如圖標號④所示,程序再根據我們設置的中斷向量表偏移量,跳轉到對應中斷源新的中斷服務程序中,如圖標號⑤所示”。我對此的理解是:“當發生中斷后,程序從0x08000004(舊)處的中斷向量表中得到相應的中斷服務函數入口地址,繼而跳轉到相應的中斷服務程序”。但是舊的中斷向量列表里邊存放的是IAP程序中斷函數的入口地址,它是如何得到user程序中斷函數的入口地址呢?所以我覺得此種說法是錯誤的。“當發生中斷時PC指針強制會跳轉到0x08000004處”這種說法并沒有錯,只是忽略了后續的一些知識要點而導致這個說法出現矛盾。


對于步驟④⑤我認為的是,在main函數的執行過程中,如果CPU得到一個中斷請求,PC指針本來應該跳轉到0x08000004處的中斷向量表,由于我們設置了中斷向量表偏移量為N+M,因此PC指針被強制跳轉到0x08000004+N+M處的中斷向量表中得到相應的中斷函數地址(待求證),再跳轉到相應新的中斷服務函數,執行結束后返回到main函數中來。


三、實現過程


STM32F103ZET6的Flash地址為0x08000000—0x0807ffff共512KB,把這512KB的空間分為兩塊,第一塊大小為32KB存放BootLoader程序,剩余的空間存放用戶程序(根據實際情況分配這兩塊空間的大小,BootLoader程序占用的空間越小越好,則BootLoader地址為0x08000000—0x08007fff,用戶程序地址為0x08008000—0x0807ffff。BootLoader流程圖大致應該如下:


1、初始化時鐘。


2、初始化中斷向量表地址。


3、初始化按鍵。(使用按鍵觸發方式,上電時如果按鍵被按下則進行用戶程序更新操作)


4、初始化串口。


5、檢測按鍵是否被按下,是則執行步驟6,否則執行步驟10。


6、擦除用戶程序(擦除0x08008000—0x0807ffff地址空間Flash)。


7、從串口讀取新的用戶代碼數據,把代碼寫入用戶程序空間。


8、檢測串口數據接收完畢?是則執行步驟9,否則跳回步驟7。


9、用戶程序更新完畢,等待重新上電或硬件復位。


10、跳轉到用戶程序(強制將PC指針跳轉到0x08008000+4處)。


到這里首先要解決的問題就有:


1、如何進行對STM32的Flash進行擦除和寫入操作。


2、中斷向量表偏移如何設置。


3、如何改變代碼存放的地址空間(因為BootLoader要存放在0x08000000處,用戶程序要存放在0x08008000處,而默認的代碼存放的地址空間為0x08000000)。


4、怎么進行PC指針的強制跳轉,跳轉時需要做些什么。


5、串口接收的用戶代碼數據是什么樣的代碼數據,是一種什么樣的文件。


問題的解決:


1、使用STM32的固件庫函數,只需調用幾個庫函數即可輕松解決,使用的固件庫為stm32f10x_flash.c文件,對Flash的操作過程簡要為:Flash解鎖àFlash擦除àFlash寫入àFlash上鎖。(對Flash編程的更詳細操作參考STM32F10xxx閃存編程手冊)


①解鎖:


FLASH_Unlock();//解鎖Flash


FLASH_SetLatency(FLASH_Latency_2);//因為系統時鐘為72M所以要設置兩個時鐘周期的延時


②擦除:


for(i=0;i<240;i++)


{


if(FLASH_ErasePage(FLASH_ADDR+i*2048)!= FLASH_COMPLETE)//一定要判斷是否擦除成功


returnERROR;


}


說明:FLASH_ErasePage(uint32_t Page_Address)即為Flash擦除操作,按頁擦除,每頁2KB,Page_Address為頁的起始地址,如0x08000000是第一頁起始地址,0x08000800為第二頁起始地址,這里的操作擦除了0x08008000—0x0807ffff地址空間的Flash。


③寫入:


unsignedchar buf[1024];//假設待寫入的代碼數據


unsigned short temp;//臨時數據


for(i=0;i<512;i++)


{


temp = (buf[2*i+1]<<8) | buf[2*i];//2個字節整合為1個半字


if(FLASH_ProgramHalfWord(ADDR,temp) != FLASH_COMPLETE)//判斷是否寫入成功


{


Return ERROR;


}


ADDR +=2;//地址要加2,因為每次寫入的是2個字節(1個半字)


}


說明:因為STM32的Flash寫入為雙字節(1個半字)寫入,FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)函數即為對地址為Address寫入1個半字的Data,每次寫入完成后地址要加2。


④上鎖:


FLASH_Lock();//Flash上鎖,一個固件庫函數即可實現。


2、關于中斷向量表的偏移設置,對于BootLoader程序只需設置中斷向量表的指向在0x08000000處,對于用戶程序需要設置中斷向量表的指向在0x08008000處即可。


①在BootLoader程序的中斷向量表指向設置中應有這么一句:


NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);//設置中斷向量表指向


其中NVIC_VectTab_FLASH是個宏定義,的值為0x08000000。


②在用戶程序的中斷向量表指向設置用應有這么一句:


NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);//設置中斷向量表指向


3、確認代碼存放的地址空間,在IAR和在Keil中的設置是不同的,網上有在Keil中設置的方法,設立介紹在IAR軟件環境下的設置方法。


①在固件庫目錄STM32F10x_StdPeriph_Lib_V3.5.0ProjectSTM32F10x_StdPeriph_TemplateEWARM下找到一個stm32f10x_flash.icf文件,將其復制到工程目錄中來,在打開IAR工程,將配置文件添加到工程中,如下圖3-2所示



圖3-1


②在工程中打開stm32f10x_flash.icf該文件,修改兩個參數即可改變代碼存放的地址空間,圖下圖3-2所示。


圖3-2


4、關于PC指針的強制跳轉,想在BootLoader程序中將PC指針跳轉到用戶代碼處,可選擇下面的操作


typedefvoid (*pFunction)(void);


pFunctionJump_To_Application;


uint32_tJumpAddress;


#defineApplicationAddress0x08008000


if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)//--------①


{


JumpAddress= *(__IO uint32_t*) (ApplicationAddress + 4);//--------②


Jump_To_Application= (pFunction) JumpAddress;//--------③


__set_MSP(*(__IOuint32_t*) ApplicationAddress);//--------④


Jump_To_Application();//--------⑤


}


①因為用戶程序開始位置(0x08008000處)的前4個字節存放的是堆棧的地址,堆棧地址必定是指向RAM空間的,而STM32的RAM空間起始地址為0x20000000,所以要進行判斷。


②程序跳轉地址的確認,前面已經說過0x08008004處的4個字節存放的是復位函數的入口地址,該句的意思為獲得(ApplicationAddress + 4)地址處的數據,即為獲得新的復位函數入口地址。


③令Jump_To_Application這個函數指針指向復位函數入口地址。


④堆棧的初始化,重新設定棧頂代地址,把棧頂地址設置為用戶代碼指向的棧頂地址。


⑤跳轉到新的復位函數。


5、通過串口來接收代碼數據,就是PC機通過串口將代碼數據發送到STM32中去。這里就涉及到兩個問題:


①數據怎么得來。


②數據傳輸的過程需要遵循的協議,什么時候開始,什么時候結束。


解決①:一般我們就將*.hex文件使用JFlash-ARM打開再通過Jlink仿真器燒錄到STM32芯片中,但是*.hex文件里邊包含的數據不純粹是代碼數據還有一些別的東西,而*.bin文件數據就全部是代碼數據。


在IAR軟件環境中打開一個用戶工程,先設置好中斷向量表偏移和代碼存放的地址空間后(前面已介紹過這兩種方法)。設置工程如下圖3-3所示,確認后重新編譯工程,在工程的DebugExe目錄下會相應生成一個xxx.bin文件,這就是所需要的代碼文件。


圖3-3


②數據通過串口來傳輸文件常用的協議有XModem、YModem、ZModem這三種協議,在PC端使用這些協議傳輸文件只需要PC的超級終端或者終端工具SecureCRT即可,但是在STM32這邊的編程會增加一些困難(因為要先去讀懂、解析這些協議,在通過編程來實現)。也可選擇自己定義一套簡單的傳輸協議,但同樣會有一些困難(因為要在PC端進行文件和串口編程)。總之不管通過什么辦法都行,只要能將xxx.bin文件數據通過串口全部發送到STM32并且STM32能夠全部接收到這些數據并寫入Flash即可(我選擇后者,自定義傳輸協議并用VC進行文件和串口編程)。


四、結束語


總的來說STM32的IAP方案實現需要在進行用戶程序之前加一段Bootloader程序,BootLoader程序的作用就是:


①什么都不做,直接跳轉到用戶程序。


②刪除原有的用戶程序,讀取*.bin文件數據并將數據重新寫入新的用戶程序。


對于用戶程序相比普通的編程只需要做三步改動即可


①改變中斷向量表。


②改變代碼存放的地址空間


③修改生成*.bin文件


使用通過UART的IAP方案并不是很好的選擇,這只是IAP方案的一個機制,因為能使用PC機通過串口升級程序,同樣能通過Jlink燒寫程序,并且自定義的串口通訊協議在沒有校CRC校驗的情況下不能及時發現數據傳輸過程發生的錯誤。這里推薦使用SD卡(或U盤)進行用戶程序更新,將*.bin文件復制到SD卡(或U盤)中,STM32再通過讀取SD卡(或U盤)的*.bin文件進行用戶程序更新,這也避免了STM32與PC笨重的通訊,只需插一個SD卡(或U盤)更顯得人性化一些,但需要去弄懂STM32如何與SD卡(或U盤)的通訊。

關鍵字:IAR環境  STM32  IAP方案 引用地址:IAR環境下STM32+IAP方案的實現

上一篇:STM32 PWM 輸出
下一篇:基于STM32 MCU的太陽能:LED街燈解決方案

推薦閱讀

圖為中國科學院計算技術研究所總工程師胡偉武接受新華訪談采訪。新華網 陳杰 攝新華網北京4月20日電(記者 馬蕓菲 陳杰)4月20日,針對美國的出口禁令,中興通訊發布了《關于美國商務部激活拒絕令的聲明》,表示美國商務部無視中興通訊過去兩年在遵循出口管制合規方面的艱苦努力、巨大投入和長足進步。對中興通訊極不公平,中興通訊不能接受。4月16日...
此文章為接近市場人士的觀察結論,不代表享能匯觀點,歡迎其他讀者添加享能匯AI微信(JingReport_AI)提出想法一起交流。 四川電力市場目前有8個市場交易品種鋁電合作、跨省聯動、戰略長協、常規直購、富余電量、低估棄水、留存電量、關停補償,應該為全國最為復雜的售電市場。 2019年的年度集中競價交易均在3月29日全部結束。2019年四川電力市場可以...
據常州日報報道,4月20日,常州市委常委韓九云實地調研GCS高端化合物半導體制造項目現場并座談。GCS高端化合物半導體制造項目由美國GCS公司、武岳峰資本、臺灣晶元光電股份有限公司、江蘇卓勝微電子股份有限公司等投資,總投資100億元。項目通過建設化合物半導體及微機電系統生產線,用于高端射頻前端應用及光電子應用的半導體制造。據常州日報報道,項目...
2021中國機器人產業發展論壇將于5月26-29日在安徽蕪湖舉辦據悉,本屆論壇將以工業機器人主題、協作機器人主題、移動機器人智能物流主題、機器人產業人才發展主題與機器人投資主題五大主題為探討方向。從產業發展來看,中國機器人已經實現了技術和市場的突破,從學院到產業,構建了機器人產業鏈生態的全景圖。同時論壇將舉行第七屆恰佩克獎頒獎儀式。旨在對...

史海拾趣

問答坊 | AI 解惑

I2C 總線規范中文資料下載

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 編輯 非常翔實、全面的四篇文檔,沒有比這更詳細的。好好閱讀,一切盡在掌握! 幾乎在所有的總線接口中,最重要的參數就是時序。對于初學者,不應僅滿足于器件的連接和編程。需要掌握總線接口時序 ...…

查看全部問答∨

三端穩壓LM317設計的甲類功放

本帖最后由 jameswangsynnex 于 2015-3-3 19:59 編輯 用穩壓集成功放制作的功率放大器,對電子愛好者來說,作為開拓思路的一種嘗試不無積極意義。該電路為純甲類工作,又用低噪聲管作電壓放大,所以THD,NF等指標都不錯,輸出功率可達到30W 電路 ...…

查看全部問答∨

TI開展MSP430開發版免費申請活動了,趕快參加吧

  只需到TI的網站填寫調查問卷,就有機會獲得免費的MSP430開發板,趕快行動吧     能以 8 位產品價格實現 16 位出色性能與超低功耗的 Value Line 系列 MSP430™ 處理器,可幫助您輕松啟動設計,真正做到以更少投 ...…

查看全部問答∨

請問從事硬件設計(非電子設計,就是主要不是搞vlsi),應該有什么樣的基礎,請詳細說明

我是一個初學者,我的師兄在大唐電信工作  他本科是學計算機科學與技術的 他研究生學習的是計算機控制技術   他做過汽車電子的項目 他做過嵌入式系統 他很忙 聯系不上他 所以問大家 作為硬件工程師  需要那些 ...…

查看全部問答∨

keilde 問題

這是一個8*8led的掃描程序,用keil時新建保存了,在新建工程后引入,編譯,就提示這個了 “文件被外部編譯器改變,是否重新載入” 顯示錯誤是 “創建目標 \'目標 1\' PA51匯編 STARTUP.A51 ... PA51匯編 saomiao.asm ... 連接 ... BL51 BANK ...…

查看全部問答∨

怎樣選擇GPRS模塊?

我第一次接觸GPRS模塊 不知道怎么選擇模塊 應該考慮哪些問題。 現在我所知道的是我主要需要用這個模塊進行短信服務,需要內嵌TCP/IP協議的模塊,希望高手能給我指教。 同時我想知道有什么資料能讓我對GPRS模塊有個更快的了解呢? 謝謝!!!!! ...…

查看全部問答∨

ARM下如何實現XML解析

我想在SmartARM2200開發板上實現XML格式的數據傳輸.當然,就要求能解析XML數據,找了很多資料,實在是不知道怎么下手. 從網上下了ADS下來,本想在開發板: 在uCOS-II系統下 實現 TCP通訊實驗 這個例子里面直接加入XML數據的解析函數就可以了.但是找了很 ...…

查看全部問答∨

PL通過RS485連接兩臺觸摸屏方法

任意一臺帶RS485口輸出的PLC,使用同一端口連接兩臺觸摸屏,如何實現?   現在的觸摸屏都有“多屏一機”的功能,一臺觸摸屏做主機,另一臺做從機。 主觸摸屏一個485口連接PLC,主觸摸屏再用以太網口或者串口連接另一臺從觸摸屏。一般觸摸屏 ...…

查看全部問答∨

紅外線遙控器控制繼電器的程序+電路圖

紅外線遙控器控制繼電器的程序 #include #include #define uchar unsigned char #define uint unsigned int    #pragma interrupt_handler IceInt:6 中斷程序說明 uint bitcnt,data0=0,data1=0; void ICEInit(void) //T/C1 初 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 广水市| 从江县| 张家港市| 铁岭县| 宜兰市| 玉田县| 安多县| 上高县| 屏山县| 韶山市| 凯里市| 永川市| 天水市| 阿荣旗| 六安市| 利川市| 固镇县| 青州市| 英德市| 铜梁县| 万安县| 惠东县| 含山县| 河西区| 津南区| 曲水县| 广安市| 东海县| 达拉特旗| 文水县| 海门市| 沭阳县| 宽甸| 都江堰市| 米易县| 湛江市| 咸丰县| 龙胜| 沙湾县| 新邵县| 晋中市|