小弟有个STM32F103IAP的软复位问题,救命啊,大佬救命

2019-07-21 07:47发布

求助大佬啊,原子哥
我用STM32F103芯片写了个IAP程序,IAP放在flash一开始,用户程序往后偏移。从IAP写入数据啊,跳转到用户程序执行啊,都是正常的。现在存在的问题是从用户程序软复位到IAP程序会有几率导致IAP程序不运行,上电复位倒是没导致过这样。为了查找问题我只运行IAP程序,不写入用户程序数据。在IAP程序里通过CAN总线发送软复位指令进行软复位,用的是__set_FAULTMASK(1);NVIC_SystemReset();  。在IAP程序里通过指令控制软复位,基本上能复位10多次,有时候只能复位2-3次,也有时候能软复位100多次,再多了程序就对软复位指令没反应了。加在main函数开头的代表程序运行起来的一个小LED灯也不亮了,给人的感觉就像是没有软复位到IAP程序。这只是我的猜测,我也不知道运行到哪儿了,在程序里跳来跳去的仿真我也不会。求各位见多识广的大佬能不能帮小弟分析下可能导致问题的原因啊求助大佬啊,救命啊,救命啊大佬,救命。。救。。。我。。。救。。。。。。救我!@正点原子
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
HelloMcu
2019-07-22 11:27
csmjmcc 发表于 2018-11-17 11:09
复位这样解法是最常规的了。与你同样迷惑的是:__set_FAULTMASK(1); 这个语句就是关闭所有中断,为何还要 ...

我在网上看到的这个。。。。。

STM32在使用时有时需要禁用全局中断​。但测试发现一个问题,在关闭总中断后,如果有中断触发,虽然此时不会引发中断,但在调用__enable_irq()开启总中断后,MCU会立即处理之前触发的中断。这说明__disable_irq()只是禁止CPU去响应中断,没有真正的去屏蔽中断的触发,中断发生后,相应的寄存器会将中断标志置位,在__enable_irq()开启中断后,由于相应的中断标志没有清空,因而还会触发中断。

所以要想禁止所有中断,必须对逐个模块的中断进行Disable操作,由于每个模块中断源有很多,对逐个中断Disable的话比较复杂,较为简单的方法是通过XXX_ClearITPendingBit()清除中断标志或者直接通过XXX_DeInit()来清除寄存器的状态。这样在__enable_irq()开启总中断后,MCU就不会响应之前触发的中断了。


http://blog.sina.com.cn/s/blog_a0c22cfd0102x0bj.html

一周热门 更多>