news 2026/3/19 10:47:54

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/3/13 7:10:31

Mermaid Live Editor终极指南:5分钟从新手到图表专家

Mermaid Live Editor终极指南:5分钟从新手到图表专家 【免费下载链接】mermaid-live-editor Location has moved to https://github.com/mermaid-js/mermaid-live-editor 项目地址: https://gitcode.com/gh_mirrors/mer/mermaid-live-editor 您是否曾经为制作…

作者头像 李华
网站建设 2026/3/17 23:41:40

Unity WebGL输入法终极解决方案:跨平台兼容性完美实现

Unity WebGL输入法终极解决方案:跨平台兼容性完美实现 【免费下载链接】WebGLInput IME for Unity WebGL 项目地址: https://gitcode.com/gh_mirrors/we/WebGLInput 在Unity WebGL开发中,你是否曾为输入法无法正常使用而烦恼?用户无法…

作者头像 李华
网站建设 2026/3/14 4:35:36

5大理由告诉你为什么OpenAPI-GUI是API文档编辑的终极解决方案

5大理由告诉你为什么OpenAPI-GUI是API文档编辑的终极解决方案 【免费下载链接】openapi-gui GUI / visual editor for creating and editing OpenAPI / Swagger definitions 项目地址: https://gitcode.com/gh_mirrors/op/openapi-gui OpenAPI-GUI是一个功能强大的图形化…

作者头像 李华
网站建设 2026/3/18 12:44:43

如何在24小时内完成Open-AutoGLM全链路搭建?这套工业级方案绝了

第一章:智谱Open-AutoGLM搭建教程 环境准备 在开始部署 Open-AutoGLM 前,需确保本地或服务器环境已安装必要的依赖工具。推荐使用 Python 3.9 及以上版本,并通过虚拟环境隔离项目依赖。 安装 Python 3.9 并配置 pip创建虚拟环境&#xff1a…

作者头像 李华
网站建设 2026/3/13 15:54:16

模拟信号调理电路设计:超详细版硬件实现指南

模拟信号调理电路设计:从原理到实战的硬核指南你有没有遇到过这样的情况?传感器明明工作正常,可MCU读回来的数据却像心电图一样跳个不停;或者系统在实验室里表现完美,一搬到工业现场就“发疯”,读数飘忽不定…

作者头像 李华