stm32F105RC6 U盤升級實驗 跳轉APP後中斷出錯問題
阿新 • • 發佈:2019-01-23
最近在做STM32F105的U盤升級功能,其中bootloader中的FLASH寫入,APP跳轉等均參考了正點原子的F1串列埠IAP實驗。值得注意的是F103的USB是不帶HOST功能的,上次做的INIT Kit小板就使用了103的晶片,導致沒辦法加U盤升級功能。
在移植好USB Host 功能後(F1的usb打算後續專門寫一篇,這裡就不介紹移植的工作了),移植FATFS檔案系統,然後測試能夠成功識別U盤,掛載檔案系統,開啟關閉檔案等。U盤升級實際上就是通過USB host功能,從U盤的指定檔案中讀取KEIL生產的.bin檔案,然後寫入32內部FLASH。如果USB Host功能沒問題後,基本上就剩下APP程式中斷向量表的偏移了。
這次專案進行過程中,Bootloader程式完成後,發現在跳轉到APP程式後會進入Default_Handler這個錯誤中斷裡。並且是0X8000000的地址的Default_Handler(APP程式從0x8010000開始,有APP自己的中斷向量表)。在APP程式中已經設定瞭如下程式碼的地址偏移,並且Keil中也都設定過了。.map檔案的也能看到地址已經變了。
SCB->VTOR = FLASH_BASE | 0x10000;
在跳轉程式前,使用__disable_irq()關閉所有中斷則不會進入Default_Handler,但是如果在APP程式中使用__enable_irq()開啟中斷就又會進入Default_Handler,所以判斷問題出現中斷向量表的偏移上。但是已經在APP程式的最開始使用了SCB->VTOR重新設定過偏移了。
最後在全域性搜尋SCB->VTOR,發現在F1的USB庫裡面有這樣一段程式碼
/**
* @brief USB_OTG_BSP_TimeInit
* Initializes delay unit using Timer2
* @param None
* @retval None
*/
void USB_OTG_BSP_TimeInit ( void )
{
#ifdef USE_ACCURATE_TIME
NVIC_InitTypeDef NVIC_InitStructure;
/* Set the Vector Table base address at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x00);
/* Configure the Priority Group to 2 bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* Enable the TIM2 gloabal Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
#endif
}
終於找到問題了。。。就是因為USB_OTG_BSP_TimeInit()這個函式重新設定了中斷向量表,導致跳轉APP程式後出現Default_Handler。