OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4999|回复: 8

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

[复制链接]

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-8-21
在线时间
10 小时
发表于 2018-11-15 14:54:08 | 显示全部楼层 |阅读模式
1金钱
求助大佬啊,原子哥
我用STM32F103芯片写了个IAP程序,IAP放在flash一开始,用户程序往后偏移。从IAP写入数据啊,跳转到用户程序执行啊,都是正常的。现在存在的问题是从用户程序软复位到IAP程序会有几率导致IAP程序不运行,上电复位倒是没导致过这样。为了查找问题我只运行IAP程序,不写入用户程序数据。在IAP程序里通过CAN总线发送软复位指令进行软复位,用的是__set_FAULTMASK(1);NVIC_SystemReset();  。在IAP程序里通过指令控制软复位,基本上能复位10多次,有时候只能复位2-3次,也有时候能软复位100多次,再多了程序就对软复位指令没反应了。加在main函数开头的代表程序运行起来的一个小LED灯也不亮了,给人的感觉就像是没有软复位到IAP程序。这只是我的猜测,我也不知道运行到哪儿了,在程序里跳来跳去的仿真我也不会。求各位见多识广的大佬能不能帮小弟分析下可能导致问题的原因啊求助大佬啊,救命啊,救命啊大佬,救命。。救。。。我。。。救。。。。。。救我!@正点原子

最佳答案

查看完整内容[请看2#楼]

帮助你查到一帖子,如是说: 问:我用的是STM32F103ZET6,需要执行系统复位,但是调用函数NVIC_SystemReset();之后,CPU没有复位,可能是什么原因? 答: 1、你的CPU复位引脚接的什么,如果是强上拉的话有可能不复位,因为所以内部复位都是用内部MOS管拉低复位脚,MOS驱动能力很弱, 以前因为没有注意,出过这种错误,在复位脚接了一个IMP809,就无法内部复位,看门狗都不起作用。 2、LS正解。 如果复位脚接大电解电容,也可能 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
863
金钱
863
注册时间
2015-2-12
在线时间
354 小时
发表于 2018-11-15 14:54:09 | 显示全部楼层
帮助你查到一帖子,如是说:
问:我用的是STM32F103ZET6,需要执行系统复位,但是调用函数NVIC_SystemReset();之后,CPU没有复位,可能是什么原因?
答:
1、你的CPU复位引脚接的什么,如果是强上拉的话有可能不复位,因为所以内部复位都是用内部MOS管拉低复位脚,MOS驱动能力很弱, 以前因为没有注意,出过这种错误,在复位脚接了一个IMP809,就无法内部复位,看门狗都不起作用。
2、LS正解。 如果复位脚接大电解电容,也可能无法复位。
http://bbs.eeworld.com.cn/thread-253652-1-1.html
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-8-21
在线时间
10 小时
 楼主| 发表于 2018-11-15 15:40:05 | 显示全部楼层
自顶。。。。。。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-11-17 02:51:58 | 显示全部楼层
执行各种外设复位工作。因为IAP和APP,都有可能用到同一个外设,但是不同的配置,导致死机。
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-8-21
在线时间
10 小时
 楼主| 发表于 2018-11-17 09:09:06 | 显示全部楼层
正点原子 发表于 2018-11-17 02:51
执行各种外设复位工作。因为IAP和APP,都有可能用到同一个外设,但是不同的配置,导致死机。

原子哥,我解决问题了,可是为什么这样就行了我还是不怎么明白。我的方法是STM32IAP程序在执行上位机利用CAN总线发来的软复位命令(自己定义的)时,在软复位代码前面加上一句失能       CAN1接收中断     就好了,上位机发了软复位命令之后总线是空闲的,也不可能产生接收中断啊,不懂为啥在IAP软复位命令前面加上这一句就好了。软复位程序卡死的问题在IAP程序好了之后,应用程序里的软复位也正常了。
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-8-21
在线时间
10 小时
 楼主| 发表于 2018-11-17 09:09:49 | 显示全部楼层
csmjmcc 发表于 2018-11-17 08:29
帮助你查到一帖子,如是说:
问:我用的是STM32F103ZET6,需要执行系统复位,但是调用函数NVIC_SystemRese ...

谢谢你的帮助,问题已经解决了,可是为什么这样就行了我还是不怎么明白。我的方法是STM32IAP程序在执行上位机利用CAN总线发来的软复位命令(自己定义的)时,在软复位代码前面加上一句失能       CAN1接收中断     就好了,上位机发了软复位命令之后总线是空闲的,也不可能产生接收中断啊,不懂为啥在IAP软复位命令前面加上这一句就好了。软复位程序卡死的问题在IAP程序好了之后,应用程序里的软复位也正常了。
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-8-21
在线时间
10 小时
 楼主| 发表于 2018-11-17 09:20:26 | 显示全部楼层
csmjmcc 发表于 2018-11-17 08:29
帮助你查到一帖子,如是说:
问:我用的是STM32F103ZET6,需要执行系统复位,但是调用函数NVIC_SystemRese ...

我看了下硬件电路,NRST引脚通过一个10K的电阻接3.3,通过一个0.1uf接GND,这算是复位引脚中规中矩的接法吧
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
863
金钱
863
注册时间
2015-2-12
在线时间
354 小时
发表于 2018-11-17 11:09:13 | 显示全部楼层
HelloMcu 发表于 2018-11-17 09:20
我看了下硬件电路,NRST引脚通过一个10K的电阻接3.3,通过一个0.1uf接GND,这算是复位引脚中规中矩的接法 ...

复位这样解法是最常规的了。与你同样迷惑的是:__set_FAULTMASK(1); 这个语句就是关闭所有中断,为何还要单独关闭CAN中断呢?
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2018-8-21
在线时间
10 小时
 楼主| 发表于 2018-11-19 11:35:11 | 显示全部楼层
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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 23:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表