47 stm32f0 IAP跳转APP后中断无法进入

47.1 引言

本次问题叫做:stm32f0 IAP跳转APP后中断无法进入

之前弄了stm32f103的iap程序,因为stm32f103有中断向量起始地址控制器,直接修改VECT_TAB_OFFSET的值,然在APP里面NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2400);,这样就行了,但是cortex-m0不行,因为没这个功能,所以导致需要较为特殊的处理。然后我根据网上的资料,仿照stm32f030单片机的的机制去做了另外一款同样是cortex-m0的IAP,但是问题出现了,在原来stm32f030单片机可以正常运行的APP,在新的cortex-m0单片机上不行,程序从IAP跳转到APP的时候,所有的中断函数都进不去,但在IAP的程序中,中断函数是没问题的,那肯定在是中断向量表拷贝这边出现的问题,然后找问题找了一个晚上,今天早上弄好了,特此记录一下。

47.2 实验

本实验使用的是cortex-m0处理器,编写了IAP以及APP应用程序,IAP跳转到APP是正常的,APP的程序也在正常运行,除了中断外!!!!!为此,开始了找bug之旅,以下是常见的cortex-m0在APP中进行拷贝中断向量表的操作!

#define APPLICATION_ADDRESS (uint32_t)0x8002400
#if   (defined ( __CC_ARM ))
  __IO uint32_t VectorTable[48] __attribute__((at(0x20000000)));
#endif

	/* Enable the SYSCFG peripheral clock*/
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE); 

	// copy vector table from flash to ram
	for (uint8_t i = 0; i < 48; i++) 
    {
        VectorTable[i] = *(__IO uint32_t *)(APPLICATION_ADDRESS + (i << 2));
    }
	/* Remap SRAM at 0x00000000 */
	SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);

上述的跳转后APP的向量拷贝,我在stm32f030这款单片机上,是正常的,但是在另外一款cortex-m0的单片机不行,原因是:

不能用这个函数:RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE); //这个函数估计重置系统配置时钟后,没起来,然后后面设置的没用

要把这个函数改为:RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //这个是系统配置使能,那就正常了。

如下所示:

#define APPLICATION_ADDRESS (uint32_t)0x8002400
#if   (defined ( __CC_ARM ))
  __IO uint32_t VectorTable[48] __attribute__((at(0x20000000)));
#endif	

/* Enable the SYSCFG peripheral clock*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

	// copy vector table from flash to ram
	for (uint8_t i = 0; i < 48; i++) 
    {
        VectorTable[i] = *(__IO uint32_t *)(APPLICATION_ADDRESS + (i << 2));
    }
	
	/* Remap SRAM at 0x00000000 */
	SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);

就这样改完后,就一切正常了!Over!

猜你喜欢

转载自blog.csdn.net/Chasing_Chasing/article/details/116264427
47