作者:良知犹存

转载授权以及围观:欢迎添加微信公众号:Conscience_Remains

总述

曾经开发的时候遇到这样情况,我们开发的设备需要长时间工作上报信息,但是我们在后台查看上报数据,发现设备总是有断开的情况。因为是远程的设备无法进行现场查看,这个时候我们就用到了MCU的复位的状态解析上报,辅助我们进行诊断故障的来源,可能是程序到死循环,可能是程序hardfault,也可能硬件电源不稳定导致的复位。

综合上面的要求,我们分析一下STM32相应的寄存器,以及讲解相关函数使用方法。

一、MCU寄存器介绍

在stm32开发手册里面选择 RCC寄存器 中的  控制状态寄存器 书签,就可以看到相应的介绍:

其中包含了:低功耗复位标志、窗口看门狗复位标志、独立看门狗复位标志、软件复位标志、上电/掉电复位标志、NRST引脚复位标志。

在RCC功能的这一栏下级菜单 系统复位 里面有对复位比较详细的介绍:

这些复位标志能够被我们解析并保存上报的话,我们就可以通过复位标志的信息进而判断MCU崩溃的原因。下面我来进行介绍相应的标志以及组合判断。

在RCC_CSR所有复位源,复位的时候都会使引脚复位置位,上电复位只产生引脚复位,其余的复位都产生一个引脚复位,和一个相应的自身复位。

所以程序解析的时候先检测是否有pin复位

void GetResetFlag(void)
{
devfaultcode.resetfault = 0;
    
if(RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
{
dprintf("*RCC_FLAG_PINRST\r\n");
devfaultcode.resetfault = 0xF001;
}
if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET)
{
        printf("*RCC_FLAG_IWDGRST\r\n");       
devfaultcode.resetfault = 0xF002;
}
if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST) != RESET)
{
        printf("*RCC_FLAG_WWDGRST\r\n");
devfaultcode.resetfault = 0xF003;
}
if(RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
{
        printf("*RCC_FLAG_PORRST\r\n"); 
devfaultcode.resetfault = 0xF004;
}
if(RCC_GetFlagStatus(RCC_FLAG_SFTRST) != RESET)
{
printf("*RCC_FLAG_SFTRST\r\n");
devfaultcode.resetfault = 0xF005;
}
if(RCC_GetFlagStatus(RCC_FLAG_LPWRRST) != RESET)
{
        printf("*RCC_FLAG_LPWRRST\r\n"); 
devfaultcode.resetfault = 0xF006;
}
RCC_ClearFlag(); //Clears the RCC reset flags.
    ErrListInsert(ErrHead,devfaultcode.resetfault);

printf("devfaultcode:%d\r\n",devfaultcode.resetfault);
}

以上代码通过建立一个单向链表把采集到的复位标志进行保存发送到服务器端。

二、中断故障函数

在开发过程中,我们会遇到hardfault这样的bug,但是如果是远程上报信息,仅凭复位标志是无法检测的,一般hardfault会有软件复位标志和看门狗复位标志(如果设备开启看门狗)。

而我选择了另一种方式,因为这些故障标志在程序复位之后就会消失,所以我在故障发生的时间进行变量记录保存到FLASH,通过自定义的故障码表,再在程序中进行故障出现位置进行故障码的存入,再利用各种通讯方式上报,后台就可以对于设备出现的各种问题按表对照,如同汽车的故障码表一样。

void HardFault_Handler(void)
{
devfaultcode.resetfault = 0xF007;
writeFlash();
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
    printf("HardFault\r\n"); 
}
}
/**
* @brief This function handles Memory Manage exception.
* @param None
* @retval None
*/
void MemManage_Handler(void)
{
devfaultcode.resetfault = 0xF008;
writeFlash();
/* Go to infinite loop when Memory Manage exception occurs */
while (1)
{
    printf("MemManageFault\r\n"); 
}
}
/**
* @brief This function handles Bus Fault exception.
* @param None
* @retval None
*/
/*总线Fault,取址或取值时的内存错误*/
void BusFault_Handler(void)
{
devfaultcode.resetfault = 0xF009;
writeFlash();
/* Go to infinite loop when Bus Fault exception occurs */
while (1)
{
    printf("BusFault\r\n"); 
}
}
/**
* @brief This function handles Usage Fault exception.
* @param None
* @retval None
*/
/*用法 Fault */
void UsageFault_Handler(void)
{
resetfault = 0xF010;
writeFlash();
/* Go to infinite loop when Usage Fault exception occurs */
while (1)
{
    printf("UseageFault\r\n"); 
}
}

通过在程序设备故障码表监控程序的健康,对于任何一个开发者来说都有很多好处,这里只是我通过介绍MCU的标志位继而扩展的话题,下一次,我把我用来存放故障码的链表,再详细介绍一下使用过程。

这就是我分享的复位等一些标志的使用过程,里面代码是实践过的,如果大家有什么更好的思路,欢迎分享交流哈。

更多分享,扫码关注我

各个复位标志解析,让我们对MCU的程序的健康更有把控的更多相关文章

  1. WordPress搭建教程---购买域名+购买VPS主机+域名DNS解析+网站环境+上传网站程序

    WordPress搭建教程 购买域名---NameSilo 购买VPS主机---Vultr 域名DNS解析 网站环境 上传网站程序 参考文章: 1. WordPress搭建教程 https://zhu ...

  2. Java 解析epub格式电子书,helloWorld程序,附带源程序和相关jar包

    秀才坤坤出品 一.epub格式电子书 相关材料和源码均在链接中可以下载:http://pan.baidu.com/s/1bnm8YXT 包括 1.JAVA项目工程test_epub,里面包括了jar包 ...

  3. mPaaS 小程序架构解析 | 实操演示小程序如何实现多端开发

    对于 mPaaS 小程序开发框架,想必读者们并不陌生.它源自于支付宝小程序框架,继承了易开发性.跨平台性及 Native 性能,不仅帮助开发者实现面向自有 App 投放小程序,还可快速构建打包,覆盖支 ...

  4. ASP.NET Core 依赖注入最佳实践与技巧

    ASP.NET Core 依赖注入最佳实践与技巧 原文地址:https://medium.com/volosoft/asp-net-core-dependency-injection-best-pra ...

  5. 如何快速掌握一款新的MCU? (转)

      发布时间:2013-12-15 10:27:51 技术类别:单片机     个人分类:话题思考       任何一款MCU,其基本原理和功能都是大同小异,所不同的只是其外围功能模块的配置及数量.指 ...

  6. MSP430常见问题之复位系统类

    Q1:请问msp430 怎么手动复位啊?是不是连到RST/NMI 上?但是这个脚不是和JTAG 连吗?我看到一些资料上说复位的话还要上拉电阻或者复位电路.A1:JTAG 功能只在下载程序时候使用,正常 ...

  7. 嵌入式单片机,ATmega328P,外部中断INT0,INT1,INT2,中断标志位介绍

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  8. 使用dig命令解析域名

    Linux下解析域名除了使用nslookup之外,开可以使用dig命令来解析域名,dig命令可以得到更多的域名信息. dig的全称是 (domain information groper).它是一个用 ...

  9. 关于MCU的烧录,下载与其他接口的比较(二)

    单片机应用系统由硬件和软件组成,软件的载体是硬件的程序存储器,程序存储器采用只读存储器,这种存储器在电源关闭后,仍能保存程序,在系统上电后,CPU可取出这些指令重新执行.只读存储器(Read Only ...

随机推荐

  1. 直播预告 | 开源的云原生开发环境 —— Nocalhost

    直播来啦!本次云原生学院邀请到腾讯云 CODING DevOps 后端工程师王炜为大家分享<开源的云原生开发环境 -- Nocalhost>. 直播信息 讲师:王炜 - 腾讯云 CODIN ...

  2. C#处理医学图像(二):基于Hessian矩阵的医学图像增强与窗宽窗位

    根据本系列教程文章上一篇说到,在完成C++和Opencv对Hessian矩阵滤波算法的实现和封装后, 再由C#调用C++ 的DLL,(参考:C#处理医学图像(一):基于Hessian矩阵的血管肺纹理骨 ...

  3. oracle 11g 安装与卸载

    安装 点击是,这是位数不一致,但可用. 桌面类――这种安装方式一般适用于台式机和笔记本.它包含一个最小数据库和最低的配置需求. 服务器类――这种安装方式适用于服务器,例如,它会向您提供数据中心和用于支 ...

  4. session、cookie、token的区别

    从安全性优先级来说: 1.优先级 Cookie<session<token 2. 安全性 Cookie: ①cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺 ...

  5. 【Oracle】to_data() to_char()用法解析

    1.转换函数 与date操作关系最大的就是两个转换函数:to_date(),to_char()      to_date() 作用将字符类型按一定格式转化为日期类型:      具体用法:to_dat ...

  6. P2979 [USACO10JAN]奶酪塔Cheese Towers(完全背包,递推)

    题目描述 Farmer John wants to save some blocks of his cows' delicious Wisconsin cheese varieties in his ...

  7. CTFhub刷题记录

    一 [WesternCTF2018]shrine 没什么好说的,SSTI模版注入类问题,过滤了()但是我们不慌.开始注入,{{29*3}}测试通过. 发现是jinjia2的模版注入.关键点在于没有() ...

  8. Redis 实战 —— 02. Redis 简单实践 - 文章投票

    需求 功能: P15 发布文章 获取文章 文章分组 投支持票 数值及限制条件 P15 如果一篇文章获得了至少 200 张支持票,那么这篇文章就是一篇有趣的文章 如果这个网站每天有 50 篇有趣的文章, ...

  9. Ubuntu源、Python虚拟环境及pip源配置

    Ubuntu 命令行更改源 在修改source.list前,最好先备份一份 软件源的地址配置文件在 /etc/apt/sources.list 执行备份命令 sudo cp /etc/apt/sour ...

  10. 手动添加Ini4idea,解决pycharm无法打开ini文件

    1. 查看本地pycharm的版本号 help -> about 2. 进入官网:http://plugins.jetbrains.com,选中pycharm及相关版本,搜索ini,切到版本,下 ...