OpenEdv-开源电子网

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

STM32 软件复位问题

[复制链接]

190

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1289
金钱
1289
注册时间
2014-6-15
在线时间
143 小时
发表于 2016-1-15 16:24:13 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 wang12zhe 于 2016-1-15 16:38 编辑

在往常看到有关于STM32软件复位的帖子,自己尝试了以下

我在程序中增加如下代码:
void SoftReset(void)
{
__set_FAULTMASK(1);      // 关闭所有中端
NVIC_SystemReset();// 复位
}


发现,在仿真状态下能正常复位并继续运行,然后在复位,如此循环。


但是退出仿真状态度, 程序卡死, 没有反复复位


重新上电,程序又会卡死, 没有反复复位


这是咋回事??



我使用同一个批次的两块电路板,
发现一块在仿真状态下可以复位,


另一块在仿真状态下,字节卡死,卡死在
__STATIC_INLINE void NVIC_SystemReset(void)
{
  __DSB();                                                     /* Ensure all outstanding memory accesses included
                                                                  buffered write are completed before reset */
  SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      |
                 (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
                 SCB_AIRCR_SYSRESETREQ_Msk);                   /* Keep priority group unchanged */
  __DSB();                                                     /* Ensure completion of memory access */
  while(1);                                                    /* wait until reset */
}
函数的
while(1);    这一句这里


有遇到这样情况的吗?


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

26

主题

201

帖子

0

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2013-12-14
在线时间
125 小时
发表于 2016-1-15 16:56:23 | 显示全部楼层
建议楼主加上看门狗,就可以实现双保险;
void SoftReset(void)
{
__set_FAULTMASK(1);      // 关闭所有中端
NVIC_SystemReset();// 复位
while(1);
}
回复

使用道具 举报

190

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1289
金钱
1289
注册时间
2014-6-15
在线时间
143 小时
 楼主| 发表于 2016-1-15 17:53:28 | 显示全部楼层
lialong1989 发表于 2016-1-15 16:56
建议楼主加上看门狗,就可以实现双保险;
void SoftReset(void)
{

如果增加看门狗的话,就不是立即复位了,

看资料说
void SoftReset(void)
{
__set_FAULTMASK(1);      // 关闭所有中端
NVIC_SystemReset();// 复位
}
是立即复位,

如果仅仅为实现复位,方法很多,


我好奇的是为什么用这种官方给出的方法不行,而且不同的电路板的现象也不一样?

回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-1-15 19:37:01 | 显示全部楼层
lialong1989 发表于 2016-1-15 16:56
建议楼主加上看门狗,就可以实现双保险;
void SoftReset(void)
{

NVIC_SystemReset()函数里其实是有死循环的
QQ截图20160115193609.png

坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-1-15 19:48:01 | 显示全部楼层
我怀疑楼主用的是修改版的官方程序吧?
我刚查看了若干内核的NVIC_SystemReset();的具体实现,它最后用的都是
  for(;;)                                                           /* wait until reset */
  {
    __NOP();
  }
而非楼主的while (1);

楼主若想单纯地复位,不必关闭所有中断,也不必再创建一个函数,直接NVIC_SystemReset();即可,不会出什么问题的

另外若想关闭所有中断请使用__disable_irq();
__set_FAULTMASK这个函数在cmsis_armcc.h里定义,功能并非关闭所有中断:
fault.png
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

26

主题

201

帖子

0

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2013-12-14
在线时间
125 小时
发表于 2016-1-16 09:56:24 | 显示全部楼层
wang12zhe 发表于 2016-1-15 17:53
如果增加看门狗的话,就不是立即复位了,

看资料说

NVIC_SystemReset();// 复位

这种复位方式我们能正常使用,没问题啊,加看门狗就是防止系统的复位方式不小心被修改了;
要么楼主更新一下库文件试试
回复

使用道具 举报

190

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1289
金钱
1289
注册时间
2014-6-15
在线时间
143 小时
 楼主| 发表于 2016-1-22 10:05:06 | 显示全部楼层
xkwy 发表于 2016-1-15 19:48
我怀疑楼主用的是修改版的官方程序吧?
我刚查看了若干内核的NVIC_SystemReset();的具体实现,它最后用的 ...

没有修改库函数,刚刚下载的库版本是3.5的
static __INLINE void NVIC_SystemReset(void)
{
  SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      |
                 (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
                 SCB_AIRCR_SYSRESETREQ_Msk);                   /* Keep priority group unchanged */
  __DSB();                                                     /* Ensure completion of memory access */              
  while(1);                                                    /* wait until reset */
}
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-1-22 12:36:06 | 显示全部楼层
哦                  
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

1

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2019-12-5
在线时间
15 小时
发表于 2021-7-28 19:44:50 | 显示全部楼层
为什么我用这段代码尝试复位不成功呢?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-25 14:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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