news 2026/4/15 13:15:51

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/14 10:00:26

ESP芯片身份识别难题:3步掌握UID读取与修改完整方案

ESP芯片身份识别难题:3步掌握UID读取与修改完整方案 【免费下载链接】esptool 项目地址: https://gitcode.com/gh_mirrors/esp/esptool 你是否曾在设备管理中遇到这样的困境:面对几十台相同的ESP设备,却无法准确识别每一台的身份&…

作者头像 李华
网站建设 2026/4/15 11:44:18

VideoPipe:轻量级C++视频分析框架的革命性突破

一、介绍 VideoPipe 是一个用于视频分析和结构化的 C框架,依赖性极小且易于使用。它像管道一样运行,每个节点都是独立的,可以以多种方式组合。 VideoPipe 可用于构建不同类型的视频分析应用,适用于视频结构化、图像搜索、人脸识别…

作者头像 李华
网站建设 2026/4/7 8:15:17

Windows开发者的福音:MinGW-w64极速配置完全指南

Windows开发者的福音:MinGW-w64极速配置完全指南 【免费下载链接】mingw-w64 (Unofficial) Mirror of mingw-w64-code 项目地址: https://gitcode.com/gh_mirrors/mi/mingw-w64 MinGW-w64作为Windows平台最强大的开源编译器套件,为C/C开发者提供了…

作者头像 李华
网站建设 2026/4/7 22:40:56

教育场景应用:用GPT-SoVITS生成个性化教学语音

教育场景应用:用GPT-SoVITS生成个性化教学语音 在一间普通的中学教室里,一位物理老师刚结束一堂关于牛顿定律的讲解。课后,几个学生围在平板前回放课程录音——但这次播放的不是课堂实录,而是由AI生成、却完全复刻了老师音色的教学…

作者头像 李华
网站建设 2026/4/8 4:56:11

pyecharts-assets终极部署指南:打造高速可视化体验

pyecharts-assets终极部署指南:打造高速可视化体验 【免费下载链接】pyecharts-assets 🗂 All assets in pyecharts 项目地址: https://gitcode.com/gh_mirrors/py/pyecharts-assets pyecharts-assets作为pyecharts图表库的本地静态资源解决方案&…

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

OpenRGB终极指南:一站式解决多品牌RGB设备灯光控制难题

还在为电脑上不同品牌的RGB设备需要安装多个控制软件而烦恼吗?华硕主板、海盗船内存、雷蛇键盘、罗技鼠标...每个厂商都要求使用自己的专属应用,不仅占用系统资源,还经常出现兼容性冲突。OpenRGB开源项目应运而生,通过逆向工程实现…

作者头像 李华