《APM32芯得》系列內容為用戶使用APM32系列產品的經驗總結,均轉載自21ic論壇極海半導體專區,全文未作任何修改,未經原文作者授權禁止轉載。
1、前言
最近在調試程序的程序升級方式,遇到了不少的問題,本篇筆記記錄一下遇到的一些問題及在這個過程中的一些問題及思考。
首先什么是ISP和IAP?
我這里簡單總結一下,簡單來說MCU程序更新的方式一般有3種:
1. IAP,在應用中編程,通過一些串行接口對應用程序進行更新的一種方式,其模式是BootLoader+APP的方式,且這兩部分的代碼一般均保存在MCU的Flash區域。
2. ISP,在系統中進行編程,一般是通過MCU廠商提供的一段保存在系統存儲區的程序,通過串行接口對Flash進行編程。
3. ICP,在電路中進行編程,一般是通過SWD/JTAG的方式對Flash進行編程。
程序跳轉運行
我這里使用的MCU是極海的APM32F103C8T6,由于其是基于ArmCortex-M3內核的一款芯片,其程序的跳轉運行非常簡單。
Cortex-M內核的芯片一般而言僅需在程序中改變PC、MSP寄存器至指定位置即可使得我們的程序跳轉至某處運行。
比如極海官方提供的例程:
/* Jump to user application */
JumpAddress = *(__IO uint32_t *) (address + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t *) address);
/* Jump to application */
Jump_To_Application();
2、跳轉運行遇到的一些問題
在實踐中,我發現若是在一個程序跳轉至另外一個程序的時候(如BootLoader跳轉至APP),若前段程序開啟了一些中斷,而后段程序未開啟相關中斷的情況下會導致程序無法正常運行。
如設計一個IAP程序:
BootLoader無任何中斷打開,而APP開啟的滴答中斷,若此時我們在APP中使用的是程序跳轉運行的方式回到BootLoader,此時會造成BootLoader程序無法正常響應滴答中斷(因為BootLoader程序沒有滴答中斷服務函數)。從而導致我們的BootLoader程序異常卡死。

3、解決問題
理論上,若BootLoader或者APP單獨保存在flash中,并以復位運行的操作下,我們的程序都是可以正常運行的,而問題在于我們跳轉運行會導致異常。
從上面的理論,我們總結一下:
1. 跳轉運行會導致程序異常。
2. 復位運行不會導致程序異常。
從上面兩點,我們引申思考得到:我們只要在程序跳轉前將芯片的各個狀態保持回到復位狀態,我們就可以保證程序跳轉后能夠正常運行。
那么問題來了,復位狀態是一個什么樣的狀態?
復位時芯片剛剛上電,此時的MCU
1. 各個外設時鐘均未打開。
2. 對中斷的設置均未進行。
那么我們根據這個思路,來編寫我們重新跳轉前的程序:
1. 關閉中斷響應,保證我們的后續“還原至復位狀態的”操作不會被中斷。
2. 關閉所有的中斷使能及還原芯片中斷寄存器狀態。
3. 關閉所有外設的時鐘并對外設進行復位。
4. 設置主時鐘為HSI。
5. 開啟中斷響應。
最后跳轉至目標程序區域

那完成以上操作后就可以保證一定程度上保證我們的程序能夠回到“復位狀態”在去執行我們的目標程序啦。
這里我也貼一段代碼提供給大家參考。
void ResetSystem(void)
{
/* Set the interrupt shielding position and prohibit all interruptions. */
__set_PRIMASK(1);
/* Disable all peripheral clocks */
RCM->APB2CLKEN = 0;
RCM->APB1CLKEN = 0;
RCM->AHBCLKEN = 0;
/* Reset all peripherals */
RCM->APB2RST = 0xFFFFFFFF;
RCM->APB1RST = 0xFFFFFFFF;
RCM->AHBRST = 0xFFFFFFFF;
RCM->APB2RST = 0;
RCM->APB1RST = 0;
RCM->AHBRST = 0;
/* Disable all interruptions */
for (uint8_t i; i < 8; i++)
{
NVIC->ICER[i] = 0xFFFFFFFF;
NVIC->ICPR[i] = 0xFFFFFFFF;
}
/* Configure the external interrupt controller and set all the interrupt
mask and trigger method to 0. */
EINT->IMASK = 0x0;
EINT->EMASK = 0x0;
EINT->RTEN = 0x0;
EINT->FTEN = 0x0;
EINT->IPEND = 0x0;
/* Set HSIEN bit */
RCM->CTRL_B.HSIEN = BIT_SET;
/* Reset SCLKSEL, AHBPSC, APB1PSC, APB2PSC, ADCPSC and MCOSEL bits */
RCM->CFG &= (uint32_t) 0xF8FF0000;
__set_PRIMASK(0);
}
以上便是一份我本次的思考與總結,歡迎大家斧正。
原文地址:https://bbs.21ic.com/icview-3311062-1-1.html
-
mcu
+關注
關注
147文章
19015瀏覽量
400546 -
接口
+關注
關注
33文章
9554瀏覽量
157340 -
程序
+關注
關注
117文章
3846瀏覽量
85347
原文標題:APM32芯得 EP.63 | APM32F103C8T6_關于ISP_IAP中程序跳轉運行的思考
文章出處:【微信號:geehysemi,微信公眾號:Geehy極海半導體】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
IAP程序跳轉到APP只能運行大約2秒
支持ISP和IAP單片機的程序
淺析STM32的IAP與APP互相跳轉
STM32 IAP - Boot跳轉到APP
單片機的燒錄方式:ISP、ICP、IAP的區別
STM32+IAP+uCOS-iii升級跳轉至APP程序跑飛問題
關于STM32 BOOT和IAP跳轉的流程梳理
極海MCU的ISP和IAP中程序跳轉運行問題分析
評論