天天看点

STM32F030 做IAP时NVIC_Init()中断卡死和“could not stop cortex-m device”问题分析

新项目需求,然后用STM32F030的MCU编写的一个IAP&&APP程序,这中间就出现一个问题,就是在APP跳转到IAP升级的时候出现了NVIC_Init()中断卡死现象,其中在APP main()函数里面开头就有这么一段代码

memcpy((void*)0x20000000, (void*)0x8003000, 0xB4);
	SYSCFG->CFGR1 |= 0x03;
           

 也就是说中断的向量表地址在APP里面被移位了地址,然后跳转到到IAP程序中,IAP出现问题的代码段如下:

NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;  
	NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
           

执行到NVIC_Init()函数的时候,MDK无缘无故地被停止了,而且是不断地被停止,不管是F5还是step over都不行,其中单步运行的时候还出现了"could not stop cortex-m device"错误!

STM32F030 做IAP时NVIC_Init()中断卡死和“could not stop cortex-m device”问题分析

真是急死宝宝了!找了半天都没有思路!然后看了一下这位工程师写的博客,网址是:http://blog.chinaunix.net/uid-30016330-id-4859863.html,然后才有一点点思路。

      首先是APP的中断向量的地址被修改了,跳转到IAP时,索取中断向量的地址没有改过来,只要IAP的mian()函数里面也像APP一样添加索取中断修整向量的地址,既可以正常运行了。

IAP在main函数里面前面添加如下代码即可:

memcpy((void*)0x20000000, (void*)0x8000000, 0xB4);
	SYSCFG->CFGR1 |= 0x03;
           
STM32F030 做IAP时NVIC_Init()中断卡死和“could not stop cortex-m device”问题分析

 小小错误却走了不少的弯路,希望能帮到你!

总结:程序找不到中断向量地址才出现的问题!

继续阅读