STM32:获取复位源,软件复位
RCC CSR寄存器会存储复位标示,可通过它来知道复位原因,来源:
1 if(RCC_GetFlagStatus(RCC_FLAG_PINRST)) 2 printf("PINRST\r\n"); 3 if(RCC_GetFlagStatus(RCC_FLAG_PORRST)) 4 printf("PORRST\r\n"); 5 if(RCC_GetFlagStatus(RCC_FLAG_SFTRST)) 6 printf("SFTRST\r\n"); 7 if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)) 8 printf("IWDGRST\r\n"); 9 if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST)) 10 printf("WWDGRST\r\n"); 11 if(RCC_GetFlagStatus(RCC_FLAG_LPWRRST)) 12 printf("LPWRRST\r\n"); 13 printf("RCC->CSR:%x \r\n",RCC->CSR); 14 RCC->CSR|=0X1000000 ; //清楚中断标示 15 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();// 复位
}
测试:按键中断进行软件复位,独立看门狗复位,窗口看门狗复位
测试发现:分别使用软件复位,独立看门狗复位,窗口看门狗复位,复位按键,掉电复位,都会触发复位按键标识位。
1 PINRST 2 SFTRST 3 RCC->CSR:14000000 4 RCC->CSR:0 5 PINRST 6 IWDGRST 7 RCC->CSR:24000000 8 RCC->CSR:0 9 PINRST 10 WWDGRST 11 RCC->CSR:44000000 12 RCC->CSR:0 13 PINRST 14 RCC->CSR:4000000 15 RCC->CSR:0 16 PINRST 17 PORRST 18 RCC->CSR:c000000 19 RCC->CSR:0