zoukankan      html  css  js  c++  java
  • STM32:获取复位源,软件复位

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

     1     if(RCC_GetFlagStatus(RCC_FLAG_PINRST))
     2        printf("PINRST
    ");
     3     if(RCC_GetFlagStatus(RCC_FLAG_PORRST))
     4        printf("PORRST
    ");
     5     if(RCC_GetFlagStatus(RCC_FLAG_SFTRST))
     6        printf("SFTRST
    ");
     7     if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST))
     8        printf("IWDGRST
    ");
     9     if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST))
    10        printf("WWDGRST
    ");
    11     if(RCC_GetFlagStatus(RCC_FLAG_LPWRRST))
    12        printf("LPWRRST
    ");
    13     printf("RCC->CSR:%x 
    ",RCC->CSR);
    14     RCC->CSR|=0X1000000    ; //清楚中断标示
    15     printf("RCC->CSR:%x 
    ",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 
    测试结果
  • 相关阅读:
    [公告]博客园新服务器已下订单
    清除SearchNet.exe
    [新闻]微软将在2007年发布的Office产品阵容
    卸载Internet Explorer 7 Beta 2 Preview引起原来的IE无法正常使用
    博客园准备购买新服务器
    [微软活动公告]微软最有价值专家(MVP)四月份在线申请开始了
    [公告]今晚数据库迁移至新服务器
    请wz不要把别人的文章当作自己的文章发表
    SQL Server 2000 To SQL Server 2005
    [公告]博客园数据库已成功迁移至新服务器
  • 原文地址:https://www.cnblogs.com/wwjdwy/p/3738460.html
Copyright © 2011-2022 走看看