【轉】stm32 IAP升級程序


 
一、什么是IAP,為什么要IAP
      IAP即為In Application Programming(在應用中編程),一般情況下,以STM32F10x系列芯片為主控制器的設備在出廠時就已經使用J-Link仿真器將應用代碼燒錄了,如果在設備使用過程中需要進行應用代碼的更換、升級等操作的話,則可能需要將設備返回原廠並拆解出來再使用J-Link重新燒錄代碼,這就增加了很多不必要的麻煩。站在用戶的角度來說,就是能讓用戶自己來更換設備里邊的代碼程序而廠家這邊只需要提供給用戶一個代碼文件即可。
      而IAP卻能很好的解決掉這個難題,一片STM32芯片的Code(代碼)區內一般只有一個用戶程序。而IAP方案則是將代碼區划分為兩部分,兩部分區域各存放一個程序,一個叫bootloader(引導加載程序),另一個較user application(用戶應用程序)。bootload er在出廠時就固定下來了,在需要變更user application時只需要通過觸發bootloader對userapplication的擦除和重新寫入即可完成用戶應用的更換。如圖1-1所示
圖 1-1
 
圖2-1
 
圖2-2
      STM32F10x有一個中斷向量表,這個中斷向量表存放在代碼開始部分的后4個字節處(即0x08000004),代碼開始的4個字節存放的是堆棧棧頂的地址,當發生中斷后程序通過查找該表得到相應的中斷服務程序入口地址,然后再跳到相應的中斷服務程序中執行。上電后從0x08000004處取出復位中斷向量的地址,然后跳轉到復位中斷程序的入口(標號①所示),執行結束后跳轉到main函數中(標號②所示)。在執行main函數的過程中發生中斷,則STM32強制將PC指針指回中斷向量表處(標號③所示),從中斷向量表中找到相應的中斷函數入口地址,跳轉到相應的中斷服務函數(標號④所示),執行完中斷函數后再返回到main函數中來(標號⑤所示)。
圖2-3
圖2-2
      對於步驟④⑤,網友認為是:“在main執行的過程中,如果CPU得到一個中斷請求,PC指針仍強制跳轉到地址0x08000004中斷向量表處,而不是新的中斷向量表,如圖標號④所示,程序再根據我們設置的中斷向量表偏移量,跳轉到對應中斷源新的中斷服務程序中,如圖標號⑤所示”。我對此的理解是:“當發生中斷后,程序從0x08000004(舊)處的中斷向量表中得到相應的中斷服務函數入口地址,繼而跳轉到相應的中斷服務程序”。但是舊的中斷向量列表里邊存放的是IAP程序中斷函數的入口地址,它是如何得到user程序中斷函數的入口地址呢?所以我覺得此種說法是錯誤的。“當發生中斷時PC指針強制會跳轉到0x08000004處”這種說法並沒有錯,只是忽略了后續的一些知識要點而導致這個說法出現矛盾。
 
 
{
}
{
}
 
 
圖3-1
圖3-2
 
 
 
{
}
 
圖3-3
 
 
、什么 IAP,為什么要IAP
      IAP 即為 In Application Programming (在 應用中編程 ),一般情況下 STM32F10x 系列芯片為 主控制器的設備在出廠時就已經使用 J-Link 仿真器將應用代碼燒錄了, 如果在 設備使用過程中需要進行 應用 代碼 更換、升級等 操作 的話 ,則 可能需要將設備 返回 原廠 拆解出來再使用J-Link重新燒錄代碼, 這就 增加了很多不必要的麻煩。站在用戶的角度來說,就是能讓用戶自己來更換設備里邊的代碼程序而廠家這邊只需要提供給用戶一個代碼文件即可。
       IAP卻能很好的解決掉這個難題, 一片 STM32芯片 的Code(代碼)區內 一般只有一個用戶程序 而IAP 方案 則是將代碼 划分為 兩部分, 兩部分 區域各 存放一個程序, 一個 叫bootloader( 引導 加載程序) 另一個 user application( 用戶 應用程序) bootload er出廠時固定下來了,在需要變更user application時只需要通過觸發bootloader對userapplication擦除和重新寫入即可完成用戶應用的更換。1-1所示
圖 1 -1
 
圖2 -1
 
圖2 -2
      STM32F10x有一個中斷向量表,這個中斷向量表存放在代碼開始部分的后4個字節處(即0x08000004),代碼開始的4個字節存放的是堆棧棧頂的地址,發生中斷后程序通過查找該表得到相應的中斷服務程序入口地址,然后再跳到相應的中斷服務程序中執行。上電后從0x08000004處取出復位中斷向量的地址,然后跳轉到復位中斷程序的入口(標號所示)執行結束后跳轉到main函數中(標號②所示)。在執行main函數的過程中發生中斷STM32強制PC指針指回中斷向量(標號所示)從中斷向量表中找到相應的中斷函數入口地址,跳轉到相應的中斷服務函數(標號所示),執行完中斷函數后返回到main函數中來(標號所示)。
圖2 -3
圖2 -2
      對於步驟④⑤網友認為是:“在main執行的過程中如果CPU得到一個中斷請求,PC指針強制跳轉到地址0x08000004中斷向量表處,而不是新的中斷向量表,圖標號所示程序再根據我們設置的中斷向量表偏移量,跳轉對應中斷源新的中斷服務程序如圖標號所示”。我對此的理解是:“當發生中斷后,程序從0x08000004()處的中斷向量表中得到相應的中斷服務函數入口地址,繼而跳轉相應的中斷服務程序但是舊的中斷向量列表里邊存放的是IAP程序中斷函數的入口地址,它是如何得到user程序中斷函數的入口地址?所以覺得此種說法是錯誤的。當發生中斷時PC指針強制會跳轉到0x08000004處”這種說法並沒有錯,只是忽略了后續的一些知識要點導致這個說法出現矛盾。
 
 
{
}
{
}
 
 
圖3 -1
圖3 -2
 
 
 
{
}
 
圖3 -3
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM