作者:良知犹存

转载授权以及围观:欢迎添加微信公众号: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. JDK动态代理案例与原理分析

    一.JDK动态代理实现案例 Person接口 package com.zhoucong.proxy.jdk; public interface Person { // 寻找真爱 void findlo ...

  2. js 必须为字母或下划线, 一旦创建不能修改

    <div class="form-group"> <label class="col-lg-2 control-label" for=&quo ...

  3. Kubernetes官方java客户端之八:fluent style

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. 详解Vue中的computed和watch

    作者:小土豆 博客园:https://www.cnblogs.com/HouJiao/ 掘金:https://juejin.cn/user/2436173500265335 1. 前言 作为一名Vue ...

  5. spring cloud gateway 日志打印

    从api请求中获取访问的具体信息,是一个很常见的功能,这几天在研究springcloud,使用到了其中的gateway,刚好将研究的过程结果都记录下来 0. Version <parent> ...

  6. 【Git】2、Linux快速安装Git环境 & oh-my-zsh

    Linux快速安装Git环境 文章目录 Linux快速安装Git环境 1.Linux安装Git 2.安装zsh 3.安装oh-my-zsh 3.1.安装oh-my-zsh 3.2. 测试验证 4.小结 ...

  7. /etc/hosts导致的问题

    今天安装完成orzdba之后,执行./orzdba -l 报如下错误: Usage: Socket::inet_ntoa(ip_address_sv) at /var/lib/mysql/trunk/ ...

  8. 【葵花宝典】kolla部署OpenStack-AllinOne

    1.关闭防火墙以及内核安全机制 systemctl stop firewalld systemctl disable firewalld ##永久性关闭 setenforce 0 sed -i 's/ ...

  9. 关于阿里云服务器安装了Apache开放80端口访问不了网页

    先用netstat -tlunp查看80端口是否打开,再关闭服务器的防火墙,可以用 systemctl status firewalld 查看防火墙状态  systemctl stop firewal ...

  10. Redis 实战 —— 04. Redis 数据结构常用命令简介

    字符串 P39 Redis 的字符串是一个有字节组成的序列,可以存储以下 3 种类型的值:字节串(byte string).整数.浮点数. 在需要的时候, Redis 会将整数转换成浮点数.整数的取值 ...