IAP操作系统升级
IAP升級時跳轉(zhuǎn)不成功,之前的例程重新編譯后又不成功,經(jīng)過三四天的調(diào)試發(fā)現(xiàn)如下問題:
1.在APP棧頂檢測出錯,棧頂要求20000000,通過變量輸出APP棧頂為10000000,使用HWorks軟件打開APP生成的Bin文件,第一行 70 04 00 10即為10000470棧頂(initial_sp=RW_data+ZI_data)位置,IAP跳轉(zhuǎn)的第一個函數(shù)位置,APP棧頂?shù)刂放cIAP設(shè)置不一致導(dǎo)致無法正常跳轉(zhuǎn);
?由于我使用的是F4系列,KEIL設(shè)置存在兩個SRAM區(qū),APP程序較小取消IRAM2的勾選再次編譯生成BIN文件,棧頂?shù)刂肪褪?000000開頭的,下載跳轉(zhuǎn)正常;
?
?
2.下載帶FREE操作系統(tǒng)時,注意了以上問題,程序跳轉(zhuǎn)正常,但是無法運行APP程序,經(jīng)調(diào)試查詢發(fā)現(xiàn)有以下兩個重點重點:
一:IAP與APP的SystemClock_Config配置必須一模一樣,我使用的是CubeMX創(chuàng)建工程,系統(tǒng)時鐘比較直觀,看到PLLQ倍頻是沒有使能的所以就沒要求與APP一致,程序調(diào)試很久APP程序就是無法運行,由于APP程序參與的人比較多,所以決定還是修改IAP程序中的SystemClock_Config配置與APP一直,修改完后再次運行就正常了;
?二:APP程序跳轉(zhuǎn)正常無法運行還有一個重要原因是中斷開關(guān),操作系統(tǒng)是通過中斷來調(diào)配CPU資源,IAP只開了一個串口接收中斷,IAP中斷在跳轉(zhuǎn)APP程序時無法復(fù)位中斷狀態(tài)容易導(dǎo)致操作系統(tǒng)中斷混亂無法正常運行(個人理解),所以在跳轉(zhuǎn)APP程序時要手動關(guān)閉全局中斷,在APP程序主函數(shù)main里面開啟全局中斷;其中一點容易忽略的是系統(tǒng)sys滴答中斷,這個需要單獨關(guān)閉,sys滴答為系統(tǒng)時鐘中斷,最高級中斷;具體如下(IAP程序跳轉(zhuǎn)前關(guān)閉SYS滴答時鐘和全局中斷?__disable_irq ();)?
?? ??? ??? ??? ?SysTick->CTRL = 0X00;//禁止SysTick
?? ??? ??? ??? ?SysTick->LOAD = 0;
?? ??? ??? ??? ?SysTick->VAL = 0;
?? ??? ??? ??? ?__disable_irq ();
?? ??? ??? ??? ?iap_load_app(FLASH_APP1_ADDR);//執(zhí)行FLASH APP代碼
?APP在main函數(shù)中開啟全局中斷(sys滴答中斷在初始化后會自動開啟,無需單獨開啟中斷)
main函數(shù)首行設(shè)置中斷偏移,即APP地址偏移, __enable_irq ();開啟全局中斷;
int main(void)
{
? /* USER CODE BEGIN 1 */
? SCB->VTOR = FLASH_BASE | 0x8000;//設(shè)置偏移量
? /* USER CODE END 1 */
? /* MCU Configuration--------------------------------------------------------*/
? /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
? HAL_Init();
? /* USER CODE BEGIN Init */
? __enable_irq ();
? /* USER CODE END Init */
? /* Configure the system clock */
? SystemClock_Config();
? /* USER CODE BEGIN SysInit */
?? ?
? /* USER CODE END SysInit */
以上經(jīng)歷希望能夠幫助到一些人,如有錯誤或補充,歡迎大家評論表述!
總結(jié)
- 上一篇: 动手写一个探测网络质量(丢包率/RTT/
- 下一篇: 网站优化中SEO关键词密度到底多少属于合