news 2026/4/23 13:17:06

MCU软件主动复位:内核级复位、外设控制器复位、看门狗复位三大方式详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MCU软件主动复位:内核级复位、外设控制器复位、看门狗复位三大方式详解

目录

一、HC32L130 软件复位的核心方式

二、前提准备:HC32L130 寄存器及 CMSIS 库依赖

三、方式一:Cortex-M0 + 内核标准软件复位

1. 原理

2. 代码实现

3. 说明

四、方式二:操作 HC32L130 复位控制器(RSTC)实现软件复位

1. 原理

2. 代码实现

3. 寄存器说明

五、方式三:独立看门狗(IWDG)触发软件复位

1. 原理

2. 代码实现

3. 说明

六、复位原因检测

1. 复位状态寄存器(RSTC_SR)位定义

2. 复位原因检测代码

七、注意事项

八、应用场景总结


HC32L130 是华大半导体基于ARM Cortex-M0+内核的低功耗 MCU,其软件复位功能可通过Cortex-M0 + 内核标准复位接口HC32L130 外设复位控制器独立看门狗(IWDG)触发复位三种方式实现,适用于不同场景(如普通软件复位、带复位原因记录的复位等)。以下详细讲解各方式的实现原理、代码示例及注意事项。

一、HC32L130 软件复位的核心方式

HC32L130 的软件复位主要分为三类:

  1. 内核级复位:调用 Cortex-M0 + 内核标准的NVIC_SystemReset()函数,触发系统全局复位;
  2. 外设控制器复位:操作 HC32L130 的 ** 复位控制器(RSTC)** 寄存器,主动触发软件复位;
  3. 看门狗复位:配置独立看门狗(IWDG)后,故意不喂狗使其超时,触发硬件复位(间接软件复位)。

其中,内核级复位是最简便的方式,外设控制器复位可自定义复位范围,看门狗复位适合需要记录复位原因的场景。

二、前提准备:HC32L130 寄存器及 CMSIS 库依赖

HC32L130 的软件开发需基于华大提供的HC32L13x 系列标准库(或直接操作寄存器),需包含核心头文件:

#include "hc32l130.h" #include "core_cm0plus.h" // Cortex-M0+内核头文件

三、方式一:Cortex-M0 + 内核标准软件复位

Cortex-M0 + 内核提供了统一的软件复位接口NVIC_SystemReset(),该函数通过操作内核的 ** 应用程序中断及复位控制寄存器(AIRCR)** 触发系统复位,是跨平台的通用方式,实现最简单。

1. 原理

向内核SCB->AIRCR寄存器写入0x05FA0000 | VECTKEY(密钥)和SYSRESETREQ位(位 2),内核会触发芯片全局复位,复位所有外设和内核状态。

2. 代码实现
/** * @brief Cortex-M0+内核软件复位 * @note 复位后程序从0x00000000地址开始执行(即复位向量表) */ void soft_reset_by_cortex(void) { __disable_irq(); // 复位前关闭所有中断,避免中断干扰复位过程 /* 触发内核系统复位 */ NVIC_SystemReset(); /* 复位后代码不会执行到此处 */ while(1); }
3. 说明
  • NVIC_SystemReset()是 CMSIS 库的标准函数,定义在core_cm0plus.h中;
  • 复位前需关闭中断(__disable_irq()),防止中断处理函数打断复位流程;
  • 复位后,MCU 会重新执行启动文件,从main()函数开始运行。

四、方式二:操作 HC32L130 复位控制器(RSTC)实现软件复位

HC32L130 内置复位控制器(RSTC),通过配置其寄存器RSTC_CR的 ** 软件复位请求位(SWRST)** 可触发芯片复位,该方式更贴合 HC32L130 的硬件特性,支持更精细的复位控制。

1. 原理

HC32L130 的 RSTC 寄存器位于地址 0x40000000 + 0x00000C00区域,其中:

  • RSTC_CR(复位控制寄存器)的 ** 位 0(SWRST)** 为软件复位请求位,写入 1 时触发芯片复位;
  • 写入RSTC_CR前需先写入 ** 访问密钥(0xA5)** 到RSTC_KEYR寄存器,解锁写保护。
2. 代码实现
/** * @brief HC32L130复位控制器软件复位 * @note 需先解锁RSTC寄存器,再触发软件复位 */ void soft_reset_by_rstc(void) { __disable_irq(); // 关闭中断 /* 1. 解锁RSTC寄存器(写入密钥0xA5) */ M0P_RSTC->KEYR = 0xA5; /* 2. 置位SWRST位,触发软件复位 */ M0P_RSTC->CR_f.SWRST = 1; /* 等待复位生效(实际执行到此处时已开始复位) */ while(1); }
3. 寄存器说明
  • M0P_RSTC是 HC32L130 标准库中对 RSTC 外设的寄存器映射宏;
  • RSTC_KEYR为密钥寄存器,必须写入0xA5才能解锁RSTC_CR的写保护,否则写入无效;
  • RSTC_CR_f.SWRST是寄存器位段定义(标准库封装),直接操作寄存器也可写为M0P_RSTC->CR |= 0x01;

五、方式三:独立看门狗(IWDG)触发软件复位

独立看门狗(IWDG)是 HC32L130 的硬件模块,由内部低速时钟(LSI)驱动,不受主时钟影响。通过配置 IWDG 为短超时时间,然后不喂狗,使其超时触发复位,属于间接软件复位,适合需要记录 “看门狗复位” 原因的场景。

1. 原理
  1. 启用 IWDG,配置预分频系数和重装载值,设置短超时时间(如 100ms);
  2. 不执行喂狗操作(IWDG_ReloadCounter()),IWDG 计数器递减至 0 时触发系统复位;
  3. 复位后可通过RSTC_SR寄存器读取复位原因,确认是 IWDG 复位。
2. 代码实现
/** * @brief 初始化IWDG(独立看门狗) * @param prescaler: 预分频系数(0~7,对应div4/div8/.../div256) * @param reload: 重装载值(0~0xFFF) */ void iwdg_init(uint8_t prescaler, uint16_t reload) { /* 解锁IWDG寄存器(写入密钥0x5555) */ M0P_IWDG->KR = 0x5555; /* 设置预分频系数 */ M0P_IWDG->PR = prescaler & 0x07; /* 解锁后设置重装载值 */ M0P_IWDG->KR = 0x5555; M0P_IWDG->RLR = reload & 0xFFF; /* 启动IWDG(写入密钥0xCCCC) */ M0P_IWDG->KR = 0xCCCC; } /** * @brief IWDG喂狗 */ void iwdg_feed(void) { M0P_IWDG->KR = 0xAAAA; // 写入喂狗密钥,重载计数器 } /** * @brief 触发IWDG复位(软件故意不喂狗) */ void soft_reset_by_iwdg(void) { __disable_irq(); /* 初始化IWDG,设置超时时间约100ms(LSI=40kHz) */ // 预分频=6(div128),40kHz/128=312.5Hz,重载值=32 → 32/312.5≈0.1024s iwdg_init(6, 32); /* 不喂狗,等待IWDG超时触发复位 */ while(1); }
3. 说明
  • HC32L130 的 IWDG 时钟为内部低速时钟LSI(40kHz),不受主时钟影响,可靠性更高;
  • IWDG 寄存器需通过密钥解锁:0x5555为配置解锁,0xAAAA为喂狗,0xCCCC为启动;
  • 该方式复位后,可通过读取RSTC_SR寄存器的IWDG_RST位,判断是否为看门狗复位。

六、复位原因检测

HC32L130 的RSTC_SR(复位状态寄存器)记录了复位的原因,软件复位后可读取该寄存器分析复位类型,便于调试和故障处理。

1. 复位状态寄存器(RSTC_SR)位定义
位段功能说明取值说明
POR_RST上电复位标志1:上电复位,0:非上电复位
PIN_RST引脚复位标志(NRST 引脚)1:引脚复位,0:非引脚复位
WDG_RST看门狗复位标志(IWDG)1:IWDG 复位,0:非 IWDG 复位
SWR_RST软件复位标志(RSTC 触发)1:软件复位,0:非软件复位
LPWR_RST低功耗复位标志1:低功耗复位,0:非低功耗复位
2. 复位原因检测代码
/** * @brief 读取HC32L130复位原因 * @return 复位原因字符串 */ const char* get_reset_reason(void) { const char* reason = "Unknown Reset"; /* 读取复位状态寄存器 */ uint32_t rst_sr = M0P_RSTC->SR; if(rst_sr & RSTC_SR_POR_RST) { reason = "Power On Reset (POR)"; } else if(rst_sr & RSTC_SR_PIN_RST) { reason = "Pin Reset (NRST)"; } else if(rst_sr & RSTC_SR_WDG_RST) { reason = "IWDG Reset"; } else if(rst_sr & RSTC_SR_SWR_RST) { reason = "Software Reset (RSTC)"; } else if(rst_sr & RSTC_SR_LPWR_RST) { reason = "Low Power Reset"; } /* 清除复位状态标志(写入1清除) */ M0P_RSTC->KEYR = 0xA5; // 解锁 M0P_RSTC->SR = rst_sr; // 写入原值清除标志 M0P_RSTC->KEYR = 0x00; // 重新加锁 return reason; }

七、注意事项

  1. 中断关闭:软件复位前必须通过__disable_irq()关闭所有中断,防止中断处理函数在复位过程中执行,导致复位失败或异常;
  2. 寄存器解锁:操作 RSTC 和 IWDG 寄存器时,需先写入对应密钥解锁,否则写入无效(HC32L130 的外设寄存器大多有写保护);
  3. 关键数据保存:若需在复位前保存关键数据,可将数据写入片内 Flash 或 SRAM(SRAM 在软件复位后数据不丢失,上电复位才会清空);
  4. 时钟依赖:内核复位和 RSTC 复位依赖主时钟,而 IWDG 复位依赖 LSI 时钟,若主时钟故障,优先使用 IWDG 复位;
  5. 复位后初始化:软件复位后,MCU 的外设寄存器不会自动恢复默认值(除复位相关寄存器),需在main()函数中重新初始化外设。

八、应用场景总结

复位方式优点缺点适用场景
内核NVIC_SystemReset()简单通用、跨平台无复位原因记录普通软件复位需求
RSTC 寄存器复位贴合 HC32L130 硬件、可记录复位原因需解锁寄存器需要区分 “软件复位” 原因的场景
IWDG 看门狗复位硬件级复位、可靠性高复位有短暂延时(ms 级)主程序卡死时的复位兜底

通过以上方式,可灵活实现 HC32L130 的软件复位功能,并结合复位原因检测提升系统的可调试性和鲁棒性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 14:09:17

11、Linux 服务器网络服务配置与打印服务详解

Linux 服务器网络服务配置与打印服务详解 1. 网络服务基础配置 在 Linux 服务器的配置中,dhcp 服务可通过“Stop Now”和“Start Now”按钮重新启动。webmin 程序在后续网络服务配置中十分重要,它作为强大的图形界面,可用于执行配置网络服务所需的 Shell 命令,能显著降低…

作者头像 李华
网站建设 2026/4/23 9:59:30

16、网络服务配置与安全防护指南

网络服务配置与安全防护指南 1. 网络与计算机参数的动态显示 在网络管理中,动态显示网络和计算机参数至关重要。以虚构的不伦瑞克大学网络为例,部分子网被缩成“图标”以保持整体显示的清晰,这些图标可随时展开。通过“Tools -> IP - Monitor”为许多网络对象分配小显示…

作者头像 李华
网站建设 2026/4/23 9:58:22

掌握艾欧泽亚:Dalamud插件框架完全实战指南

掌握艾欧泽亚:Dalamud插件框架完全实战指南 【免费下载链接】Dalamud FFXIV plugin framework and API 项目地址: https://gitcode.com/GitHub_Trending/da/Dalamud 你是否曾在《最终幻想XIV》中渴望更智能的游戏体验?🎮 当队友需要实…

作者头像 李华
网站建设 2026/4/19 0:50:40

暗黑2重制版自动化革命:Botty智能脚本全方位实战指南

暗黑2重制版自动化革命:Botty智能脚本全方位实战指南 【免费下载链接】botty D2R Pixel Bot 项目地址: https://gitcode.com/gh_mirrors/bo/botty 厌倦了重复刷怪和繁琐的物品管理?Botty作为专为暗黑破坏神2重制版设计的开源自动化工具&#xff0…

作者头像 李华
网站建设 2026/4/23 11:26:55

免费开源OpenRGB:一站式解决多品牌RGB设备灯光统一控制难题

免费开源OpenRGB:一站式解决多品牌RGB设备灯光统一控制难题 【免费下载链接】OpenRGB Open source RGB lighting control that doesnt depend on manufacturer software. Supports Windows, Linux, MacOS. Mirror of https://gitlab.com/CalcProgrammer1/OpenRGB. R…

作者头像 李华
网站建设 2026/4/16 13:45:25

用好 CDS View I_MeasuringPointData:把设备测量点数据讲清楚、抽干净、用明白

在 SAP EAM / PM 场景里,测量点 往往是连接现场与系统的那根线:设备的运行小时、车辆的里程、电表的电量、风机叶片转速、冷却液温度……这些信息看似零散,却直接决定了预测性维护、绩效型维护、异常预警、成本核算与停机分析能不能落地。SAP 标准交付的 CDS View I_Measuri…

作者头像 李华