IAP操作系统升级
IAP升級時跳轉不成功,之前的例程重新編譯后又不成功,經過三四天的調試發現如下問題:
1.在APP棧頂檢測出錯,棧頂要求20000000,通過變量輸出APP棧頂為10000000,使用HWorks軟件打開APP生成的Bin文件,第一行 70 04 00 10即為10000470棧頂(initial_sp=RW_data+ZI_data)位置,IAP跳轉的第一個函數位置,APP棧頂地址與IAP設置不一致導致無法正常跳轉;
?由于我使用的是F4系列,KEIL設置存在兩個SRAM區,APP程序較小取消IRAM2的勾選再次編譯生成BIN文件,棧頂地址就是2000000開頭的,下載跳轉正常;
?
?
2.下載帶FREE操作系統時,注意了以上問題,程序跳轉正常,但是無法運行APP程序,經調試查詢發現有以下兩個重點重點:
一:IAP與APP的SystemClock_Config配置必須一模一樣,我使用的是CubeMX創建工程,系統時鐘比較直觀,看到PLLQ倍頻是沒有使能的所以就沒要求與APP一致,程序調試很久APP程序就是無法運行,由于APP程序參與的人比較多,所以決定還是修改IAP程序中的SystemClock_Config配置與APP一直,修改完后再次運行就正常了;
?二:APP程序跳轉正常無法運行還有一個重要原因是中斷開關,操作系統是通過中斷來調配CPU資源,IAP只開了一個串口接收中斷,IAP中斷在跳轉APP程序時無法復位中斷狀態容易導致操作系統中斷混亂無法正常運行(個人理解),所以在跳轉APP程序時要手動關閉全局中斷,在APP程序主函數main里面開啟全局中斷;其中一點容易忽略的是系統sys滴答中斷,這個需要單獨關閉,sys滴答為系統時鐘中斷,最高級中斷;具體如下(IAP程序跳轉前關閉SYS滴答時鐘和全局中斷?__disable_irq ();)?
?? ??? ??? ??? ?SysTick->CTRL = 0X00;//禁止SysTick
?? ??? ??? ??? ?SysTick->LOAD = 0;
?? ??? ??? ??? ?SysTick->VAL = 0;
?? ??? ??? ??? ?__disable_irq ();
?? ??? ??? ??? ?iap_load_app(FLASH_APP1_ADDR);//執行FLASH APP代碼
?APP在main函數中開啟全局中斷(sys滴答中斷在初始化后會自動開啟,無需單獨開啟中斷)
main函數首行設置中斷偏移,即APP地址偏移, __enable_irq ();開啟全局中斷;
int main(void)
{
? /* USER CODE BEGIN 1 */
? SCB->VTOR = FLASH_BASE | 0x8000;//設置偏移量
? /* 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 */
以上經歷希望能夠幫助到一些人,如有錯誤或補充,歡迎大家評論表述!
總結
- 上一篇: 动手写一个探测网络质量(丢包率/RTT/
- 下一篇: java信息管理系统总结_java实现科