OpenEdv-开源电子网

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

stm32f103zet6系统软复位

[复制链接]

25

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
404
金钱
404
注册时间
2016-8-23
在线时间
50 小时
发表于 2016-8-27 10:05:46 | 显示全部楼层 |阅读模式
最近在做一个项目,涉及到系统软复位的问题,一个很简单的函数即可解决
void Sys_Soft_Reset(void)
{  
    SCB->AIRCR =0X05FA0000|(u32)0x04;      
}  

在主函数中调用就可以。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

25

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
404
金钱
404
注册时间
2016-8-23
在线时间
50 小时
 楼主| 发表于 2016-8-27 10:09:28 | 显示全部楼层
其实在官方给的core_cm3.h中有这个一个函数
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 */
}
权威指南中有一句:从SYSRESETREQ 被置为有效,到复位发生器执行复位命令,
  往往会有一个延时。在此延时期间,处理器仍然可以响应中断请求。但我们的本意往往是要
  让此次执行到此为止,不要再做任何其它事情了。所以,最好在发出复位请求前,先把
  FAULTMASK 置位
回复 支持 1 反对 0

使用道具 举报

25

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
404
金钱
404
注册时间
2016-8-23
在线时间
50 小时
 楼主| 发表于 2016-8-27 10:10:21 | 显示全部楼层
置位函数,和2楼的函数放在一起,就可以实现软复位
static __INLINE void __set_FAULTMASK(uint32_t faultMask)
{    register uint32_t __regFaultMask      
__ASM("faultmask");   
__regFaultMask = (faultMask & 1);
}
回复 支持 反对

使用道具 举报

25

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
404
金钱
404
注册时间
2016-8-23
在线时间
50 小时
 楼主| 发表于 2016-8-27 10:10:57 | 显示全部楼层
void SoftReset(void)
{  __set_FAULTMASK(1);      // 关闭所有中端
NVIC_SystemReset();// 复位

}
在你需要复位的地方写个函数即可
回复 支持 反对

使用道具 举报

25

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
404
金钱
404
注册时间
2016-8-23
在线时间
50 小时
 楼主| 发表于 2016-8-27 10:11:55 | 显示全部楼层
这个是别人写的一个汇编的函数,实现软复位,在这里贴出来仅供参考
__asm void SystemReset(void)  
{  
MOV R0, #1           //;     MSR FAULTMASK, R0    //; 清除FAULTMASK 禁止一切中断产生
  
LDR R0, =0xE000ED0C  //;  
LDR R1, =0x05FA0004  //;    STR R1, [R0]         //; 系统软件复位
     
  deadloop       B deadloop        //; 死循环使程序运行不到下面的代码
  
}   然后用的时候在C程序里直接调用该函数就行了。
  SystemReset();
回复 支持 反对

使用道具 举报

3

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
431
金钱
431
注册时间
2016-10-20
在线时间
147 小时
发表于 2016-10-20 15:49:17 | 显示全部楼层
多谢楼主分享
we can't stop
回复 支持 反对

使用道具 举报

8

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2016-8-18
在线时间
30 小时
发表于 2018-5-7 16:30:53 | 显示全部楼层
longshengma 发表于 2016-8-27 10:09
其实在官方给的core_cm3.h中有这个一个函数
static __INLINE void NVIC_SystemReset(void)
{

你知道为什么Cortex-M3要这样做吗?
回复 支持 反对

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2315
金钱
2315
注册时间
2017-7-6
在线时间
281 小时
发表于 2018-6-28 09:34:43 | 显示全部楼层
楼主的分享不错,学习了
回复 支持 反对

使用道具 举报

25

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
404
金钱
404
注册时间
2016-8-23
在线时间
50 小时
 楼主| 发表于 2018-10-8 19:42:59 | 显示全部楼层
大海兄 发表于 2018-5-7 16:30
你知道为什么Cortex-M3要这样做吗?

为什么啊?我不清楚
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 14:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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