1. 程式人生 > >stm32F105RC6 U盤升級實驗 跳轉APP後中斷出錯問題

stm32F105RC6 U盤升級實驗 跳轉APP後中斷出錯問題

最近在做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。