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 参考
以下 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 超时。
/* 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 并打印日志,随后清标志。
/* 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 的超时时间。
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 相关条目。