[STM32F1] STM32:获取复位源,软件复位

[复制链接]
559|6
 楼主| 喂什么玩意 发表于 2022-11-18 12:37 | 显示全部楼层 |阅读模式
RCC CSR寄存器会存储复位标示,可通过它来知道复位原因,来源:   

  1. 1     if(RCC_GetFlagStatus(RCC_FLAG_PINRST))
  2. 2        printf("PINRST\r\n");
  3. 3     if(RCC_GetFlagStatus(RCC_FLAG_PORRST))
  4. 4        printf("PORRST\r\n");
  5. 5     if(RCC_GetFlagStatus(RCC_FLAG_SFTRST))
  6. 6        printf("SFTRST\r\n");
  7. 7     if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST))
  8. 8        printf("IWDGRST\r\n");
  9. 9     if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST))
  10. 10        printf("WWDGRST\r\n");
  11. 11     if(RCC_GetFlagStatus(RCC_FLAG_LPWRRST))
  12. 12        printf("LPWRRST\r\n");
  13. 13     printf("RCC->CSR:%x \r\n",RCC->CSR);
  14. 14     RCC->CSR|=0X1000000    ; //清楚中断标示
  15. 15     printf("RCC->CSR:%x \r\n",RCC->CSR);   



   简单示例
  软件复位:转载

ContractedBlock.gif
ExpandedBlockStart.gif

评论

转载于:https://www.cnblogs.com/wwjdwy/p/3738460.html  发表于 2022-11-18 15:05
 楼主| 喂什么玩意 发表于 2022-11-18 14:55 | 显示全部楼层
在官方软件库的 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 */
}
 楼主| 喂什么玩意 发表于 2022-11-18 15:01 | 显示全部楼层
但是不是直接调用这个函数就OK了?
  
在Cortex-M3权威指南中有这么一句话:
这里有一个要注意的问题:从SYSRESETREQ 被置为有效,到复位发生器执行复位命令,往往会有一个延时。在此延时期间,处理器仍然可以响应中断请求。但我们的本意往往是要让此次执行到此为止,不要再做任何其它事情了。所以,最好在发出复位请求前,先把
FAULTMASK 置位。 所以最好在将FAULTMASK 置位才万无一失。  
 楼主| 喂什么玩意 发表于 2022-11-18 15:03 | 显示全部楼层
同样官方 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();// 复位
}
 楼主| 喂什么玩意 发表于 2022-11-18 15:04 | 显示全部楼层
测试:按键中断进行软件复位,独立看门狗复位,窗口看门狗复位

测试发现:分别使用软件复位,独立看门狗复位,窗口看门狗复位,复位按键,掉电复位,都会触发复位按键标识位。
 楼主| 喂什么玩意 发表于 2022-11-18 15:05 | 显示全部楼层
  1. 1 PINRST
  2. 2 SFTRST
  3. 3 RCC->CSR:14000000
  4. 4 RCC->CSR:0
  5. 5 PINRST
  6. 6 IWDGRST
  7. 7 RCC->CSR:24000000
  8. 8 RCC->CSR:0
  9. 9 PINRST
  10. 10 WWDGRST
  11. 11 RCC->CSR:44000000
  12. 12 RCC->CSR:0
  13. 13 PINRST
  14. 14 RCC->CSR:4000000
  15. 15 RCC->CSR:0
  16. 16 PINRST
  17. 17 PORRST
  18. 18 RCC->CSR:c000000
  19. 19 RCC->CSR:0
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

647

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部