STM32开发 -- 复位类型判断

2019-06-14来源: eefocus关键字:STM32开发  复位类型  MCU重启

复位类型的情况有多种,会导致MCU重启。

因此我们有必要确认一下是何种复位导致的。


一、复位类型

想要查看复位类型可以看一下RCC_GetFlagStatus函数说明


/ **

  * @brief检查是否设置了指定的RCC标志。

  * @param RCC_FLAG:指定要检查的标志。

  *

  *对于@b STM32_Connectivity_line_devices,此参数可以是其中之一

  *以下值:

  * @arg RCC_FLAG_HSIRDY:HSI振荡器时钟就绪

  * @arg RCC_FLAG_HSERDY:准备好HSE振荡器时钟

  * @arg RCC_FLAG_PLLRDY:PLL时钟就绪

  * @arg RCC_FLAG_PLL2RDY:PLL2时钟就绪

  * @arg RCC_FLAG_PLL3RDY:PLL3时钟就绪

  * @arg RCC_FLAG_LSERDY:LSE振荡器时钟就绪

  * @arg RCC_FLAG_LSIRDY:LSI振荡器时钟就绪

  * @arg RCC_FLAG_PINRST:引脚复位

  * @arg RCC_FLAG_PORRST:POR / PDR重置

  * @arg RCC_FLAG_SFTRST:软件重置

  * @arg RCC_FLAG_IWDGRST:独立看门狗复位

  * @arg RCC_FLAG_WWDGRST:窗口看门狗复位

  * @arg RCC_FLAG_LPWRRST:低功耗复位

  *

  *对于@b other_STM32_devices,此参数可以是以下值之一:

  * @arg RCC_FLAG_HSIRDY:HSI振荡器时钟就绪

  * @arg RCC_FLAG_HSERDY:准备好HSE振荡器时钟

  * @arg RCC_FLAG_PLLRDY:PLL时钟就绪

  * @arg RCC_FLAG_LSERDY:LSE振荡器时钟就绪

  * @arg RCC_FLAG_LSIRDY:LSI振荡器时钟就绪

  * @arg RCC_FLAG_PINRST:引脚复位

  * @arg RCC_FLAG_PORRST:POR / PDR重置

  * @arg RCC_FLAG_SFTRST:软件重置

  * @arg RCC_FLAG_IWDGRST:独立看门狗复位

  * @arg RCC_FLAG_WWDGRST:窗口看门狗复位

  * @arg RCC_FLAG_LPWRRST:低功耗复位

  *

  * @retval RCC_FLAG的新状态(SET或RESET)。

  * /



二、记录系统重启的方式

printf("rnThe RCC_CSR=0x%xrn",RCC->CSR);

printf("rnThe RCC_FLAG_LPWRRST=0x%xrn", RCC_GetFlagStatus(RCC_FLAG_LPWRRST));

printf("rnThe RCC_FLAG_PINRST=0x%xrn" , RCC_GetFlagStatus(RCC_FLAG_PINRST));

printf("rnThe RCC_FLAG_IWDGRST=0x%xrn",  RCC_GetFlagStatus(RCC_FLAG_IWDGRST));

printf("rnThe RCC_FLAG_SFTRST=0x%xrn" ,  RCC_GetFlagStatus(RCC_FLAG_SFTRST));

printf("rnThe RCC_FLAG_PORRST=0x%xrn" ,  RCC_GetFlagStatus(RCC_FLAG_PORRST));

RCC_ClearFlag();//清除掉复位源Flag;


无复位打印:


The RCC_CSR=0xc000003


The RCC_FLAG_LPWRRST=0x0


The RCC_FLAG_PINRST=0x1


The RCC_FLAG_IWDGRST=0x0


The RCC_FLAG_SFTRST=0x0


The RCC_FLAG_PORRST=0x1


RCC_ClearFlag


看门狗复位打印:


The RCC_CSR=0x20000003


The RCC_FLAG_LPWRRST=0x0


The RCC_FLAG_PINRST=0x0


The RCC_FLAG_IWDGRST=0x1


The RCC_FLAG_SFTRST=0x0


The RCC_FLAG_PORRST=0x0


RCC_ClearFlag


三、基于库的STM32软件复位(库V3.5)

参看:基于库的STM32软件复位

在官方软件库的 core_cm3.h 文件里直接提供了系统复位的函数 :


/**

  * @brief启动系统重置请求。

 *

  *启动系统重置请求以重置MCU

 */

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 */

}


但是Cortex-M3权威指南中提到一个要注意的问题:

从SYSRESETREQ 被置为有效,到复位发生器执行复位命令, 往往会有一个延时。在此延时期间,处理器仍然可以响应中断请求。但我们的本意往往是要 让此次执行到此为止,不要再做任何其它事情了。所以,最好在发出复位请求前,先把 FAULTMASK 置位。所以最好在复位前将FAULTMASK 置位。


在官方软件库的 core_cm3.h 文件里同样也提供了这个函数:



118/5000

/**

  * @brief设置Fault Mask值

 *

  * @param faultMask faultMask值

 *

  *设置故障屏蔽寄存器

 */

static __INLINE void __set_FAULTMASK(uint32_t faultMask)

{

  register uint32_t __regFaultMask       __ASM("faultmask");

  __regFaultMask = (faultMask & 1);

}


最后,通过调用整合的SoftReset函数即可进行软件复位了:


/**

  * @brief通过软件重置mcu

 *

  * @param无

 *

  * @note使用3.5版本的固件库。

 */

void SoftReset(void)

{

    __set_FAULTMASK(1); // 关闭所有中断

    NVIC_SystemReset(); // 复位

}


我的复位:


void BSP_CPU_Reset(void)

{

/* system soft reset */

NVIC_SystemReset(); // 函数在core_m3.c中

//*((u32 *)0xE000ED0C) = 0x05fa0004;

while(1);

}


关键字:STM32开发  复位类型  MCU重启

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic464663.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32程序软件复位
下一篇:STM32硬件复位时间

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm32通过spi连接esp8266的hspi 开发

刚刚做了stm32通过spi连接esp8266的开发,目前已经解决了遇到的大多数问题,基本可以交付使用了,写一篇文章留作记录,也可以给以后做这个的朋友做为参考。esp8266模块本身发布的时候默认里边烧写的是AT固件,虽然硬件上有spi的引脚,但是并不支持spi的通信,如果要支持spi的通信,自行修改编译esp8266的sdk,写自己需要的代码来实现。本身sdk中有相关的例程,根据例程的代码修改调试就可以实现相应的功能。使用spi的好处,第一 可以节省一个串口,因为stm的串口资源是比较有限的。另外spi的通讯速度要比串口快一些。这篇文章将包含如下的一些内容:1,stm32 spi的驱动如何开发?2,esp8266端的驱动如何开发
发表于 2019-09-12
stm32通过spi连接esp8266的hspi 开发

STM32Cube开发-PWM

的时候, IO 输出低电平(0),当 CNT 值大于等于 CCRx 的时候,IO 输出高电平(1),当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率,这就是 PWM 输出的原理。2.    stm32cube配置和说明打开STM32CubeMX新建工程,选择STM32F103ZET6芯片,选择外部高速晶振(HSE)。LED1管脚PB6配置为定时器4的通道1输出。同时TIM4的通道1配置为PWM。  脉冲宽度调制模式可以生成一个信号,该信号频率由自动重载寄存器
发表于 2019-09-11
STM32Cube开发-PWM

嵌入式固件开发之二——直接操作STM32寄存器的LED点灯

2 直接操作STM32寄存器的LED点灯测试程序2.1 创建并编译工程双击桌面上的“Keil uVision5”图标,启动MDK。点击“Project”->“New uVision Project…”菜单项,打开工程创建向导。选择工程目录,设置工程名字,点击保存。在接下来的对话框中选择对应的SoC,点击“OK”。在接下来的对话框中选择最基本的运行时软件组件,点击“OK”。管理工程的项目。点击如下的图标,启动管理程序。设置目标的名字为“STM32F103”,第一个组的名字为“Sources”,这些名字都可以根据需要任意取名。如下图所示,设置好后,点击“OK”完成工程的项目管理。设置完成后,会在MDK集成开发环境的左边看到如下
发表于 2019-09-11
嵌入式固件开发之二——直接操作STM32寄存器的LED点灯

[正点原子]STM32开发板F103 第41讲 RTC实时时钟备份区域BKP原理

闹钟中断。BKP备份寄存器的访问,RTC相关寄存器RTC 相关的寄存器定义在stm32f10x.h里面有一个结构体。寄存器的介绍在《中文参考手册》上图中的 RTC_CRH  控制寄存器主要是一些中断的使能位,如果要开启中断就将相应位使能。OWF   是溢出标志ALRF  闹钟标志 SECF  秒标志位3   RSF 寄存器同步标志,在需要改寄存器之前先要确定RSF寄存器已经同步位4  CNF位  配置标志 ,如果要修改CRH/CRL 等寄存器的时候,先要将该位置 1,进入配置模式,配置完之后要将他配置为0,退出配置模式。RTCOFF
发表于 2019-09-09
[正点原子]STM32开发板F103 第41讲 RTC实时时钟备份区域BKP原理

STM32F103程序设计-1-STM32开发环境的建立

STM32开发环境的建立需要使用的软件有两个,一个是编写单片机程序的软件Keil MDK,另一个是串口下载程序时要使用的软件MCUISP。如果使用仿真器下载程序的话则需要安装仿真器的驱动程序,这个在以后的课程中将进行讲解。下面先看一下孟老师给大家的相关软件如下图所示。其中mdk_513.exe为Keil MDK的安装包,该软件的安装一路点击Next,直到最后看到Finish安装结束。安装结束后打开软件,软件界面如下图所示。点击上图中的按钮将弹出一个安装各种型号单片机所需包的界面,如下图所示。Keil5与之前版本不同的是要单独安装你所使用单片机的相应安装包。如果在线联网不成功,有很大的可能是软件没能连到相关网站上,下载安装进度被卡在
发表于 2019-09-05
STM32F103程序设计-1-STM32开发环境的建立

STM32开发 -- CRC校验码

通信协议里有CRC校验码,计算从报文的起始字节到报文内容最后一个字节的crc16的值。举个例子:远程控制命令集5B 20 00 0A 00 01 0A 01 FE 00 01 00 AB 89CRC校验码为:AB 89一、RTU 檢查碼(CRC)計算器第一种:参看:RTU 檢查碼(CRC)計算器大小端转换后,CRC检查码为:AB 89说明,这个计算器还是可以用的。第二种:参看:On-line CRC calculation and free library二、运算规则RTU检查码(CRC)计算,运算规则如下:步骤1:令16位暂存器(CRC暂存器)= 0xFFFF。步骤2:异或第一个8位字节的消息指令与低位元16位CRC暂存器,做异或
发表于 2019-09-02
STM32开发 -- CRC校验码

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved