RCC CSR寄存器会存储复位标示,可通过它来知道复位原因,来源:

     if(RCC_GetFlagStatus(RCC_FLAG_PINRST))
printf("PINRST\r\n");
if(RCC_GetFlagStatus(RCC_FLAG_PORRST))
printf("PORRST\r\n");
if(RCC_GetFlagStatus(RCC_FLAG_SFTRST))
printf("SFTRST\r\n");
if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST))
printf("IWDGRST\r\n");
if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST))
printf("WWDGRST\r\n");
if(RCC_GetFlagStatus(RCC_FLAG_LPWRRST))
printf("LPWRRST\r\n");
printf("RCC->CSR:%x \r\n",RCC->CSR);
RCC->CSR|=0X1000000 ; //清楚中断标示
printf("RCC->CSR:%x \r\n",RCC->CSR);

简单示例

软件复位:转载

在官方软件库的 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 */
}
  
但是不是直接调用这个函数就OK了? 
  
在Cortex-M3权威指南中有这么一句话:
这里有一个要注意的问题:从SYSRESETREQ 被置为有效,到复位发生器执行复位命令,往往会有一个延时。在此延时期间,处理器仍然可以响应中断请求。但我们的本意往往是要让此次执行到此为止,不要再做任何其它事情了。所以,最好在发出复位请求前,先把
FAULTMASK 置位。 所以最好在将FAULTMASK 置位才万无一失。 
 
同样官方 core_cm3.h 文件里也直接提供了该函数 
static __INLINE void __set_FAULTMASK(uint32_t faultMask)
{
register uint32_t __regFaultMask       __ASM("faultmask");
__regFaultMask = (faultMask & 1);
}
 
把上面这两个函数写在一起就可以实现软件复位了~~
void SoftReset(void)
{
__set_FAULTMASK(1);      // 关闭所有中端
NVIC_SystemReset();// 复位
}

测试:按键中断进行软件复位,独立看门狗复位,窗口看门狗复位

测试发现:分别使用软件复位,独立看门狗复位,窗口看门狗复位,复位按键,掉电复位,都会触发复位按键标识位。

 PINRST
SFTRST
RCC->CSR:
RCC->CSR:
PINRST
IWDGRST
RCC->CSR:
RCC->CSR:
PINRST
WWDGRST
RCC->CSR:
RCC->CSR:
PINRST
RCC->CSR:
RCC->CSR:
PINRST
PORRST
RCC->CSR:c000000
RCC->CSR:

测试结果

STM32:获取复位源,软件复位的更多相关文章

  1. STM32软件复位(基于库文件V3.5)

    源:STM32软件复位(基于库文件V3.5) void SoftReset(void) { __set_FAULTMASK(); // 关闭所有中端 NVIC_SystemReset();// 复位 ...

  2. STM32 软件复位并模拟USB拔插

    最近做了个USB跟上位机的通信,需要软件对MCU进行复位,复位后如果USB没有拔插,PC就不会重新枚举USB为了解决这个问题,我做了软件复位跟,软件模拟USB拔插. 这里我用的是HAL库的软件复位,复 ...

  3. AVR编程_如何通过软件复位AVR?(转)

    源:http://blog.sina.com.cn/s/blog_493520900100bpos.html Question 如何通过软件复位AVR? Answer 如果你想通过软件复位AVR,你应 ...

  4. JLink 软件复位、Halt及运行小工具

    调试硬件时常常需要复位目标芯片,每次断电上电太麻烦,又不喜欢总打开segger的命令行,于是就搞了这个小工具:   QT绿色软件,解压即可运行,打开JLinkRST.exe,点击Connect即可通过 ...

  5. 九,ESP8266 判断是断电上电(强制硬件复位)之后运行的内部程序还是内部软件复位之后运行的程序(基于Lua脚本语言)

    现在我有一个需求,WIFI模块控制一个继电器,我要做的是如果内部程序跑乱了,造成了内部程序复位重启,那么控制继电器的状态不能改变 如果是设备断电了,然后又来电了,我需要的是继电器一定要是断开才好.不能 ...

  6. STM32f103软件复位

    参考博客: http://bbs.21ic.com/icview-1251690-1-1.html stm32f103rct 软件复位函数: 在core_cm3.h文件 static __INLINE ...

  7. 如何禁止KEIL初始化RAM为零& 如何判断是软复位还是上电复位

    (1)如何禁止KEIL初始化RAM为零? 1. 在KEIL Noinit 打钩 2. <1> 另须对需要热启动保持的变量用 _at_ 关键字指定某个区域,否则还是没用 <2>或 ...

  8. 【安卓本卓】Android系统源码篇之(一)源码获取、源码目录结构及源码阅读工具简介

    前言        古人常说,“熟读唐诗三百首,不会作诗也会吟”,说明了大量阅读诗歌名篇对学习作诗有非常大的帮助.做开发也一样,Android源码是全世界最优秀的Android工程师编写的代码,也是A ...

  9. vc++获取网页源码之使用import+接口方式

    1.使用IWinHttpRequest获取网页源码 首先要创建基于对话框的mfc应用程序 2.import+接口方式 首先导入winhttp.dll,使用IWinHttpRequest接口 #impo ...

随机推荐

  1. 【USACO】wormholes 【暴力】

    题意:给出2K个平面上的点,给它们一一配对,问有多少种配对方法使得存在从某个点一直向右走会陷在循环里(K<=6) 思路:由于k很小,配对方法的话暴力枚举,然后判环,判环时需要注意的是一条直线上的 ...

  2. VS Code 列编辑功能说明

    新版本v1.13.1或者附近的版本中的列编辑功能已经调整. 一.多光标插入功能 Alt+鼠标左键,添加多光标输入 二.自由多行选择 Alt键+鼠标左键拖动选择各行的部分内容 三.列选择 Shift+A ...

  3. 汕头市赛srm10 T2

    n个数,分组,数Ai要在至少含有Ai个数的组,求最多分多少组. 方法一:大的数应该尽量跟大的在一起,这样才能让小的出现很多很多组,所以从大到小排序,给当前序列中最大的数x分x个数.代码如下: #inc ...

  4. transient 关键字

    java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.换句话来说就是,用transient关键字标记的成员变量不参与序列化过程.   作用 Jav ...

  5. Java的finally语句在try或catch中的return语句执行之后还是之前?

    import java.util.HashMap; import java.util.Map; public class FinallyDemo1 { public static void main( ...

  6. ArcEngine中IFeatureClass.Search(filter, Recycling)方法中Recycling参数的理解

    转自 ArcEngine中IFeatureClass.Search(filter, Recycling)方法中Recycling参数的理解   ArcGIS Engine中总调用IFeatureCla ...

  7. jmeter的master远程运行和停止slave

    jmeter可以部署成master-slave或者叫client-server模式,一个master(client)可以同时控制多个slave(server). 在linux系统下,master(cl ...

  8. Bootstrap的js插件之弹出框(popover)

    data-toggle="popover"--使弹出框可以切换状态: title--设置弹出框的标题: data-content--设置弹出框的内容部分: data-placeme ...

  9. ART虚拟机之Trace原理(转)

    一.概述 Android 6.0系统采用的art虚拟机,所有的Java进程都运行在art之上,当应用发生ANR(Application Not Response,其中最终的一个环节便是向目标进程发送信 ...

  10. C#/AutoCAD 2018/ObjectArx/二次开发添加圆对象的的例子(五)

    C#/AutoCAD 2018/ObjectArx/二次开发添加圆对象的的例子(五) 1.创建一个图形对象的步骤如下见上一篇博客(三)2.添加删除实体的工具函数见上一篇博客(四) 3.添加圆的例子(完 ...