GD32的看门狗应用

引言

在嵌入式开发中,系统延时、实时时钟(RTC)和看门狗(Watchdog)是保障系统稳定性和功能完整性的核心模块。本文基于GD32F4xx系列微控制器,结合代码实例详细讲解这三个模块的实现与应用,帮助开发者快速构建可靠系统。


一、系统延时实现(SysTick)

SysTick作为Cortex-M内核的系统定时器,常用于精准延时。以下代码通过SysTick中断实现微秒级延时:

关键代码分析(systick.c)

c

Copy

volatile static uint32_t delay; // 延时计数器
volatile static uint32_t tick = 0; // 系统运行时间(微秒)

void systick_config(void) {
    // 配置SysTick为1MHz中断(每微秒触发一次)
    if(SysTick_Config(SystemCoreClock / 1000000U)) {
        while(1); // 初始化失败处理
    }
    NVIC_SetPriority(SysTick_IRQn, 0x00U); // 最高中断优先级
}

// SysTick中断服务函数
void SysTick_Handler(void) {
    tick++;
    if(delay > 0) delay--;
}

void delay_1us(uint32_t count) {
    delay = count;
    while(delay != 0);
}

uint32_t systick_tick_us() {
    return tick; // 获取系统运行时间
}

使用场景

  • 用于外设初始化等待
  • 非阻塞延时操作

二、实时时钟(RTC)配置

GD32内部RTC依赖外部32.768kHz晶振,需配置备份域和BCD码转换:

RTC初始化关键步骤(main.c)

c

Copy

void RTC_config() {
    rcu_periph_clock_enable(RCU_PMU);
    pmu_backup_write_enable(); // 启用备份域写权限
    
    rcu_osci_on(RCU_LXTAL); // 启动LXTAL
    rcu_osci_stab_wait(RCU_LXTAL);
    rcu_rtc_clock_config(RCU_RTCSRC_LXTAL); // RTC时钟源选择
    
    rtc_parameter_struct rps = {
        .year = WRITE_BCD(23), // BCD编码转换
        .month = WRITE_BCD(4),
        // ... 其他时间参数
    };
    rtc_init(&rps); // 初始化RTC
}

BCD转换宏定义

c

Copy

#define WRITE_BCD(val)  ((val / 10) << 4) + (val % 10)
#define READ_BCD(val)   (val >> 4) * 10 + (val & 0x0F)

注意事项

  1. 必须启用PMU备份域才能修改RTC配置
  2. 时间读取需进行BCD到十进制的转换

三、看门狗应用

GD32提供独立看门狗(FWDGT)和窗口看门狗(WWDGT)两种类型:

1. 独立看门狗配置

c

Copy

void Fwdgt_config() {
    // 时钟源为内部32kHz RC,超时时间计算:
    // 分频64,计数值500 → 约1秒
    fwdgt_config(500, FWDGT_PSC_DIV64); 
    fwdgt_enable();
}

// 主循环中喂狗
while(1) {
    delay_1ms(1000);
    fwdgt_counter_reload();
}

2. 窗口看门狗配置

c

Copy

void WWDGT_config() {
    wwdgt_config(127, 80, WWDGT_CFG_PSC_DIV8); 
    // 窗口范围:80-127(约26ms-35ms)
    wwdgt_enable();
}

// 喂狗需在窗口期内执行
wwdgt_counter_update(127); // 重置计数器

设计要点

  • FWDGT适合长时间间隔的喂狗
  • WWDGT要求严格的时间窗口,适合关键任务监控

四、完整系统集成

结合上述模块的系统初始化流程:

c

Copy

int main(void) {
    nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2); // 中断分组
    systick_config();    // 系统定时器
    Usart0_init();       // 串口通信
    RTC_config();        // 实时时钟
    Fwdgt_config();      // 看门狗
    
    while(1) {
        // 主任务循环
        RTC_read();             // 读取时间
        fwdgt_counter_reload(); // 喂狗
        delay_1ms(1000);
    }
}

五、常见问题与解决
  1. RTC初始化失败
    • 检查LXTAL是否正常起振
    • 确认PMU备份域已使能(pmu_backup_write_enable())
  2. 看门狗意外复位
    • 检查喂狗间隔是否超过设定时间
    • WWDGT需确保喂狗在窗口期内
  3. 延时精度偏差
    • 校准系统时钟源
    • 避免在中断服务中进行耗时操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值