MDK调试STM32出现“could not stop cortex-m device”错误的软件解决方法

在MDK调试STM32出现“could not stop cortex-m device …”软件解决办法

这个问题出现的原因很多,答案最多的都是硬件或配置原因,总结为:
1.BOOT0和BOOT1的接法;
2.NRST引脚在开机过程出现低电平导致片子处于在reset状态;
3.或者是编译选项里你没选器件,或者是下载选项里没选器件;
4.主频超频了;
5.编辑器版本原因;
6.调试过程没关闭看门狗。


软件原因

在进行GD32F10x芯片远程升级APP调试时,需要将Bootloader和Applictaion分两段位置0x08000000和0x08004000进行存储,依次执行。在程序移植后,暂时不需要Boorloader功能,需要Applictaion从0x08000000地址执行。
配置如下:


一般来讲只需要将上图部分改为0x08000000即可,但是调试过程一运行就跑到未知地址处并出现图一报错。
检查代码发现代码中对中断向量表做了偏移处理

NVIC_VectTableSet(NVIC_VECTTAB_FLASH, ((uint32_t)0x00004000));

将偏移量改为0即可,大意了,所以做IAP的一定要注意


原因分析:

在做IAP时,会根据中断号在中断向量表中找到中断服务例程的地址,而在跳转到中断服务程序的时候,必须加上一个偏移量offset,当中断向量表在FLASH中的时候,就是0x08000000+offset,当在SRAM中的时候,是在0x20000000+offset,也就是说,void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset)函数的作用就是告诉内核,应用程序的中断向量表是在FLASH中还是在SRAM中,偏移量是多少。
也就说,无论是什么应用程序,必须在0x08000000处存放中断向量表,至少要有复位中断向量,这样内核在上电之后,首先从0x08000000处加载栈指针,然后再0x08000004处加载中断服务例程的地址。
在IAP中,一般会有两个中断向量表,其中Bootloader有一个,APP有一个。Bootloader的向量表就存在0X08000000处,这样上电之后首先运行的就是Bootloader,bootloader进行APP代码的搬移,加载APP栈指针,最后执行跳转,跳转到APP的中断向量表的起始位置(如果APP是运行在FLASH中,这个地址是0x08000000+offset),
注意,APP的工程中需要一定的设置,并在系统初始化的时候使用函数void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset) 告诉内核APP向量表的区域和位置。
SCB是系统控制块,主要封装了内核相关的寄存器的设置,具体的内容请参考《CM3权威指南》。


解决方案:

出现这种情况软件原因一般就是中断向量表设置偏移位置或者看门狗的问题。

物联沃分享整理
物联沃-IOTWORD物联网 » MDK调试STM32出现“could not stop cortex-m device”错误的软件解决方法

发表评论