stm32F105RC6 U盘升级实验 跳转APP后中断出错问题

匿名 (未验证) 提交于 2019-12-03 00:26:01

最近在做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。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!