对每个复位标志的分析使我们可以更好地控制MCU程序的运行状况
作者:conscience仍然存在转载授权和旁观者:欢迎添加Micro Signal:Conscience_Remains在遇到这种情况时,我们已经开发了概述,我们已经开发了一种报告长时间工作所需信息的设备,但是我们在报告中看到了报告数据。背景,总是找设备有断线的情况。
由于它是无法在现场查看的远程设备,因此,我们此时使用MCU的重置状态分析报告来帮助我们诊断故障源。它可能是无限循环程序,程序硬故障或不稳定的硬件电源。
结果重置。根据上述要求,让我们分析STM32的相应寄存器,并说明如何使用相关功能。
1. MCU寄存器介绍在stm32开发手册的RCC寄存器中选择控制状态寄存器书签,可以看到相应的介绍:包括:低功耗复位标志,窗口看门狗复位标志,独立看门狗复位标志,软件复位标志,上电/掉电复位标志,NRST引脚复位标志。在RCC功能“系统重置”的下级菜单中,有更详细的重置介绍:如果我们可以解析并保存和报告这些重置标志,我们可以通过以下信息判断MCU崩溃的原因:重置标志。
让我介绍一下相应的符号和组合判断。复位时,RCC_CSR中的所有复位源都将复位引脚。
上电复位仅产生引脚复位,而所有其他复位产生引脚复位和相应的自复位。因此,在分析程序时,首先检查是否有引脚复位,然后左右滑动以查看所有代码>>> void GetResetFlag(void){devfaultcode.resetfault = 0; if(RCC_GetFlagStatus(RCC_FLAG_PINRST)!= RESET){dprintf(“ * RCC_FLAG_PINRST) ”); devfaultcode.resetfault = 0xF001;} if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)!= RESET){printf(“ * RCC_FLAG_IWDGRST ”); devfaultcode.resetfault = 0xF002;} if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST)!= RESET){printf(“ * RCC_FLAG_WWDGRST ”); devfaultcode.resetfault = 0xF003;} if(RCC_GetFlagStatus(RCC_FLAG_PORRST)!= RESET){printf(“ * RCC_FLAG_PORRST ”); devfaultcode.resetfault = 0xF004;} if(RCC_GetFlagStatus(RCC_FLAG_SFTRST)!= RESET){printf(“ * RCC_FLAG_SFTRST ”); devfaultcode.resetfault = 0xF005;} if(RCC_GetFlagStatus(RCC_FLAG_LPWRRST)!= RESET){printf(“ * RCC_FLAG_LPWRRST ”); devfaultcode.resetfault = 0xF006;} RCC_ClearFlag(); //清除RCC重置标志。
ErrListInsert(ErrHead,devfaultcode.resetfault); printf(" devfaultcode:%d 上面的代码创建一个单向链接列表,以保存收集的重置标志并将其发送到服务器。 2.中断故障功能在开发过程中,我们会遇到诸如硬件故障之类的错误,但是如果信息是远程报告的。
仅靠复位标志不能检测到它。通常,hardfault具有软件重置标志和看门狗重置标志(如果设备打开了看门狗)。
但是我选择了另一种方法,因为这些故障标志位于程序重置后的位置,它将消失,因此我通过自定义故障代码表将变量记录保存在故障发生时的FLASH中,然后保存在发生故障的程序中查找故障代码,然后使用各种通讯方法进行报告,后台可以根据该表比较设备的各种问题,就像汽车的故障代码表一样。左右滑动以查看所有代码>>> void HardFault_Handler(void){devfaultcode.resetfault = 0xF007; writeFlash(); / *当发生“硬故障”异常时进入无限循环* / while(1){printf(“ HardFault ”); }} / ** * @brief此函数处理内存管理异常。
* @param无* @retval无* / void MemManage_Handler(void){devfaultcode.resetfault = 0xF008; writeFlash(); / *当发生内存管理异常时进入无限循环* /而(1){printf(“ MemManageFault ”); })/ ** * @brief此函数处理总线故障异常。 * @param无* @retval无* // *总线故障,地址或值期间的内存错误* / void BusFault_Handler(void){devfaultcode.resetfault = 0xF009; writeFlash(); / *发生Bus Fault异常时进入无限循环* / while(1){printf(“ BusFault ”); }} / ** * @brief此函数处理“用法故障”异常。
* @param无* @retval无* // * Usage Fault * / void UsageFault_Handler(void){resetfault = 0xF010; writeFlash(); / *当出现用法错误异常时转到无限循环* /而(1){printf(“ UseageFault ”); }}通过程序中的设备故障代码表监视程序的运行状况,对任何开发人员来说都有很多好处。这只是我将介绍MCU的标志位而扩展的主题。
下次,我将使用“存储故障的链接列表”。
由于它是无法在现场查看的远程设备,因此,我们此时使用MCU的重置状态分析报告来帮助我们诊断故障源。它可能是无限循环程序,程序硬故障或不稳定的硬件电源。
结果重置。根据上述要求,让我们分析STM32的相应寄存器,并说明如何使用相关功能。
1. MCU寄存器介绍在stm32开发手册的RCC寄存器中选择控制状态寄存器书签,可以看到相应的介绍:包括:低功耗复位标志,窗口看门狗复位标志,独立看门狗复位标志,软件复位标志,上电/掉电复位标志,NRST引脚复位标志。在RCC功能“系统重置”的下级菜单中,有更详细的重置介绍:如果我们可以解析并保存和报告这些重置标志,我们可以通过以下信息判断MCU崩溃的原因:重置标志。
让我介绍一下相应的符号和组合判断。复位时,RCC_CSR中的所有复位源都将复位引脚。
上电复位仅产生引脚复位,而所有其他复位产生引脚复位和相应的自复位。因此,在分析程序时,首先检查是否有引脚复位,然后左右滑动以查看所有代码>>> void GetResetFlag(void){devfaultcode.resetfault = 0; if(RCC_GetFlagStatus(RCC_FLAG_PINRST)!= RESET){dprintf(“ * RCC_FLAG_PINRST) ”); devfaultcode.resetfault = 0xF001;} if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)!= RESET){printf(“ * RCC_FLAG_IWDGRST ”); devfaultcode.resetfault = 0xF002;} if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST)!= RESET){printf(“ * RCC_FLAG_WWDGRST ”); devfaultcode.resetfault = 0xF003;} if(RCC_GetFlagStatus(RCC_FLAG_PORRST)!= RESET){printf(“ * RCC_FLAG_PORRST ”); devfaultcode.resetfault = 0xF004;} if(RCC_GetFlagStatus(RCC_FLAG_SFTRST)!= RESET){printf(“ * RCC_FLAG_SFTRST ”); devfaultcode.resetfault = 0xF005;} if(RCC_GetFlagStatus(RCC_FLAG_LPWRRST)!= RESET){printf(“ * RCC_FLAG_LPWRRST ”); devfaultcode.resetfault = 0xF006;} RCC_ClearFlag(); //清除RCC重置标志。
ErrListInsert(ErrHead,devfaultcode.resetfault); printf(" devfaultcode:%d 上面的代码创建一个单向链接列表,以保存收集的重置标志并将其发送到服务器。 2.中断故障功能在开发过程中,我们会遇到诸如硬件故障之类的错误,但是如果信息是远程报告的。
仅靠复位标志不能检测到它。通常,hardfault具有软件重置标志和看门狗重置标志(如果设备打开了看门狗)。
但是我选择了另一种方法,因为这些故障标志位于程序重置后的位置,它将消失,因此我通过自定义故障代码表将变量记录保存在故障发生时的FLASH中,然后保存在发生故障的程序中查找故障代码,然后使用各种通讯方法进行报告,后台可以根据该表比较设备的各种问题,就像汽车的故障代码表一样。左右滑动以查看所有代码>>> void HardFault_Handler(void){devfaultcode.resetfault = 0xF007; writeFlash(); / *当发生“硬故障”异常时进入无限循环* / while(1){printf(“ HardFault ”); }} / ** * @brief此函数处理内存管理异常。
* @param无* @retval无* / void MemManage_Handler(void){devfaultcode.resetfault = 0xF008; writeFlash(); / *当发生内存管理异常时进入无限循环* /而(1){printf(“ MemManageFault ”); })/ ** * @brief此函数处理总线故障异常。 * @param无* @retval无* // *总线故障,地址或值期间的内存错误* / void BusFault_Handler(void){devfaultcode.resetfault = 0xF009; writeFlash(); / *发生Bus Fault异常时进入无限循环* / while(1){printf(“ BusFault ”); }} / ** * @brief此函数处理“用法故障”异常。
* @param无* @retval无* // * Usage Fault * / void UsageFault_Handler(void){resetfault = 0xF010; writeFlash(); / *当出现用法错误异常时转到无限循环* /而(1){printf(“ UseageFault ”); }}通过程序中的设备故障代码表监视程序的运行状况,对任何开发人员来说都有很多好处。这只是我将介绍MCU的标志位而扩展的主题。
下次,我将使用“存储故障的链接列表”。
- 电话:0797-4282799
- 邮箱:sales@tonevee.com
- 联系人:李先生 13510435585
- QQ:
- 地址:江西省赣州市定南县良富工业区电子产业区5栋

