5.11 IWDG 使用说明

本章说明 N32G033 标准外设库中独立看门狗(IWDG)相关的文件组成、9 个公开函数,以及 IWDG_Reset 1 个示例。计数时序、按键值与溢出时间请配合用户手册的“独立看门狗”章节阅读,芯片已知问题以勘误手册为准。

5.11.1 相关文件

相对路径 作用
firmware/n32g033_std_periph_driver/inc/n32g033_iwdg.h 定义写保护、状态标志与预分频值等枚举,并声明 9 个看门狗配置、喂狗与状态读取函数
firmware/n32g033_std_periph_driver/src/n32g033_iwdg.c 实现上述 9 个函数:写保护开关、预分频与重装载设置、重装载与启动、喂狗、状态读取、调试冻结与中断使能
projects/n32g033_EVAL/examples/IWDG/ IWDG 示例根目录,含 IWDG_Reset 1 个示例
projects/n32g033_EVAL/examples/IWDG/IWDG_Reset/ 该示例的工程目录组成:MDK-ARM/、EWARM/、inc/、src/、readme.txt
projects/n32g033_EVAL/bsp/ 示例共用的板级支持文件:delay.h 的 SysTick 延时与 log.h 的串口日志接口

5.11.2 API 参考

搜索 API共 9 个函数

以下 9 个公开函数按 n32g033_iwdg.h 的声明顺序分为 2 组;每个条目给出功能摘要与 n32g033_iwdg.c 中该函数正上方的注释原文。

配置与启动

IWDG_WriteConfig、IWDG_SetPrescalerDiv、IWDG_CntReload、IWDG_ReloadKey、IWDG_Enable

状态、调试冻结与喂狗

IWDG_Freeze_Enable、IWDG_GetStatus、IWDG_INT_Enable、IWDG_Feed

void IWDG_WriteConfig(IWDOG_WRITE_CONFIG IWDG_WriteAccess)使能或关闭对 IWDG_PREDIV 与 IWDG_RELV 寄存器的写保护。
源码注释
name    IWDG_WriteConfig.
fun     Enables or disables write protection to IWDG_PREDIV and IWDG_RELV registers.
param   IWDG_WriteAccess
        - IWDG_WRITE_ENABLE
        - IWDG_WRITE_DISABLE
return  none
void IWDG_SetPrescalerDiv(uint8_t IWDG_Prescaler)设置 IWDG 预分频值。
源码注释
name    IWDG_SetPrescalerDiv.
fun     IWDG_Prescaler specifies the IWDG prescaler value.
param   IWDG_Prescaler :
          - IWDG_PRESCALER_DIV4
          - IWDG_PRESCALER_DIV8
          - IWDG_PRESCALER_DIV16
          - IWDG_PRESCALER_DIV32
          - IWDG_PRESCALER_DIV64
          - IWDG_PRESCALER_DIV128
          - IWDG_PRESCALER_DIV256
return  none
void IWDG_CntReload(uint16_t Reload)设置 IWDG 重装载值。
源码注释
name    IWDG_CntReload.
fun     Sets IWDG reload value.
param   Reload :
          -0x000 ~ 0x3FFF
return  none
void IWDG_ReloadKey(void)用 IWDG_RELV 寄存器中的值重装载 IWDG 计数器。
源码注释
name    IWDG_ReloadKey.
fun     Reload IWDG counter with value defined in IWDG_RELV register.
param   none
return  none
void IWDG_Enable(void)启动看门狗计数器。
源码注释
name    IWDG_Enable.
fun     Start watch dog counter.
param   none
return  none
void IWDG_Freeze_Enable(FunctionalState Cmd)进入或退出 IWDG 冻结模式。
源码注释
name    IWDG_Freeze_Enable.
fun     Enter or exit IWDG freeze mode.
param  Cmd :
          - ENABLE
          - DISABLE
return  none
FlagStatus IWDG_GetStatus(IWDG_STATUS_FLAG IWDG_FLAG)检查指定的 IWDG 标志是否置位。
源码注释
name    IWDG_GetStatus.
fun     Checks whether the specified IWDG flag is set or not.
param   IWDG_FLAG :
          - IWDG_PVU_FLAG
          - IWDG_CRVU_FLAG
          - IWDG_FREE_FLAG
return  FlagStatus :
          - RESET
          - SET
void IWDG_INT_Enable(FunctionalState Cmd)使能或关闭指定的 IWDG 中断。
源码注释
name    IWDG_INT_Enable.
fun     Enables or disables the specified IWDG interrupt
param  Cmd :
          - ENABLE
          - DISABLE
return  none
void IWDG_Feed(void)为避免复位而喂狗。
源码注释
name    IWDG_Feed
fun     Feed IWDG in case reset occur.
param   none
return  none

5.11.3 Demo 示例说明

本节说明 IWDG 的 1 个示例:IWDG_Reset 周期喂狗保持系统运行,并用复位标志与 LED 指示是否发生看门狗复位。

5.11.3.1 IWDG_Reset 看门狗复位

工程目录: projects/n32g033_EVAL/examples/IWDG/IWDG_Reset/

使能 PWR 与 GPIO 时钟→读复位标志判断是否由看门狗复位→设置预分频与重装载值并启动看门狗→主循环翻转 LED 并周期喂狗

项目 源码解读
功能 上电后周期喂狗保持运行,并在看门狗超时复位后用 LED1 与串口日志指示复位来源。
源码组成 src/main.c 含 LedInit、LedOn、LedOff、LedBlink 四个 LED 辅助函数与看门狗配置主循环;
src/n32g033_it.c 提供 Cortex-M0 异常处理函数骨架;
inc/main.h 汇总外设与板级头文件;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 时钟源 LSI 约 32 kHz;
预分频 32,重装载值 LsiFreq/128,超时约 250 ms;
LED1 PA6、LED2 PA7 均为推挽输出;
串口 115200,TX PA9、RX PA10。
程序与数据路径 main → log_init 初始化串口 → LedInit 配置 LED 引脚 → 使能 PWR 时钟 → 读 RCC_CTRLSTS_FLAG_IWDGRSTF 判断复位来源并点亮或熄灭 LED1 → IWDG_WriteConfig 开写保护 → IWDG_SetPrescalerDiv 设预分频 → IWDG_CntReload 设重装载值 → IWDG_ReloadKey → IWDG_Enable → 主循环翻转 LED2、延时 249 ms、再 IWDG_ReloadKey 喂狗。
主要 API IWDG_WriteConfig、IWDG_SetPrescalerDiv、IWDG_CntReload、IWDG_ReloadKey、IWDG_Enable
验证方法 编译烧录并上电,LED2 持续闪烁说明喂狗正常;
把 SysTick_Delay_Ms 参数改成 251 及以上,系统持续复位且 LED1 常亮。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
系统时钟 64 MHz。
核心代码解读与移植

示例先按预分频与重装载值算好超时时间,再在 250 ms 内周期喂狗;一旦喂狗间隔超过超时时间就触发复位。

数据路径: IWDG_WriteConfig 开写保护 → IWDG_SetPrescalerDiv 选 LSI/32 → IWDG_CntReload 装载 LsiFreq/128 → IWDG_ReloadKey 重装载计数器 → IWDG_Enable 启动看门狗 → 主循环翻转 LED2 与喂狗

1. 配置阶段先开写保护,再设预分频与重装载值。 预分频 32 与重装载 LsiFreq/128 组合出约 250 ms 超时。

src/main.csrc/main.c · main
    /* IWDG timeout equal to 250 ms (the timeout may varies due to LSI frequency
       dispersion) */
    /* Enable write access to IWDG_PR and IWDG_RLR registers */
    IWDG_WriteConfig(IWDG_WRITE_ENABLE);

    /* IWDG counter clock: LSI/32 */
    IWDG_SetPrescalerDiv(IWDG_PRESCALER_DIV32);

    /* Set counter reload value to obtain 250ms IWDG TimeOut.
       Counter Reload Value = 250ms/IWDG counter clock period
                            = 250ms / (LSI/128)
                            = 0.25s / (LsiFreq/32)
                            = LsiFreq/(32 * 4)
                            = LsiFreq/128 */
    log_debug("LsiFreq is: %d\n", LsiFreq);

    IWDG_CntReload(LsiFreq / 128);

超时时间随 LSI 频率偏差浮动,移植时按实际 LSI 频率与需要的最长响应时间重算重装载值。

2. 用复位标志区分看门狗复位与上电复位。 检测到 IWDGRSTF 时点亮 LED1 并打印日志,随后清标志。

src/main.csrc/main.c · main
    /* Check if the system has resumed from IWDG reset */
    if(RCC_GetFlagStatus(RCC_CTRLSTS_FLAG_IWDGRSTF) != RESET)
    {
        /* IWDGRST flag set */
        /* Turn on LED1 */
        LedOn(LED1_GPIO_PORT, LED1_GPIO_PIN);
        log_info("reset by IWDG\n");
        /* Clear reset flags */
        RCC_ClearResetFlag();
    }
    else
    {
        /* IWDGRST flag is not set */
        /* Turn off LED1 */
        LedOff(LED1_GPIO_PORT, LED1_GPIO_PIN);
    }

清标志要在判断之后完成,否则下一次上电无法再次识别看门狗复位。

3. 主循环喂狗保持计数器不溢出。 每次喂狗前延时 249 ms,略小于 250 ms 的超时时间。

src/main.csrc/main.c · main
    while(1)
    {
        /* Toggle LED2 */
        LedBlink(LED2_GPIO_PORT, LED2_GPIO_PIN);
        /* Insert 249 ms delay */
        SysTick_Delay_Ms(249);

        /* Reload IWDG counter */
        IWDG_ReloadKey();
    }

一旦喂狗间隔超过超时时间就触发复位,LED1 点亮并可读回复位标志。

对应源码: src/main.c、inc/main.h、firmware/n32g033_std_periph_driver/inc/n32g033_iwdg.h

5.11.4 注意与排障

场景 检查与建议 来源
使能看门狗前先打开 PWR 时钟 用户手册独立看门狗章写明看门狗复位功能由 PWR_CTRL.IWDGRSTEN 控制,该位为 0 时计数器照常计数但不会复位;
使用前先使能 PWR 时钟并确认该位为 1。
用户手册
修改预分频与重装载值前先解锁并等待更新完成 用户手册独立看门狗章写明要先向 IWDG_KEY 写 0x5555 解除写保护,且必须在 IWDG_STS 的 PVU、CRVU 均为 0 后再写入新值;
否则更新不会生效。
用户手册
喂狗与启动的按键值 用户手册独立看门狗章给出按键值:向 IWDG_KEY 写 0xAAAA 重装载计数器,写 0xCCCC 启动看门狗;
误写其他值不会触发相应动作。
用户手册
看门狗中断与喂狗 用户手册独立看门狗章写明计数器值小于等于重装载值的一半时会进入看门狗中断,通过喂狗退出中断;
不做处理则计数器递减到 0 后复位。
用户手册

勘误手册 V1.0.0(2025.9.25)针对 A 版芯片,未列出 IWDG 相关条目。

国民技术开发套件文档中心

按芯片系列在线查阅国民技术 MCU 开发套件的芯片资料、SDK、驱动 API 与 Demo 示例说明。

© 2026 国民技术股份有限公司 版权所有粤ICP备11069485号本站使用不含 Cookie 的匿名访问统计