引言
在嵌入式开发中,系统延时、实时时钟(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)
注意事项
- 必须启用PMU备份域才能修改RTC配置
- 时间读取需进行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);
}
}
五、常见问题与解决
- RTC初始化失败
- 检查LXTAL是否正常起振
- 确认PMU备份域已使能(pmu_backup_write_enable())
- 看门狗意外复位
- 检查喂狗间隔是否超过设定时间
- WWDGT需确保喂狗在窗口期内
- 延时精度偏差
- 校准系统时钟源
- 避免在中断服务中进行耗时操作