各个复位标志解析,让我们对MCU的程序的健康更有把控
作者:良知犹存
转载授权以及围观:欢迎添加微信公众号: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的程序的健康更有把控的更多相关文章
- WordPress搭建教程---购买域名+购买VPS主机+域名DNS解析+网站环境+上传网站程序
WordPress搭建教程 购买域名---NameSilo 购买VPS主机---Vultr 域名DNS解析 网站环境 上传网站程序 参考文章: 1. WordPress搭建教程 https://zhu ...
- Java 解析epub格式电子书,helloWorld程序,附带源程序和相关jar包
秀才坤坤出品 一.epub格式电子书 相关材料和源码均在链接中可以下载:http://pan.baidu.com/s/1bnm8YXT 包括 1.JAVA项目工程test_epub,里面包括了jar包 ...
- mPaaS 小程序架构解析 | 实操演示小程序如何实现多端开发
对于 mPaaS 小程序开发框架,想必读者们并不陌生.它源自于支付宝小程序框架,继承了易开发性.跨平台性及 Native 性能,不仅帮助开发者实现面向自有 App 投放小程序,还可快速构建打包,覆盖支 ...
- ASP.NET Core 依赖注入最佳实践与技巧
ASP.NET Core 依赖注入最佳实践与技巧 原文地址:https://medium.com/volosoft/asp-net-core-dependency-injection-best-pra ...
- 如何快速掌握一款新的MCU? (转)
发布时间:2013-12-15 10:27:51 技术类别:单片机 个人分类:话题思考 任何一款MCU,其基本原理和功能都是大同小异,所不同的只是其外围功能模块的配置及数量.指 ...
- MSP430常见问题之复位系统类
Q1:请问msp430 怎么手动复位啊?是不是连到RST/NMI 上?但是这个脚不是和JTAG 连吗?我看到一些资料上说复位的话还要上拉电阻或者复位电路.A1:JTAG 功能只在下载程序时候使用,正常 ...
- 嵌入式单片机,ATmega328P,外部中断INT0,INT1,INT2,中断标志位介绍
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 使用dig命令解析域名
Linux下解析域名除了使用nslookup之外,开可以使用dig命令来解析域名,dig命令可以得到更多的域名信息. dig的全称是 (domain information groper).它是一个用 ...
- 关于MCU的烧录,下载与其他接口的比较(二)
单片机应用系统由硬件和软件组成,软件的载体是硬件的程序存储器,程序存储器采用只读存储器,这种存储器在电源关闭后,仍能保存程序,在系统上电后,CPU可取出这些指令重新执行.只读存储器(Read Only ...
随机推荐
- JavaScript 内存详解 & 分析指南
前言 JavaScript 诞生于 1995 年,最初被设计用于网页内的表单验证. 这些年来 JavaScript 成长飞速,生态圈日益壮大,成为了最受程序员欢迎的开发语言之一.并且现在的 JavaS ...
- Python基础语法6-冒泡排序
用for循环实现冒泡排序(升序): array = [3,2,1] for i in range(len(array) - 1, 0, -1): for j in range(0, i): if ...
- ps -p 进程号
[root@ma ~]# ps -p 1 PID TTY TIME CMD 1 ? 00:00:01 init
- 【Spring】Spring的事务管理 - 1、Spring事务管理概述(数据库事务、Spring事务管理的核心接口)
Spring事务管理概述 文章目录 Spring事务管理概述 数据库事务 什么是Spring的事务管理? Spring对事务管理的支持 Spring事务管理的核心接口 Platform Transac ...
- 利用Python-docx 读写 Word 文档中的正文、表格、段落、字体等
前言: 前两篇博客介绍了 Python 的 docx 模块对 Word 文档的写操作,这篇博客将介绍如何用 docx 模块读取已有 Word 文档中的信息. 本篇博客主要内容有: 1.获取文档的章节信 ...
- 【Linux】ssh设置了密钥,但ssh登陆的时候还需要输入密码
------------------------------------------------------------------------------------------------- | ...
- SDUST数据结构 - chap9 排序
判断题: 选择题: 编程题: 7-1 排序: 输入样例: 11 4 981 10 -17 0 -20 29 50 8 43 -5 输出样例: -20 -17 -5 0 4 8 10 29 43 50 ...
- gears-绕过rbash
0x00 信息收集 0x01 smb攻击 crunch 生成密码的一个软件 @%%,这个是给的密码参数. crunch 4 4 -t @%%, -o words 最小4位,最长 4位 fcrackzi ...
- Ubuntu下修改缺省dash shell为bash shell
Debian和Ubuntu下缺省使用的是shell是dash,而不是bash.从/bin/sh软连接的指向可以看出这点. 这是一个不同于bash的shell,它主要是为了执行脚本而出现,而不是交互,它 ...
- Redis 实战 —— 01. Redis 数据结构简介
一些数据库和缓存服务器的特性和功能 P4 名称 类型 数据存储选项 查询类型 附加功能 Redis 使用内存存储(in-memory)的非关系数据库 字符串.列表.哈希表.集合.有序集合 每种数据类型 ...