datasheet

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

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

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

推荐阅读

stm32使用MDK开发中的一些常见问题

1. 解决:keil报错invalid redeclaration of type name "s32"答案:一般在Target Options C/C++选项卡里的Include Paths 里要添加几个固定的头文件路径,..CMSISCM3CoreSupport..CMSISCM3DeviceSupportSTSTM32F10x..STM32F10x_StdPeriph_Driverinc..userinc 是头文件路径问题,KEIL只要有一个头文件找不到,就会自已从本身的INC文件夹找头文件,结果就会出现以上错提示。把老版的头文件改为STM32F10X.H.新的库已经
发表于 2019-06-13

基于stm32的自定义HID设备开发与上位机通讯实现

: Index of string descriptor describing  the configuration*/  0xE0,         /*bmAttributes: bus powered and Support Remote Wake-up */  0x32,         /*MaxPower 100 mA: this current is used for detecting Vbus*/    /************** Descriptor of
发表于 2019-06-13
基于stm32的自定义HID设备开发与上位机通讯实现

STM32开发 -- 烧写/启动模式

堆栈顶的地址,并从启动存储器的0x0000 0004指示的地址开始执行代码。因为固定的存储器映像,代码区始终从地址0x0000 0000开始(通过ICode和DCode总线访问),而数据区(SRAM)始终从地址0x2000 0000开始(通过系统总线访问)。 Cortex-M3的CPU始终从ICode总线获取复位向量,即启动仅适合于从代码区开始(典型地从Flash启动)。 STM32F10xxx微控制器实现了一个特殊的机制,系统可以不仅仅从Flash存储器或系统存储器启动,还可以从内置SRAM启动。根据选定的启动模式,主闪存存储器、系统存储器或SRAM可以按照以下方式访问:● 从主闪存存储器启动:主闪存存储器被映射到启动空间
发表于 2019-06-12
STM32开发 -- 烧写/启动模式

STM32F4开发板----GPIO(001)

STM32F4开发板快速入门—-GPIO篇 GPIO 设置输入/出总共8种模式* 输入浮空,输入上拉,输入下拉,模拟输入。* 开漏输出,推挽输出,推挽复用共功能,开漏复用功能模式选择的话,一般得看具体电路了,具体看输入的信号,比如接低电平信号,上拉成高电平,接高电平信号下拉成低电平。初始化参数/**  * @brief   GPIO Init structure definition    */typedef struct{  uint32_t GPIO_Pin;           
发表于 2019-05-30

STM32F4开发板----串口(002)

USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct);void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler);void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState NewState);void USART_OneBitMethodCmd(USART_TypeDef* USARTx
发表于 2019-05-30

STM32 关于复位类型的判断及软件复位 bug

STM 32在复位时,有严重BUG:1.上电复位和外置的看门狗芯片重启复位是无法区分开来的!RCC_FLAG_BORRST,  RCC_FLAG_PINRST,   RCC_FLAG_LPWRRST三个都复位了!2.这样当要在上电复位初始化关键代码时,这些代码看门狗复位则不用重启,这个关键代码会导致应用业务的异常!若两个中断分不开,导致系统异常看门狗复位时影响业务!/*RCC_FLAG_BORRST:     POR/PDR or BOR reset  //Power-on/power-down reset (POR/PDR reset) or brownout (BOR
发表于 2018-05-19

小广播

何立民专栏

单片机及嵌入式宝典

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

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