N32G003查看设备重启原因
文章目录
- 前言
- 1.实现
- 1.1 RCC寄存器
- 1.2 代码实现
前言
在嵌入式单片机开发中,我们经常需要获取设备重启的原因,以方便确认设备异常重启时因什么原因导致,并方便我们进一步的排查。目前网上关于STM32
获取设备重启原因的文档和代码比较多,但是N32G003
我在开发过程中没找到,且DeepSeek
联网搜索也找不到,后自己对着芯片手册的寄存器找到了,这里和大家分享一下,用来感谢平时在网上获取到的帮助。
1.实现
1.1 RCC寄存器
在单片机中RCC寄存器一般负责管理时钟树和系统复位功能,其内部包含复位状态寄存器(STM32:RCC_CSR N32:RCC_CTRLSTS
),用于记录导致最近一次复位的硬件原因。通过读取这些寄存器位,开发者可以快速定位重启来源(如电源异常、看门狗触发、外部中断等)。
通过RCC寄存器(尤其是RCC_CSR)可以快速识别硬件层面的重启原因(如电源、看门狗、电压异常等),而软件原因(如程序跑飞)通常需要结合日志或断点调试分析。实际开发中,建议在启动阶段优先检查RCC寄存器以排除硬件故障。
如果使用其他厂商的单片机(如TI、NXP),其RCC寄存器的名称和功能可能略有差异,但原理相似,可参考对应手册的Reset Control Register
章节。
1.2 代码实现
void print_reset_reason(void)
{
// 读取复位状态寄存器(需查阅具体手册确认地址)
uint32_t csr = RCC->CTRLSTS;
// 通过串口输出复位原因
printf("Reset Reason: ");
if(csr & RCC_CTRLSTS_LPWRRSTF) // 低功耗复位
printf("[Low-power reset]");
if(csr & RCC_CTRLSTS_IWDGRSTF) // 独立看门狗复位
printf("[Independent watchdog reset]");
if(csr & RCC_CTRLSTS_SFTRSTF) // 软件复位
printf("[Software reset]");
if(csr & RCC_CTRLSTS_PORRSTF) // 上电/掉电复位
printf("[Power-on/power-down reset]");
if(csr & RCC_CTRLSTS_PINRSTF) // NRST引脚复位
printf("[External reset]");
printf("\n");
// 清除复位标志
RCC->PRST |= RCC_REMOVE_RESET_FLAG;
}