|
大家好!今天来和大家深入探讨一下 T5L 芯片内部的看门狗定时器相关知识,并结合一段代码来详细解析其应用。
看门狗在 T5L 芯片中起着至关重要的作用,它能有效保障软件的稳定运行。其核心原理在于规定的溢出时间间隔内必须有喂狗操作,否则就会触发软件复位,以此避免软件在恶劣环境下因异常宕机而长时间卡死。在 T5L 芯片中,看门狗的溢出时间间隔不可设置,这就要求我们的 C51 代码严格按照其特性来处理喂狗逻辑。
先来看代码中的外部中断 0 部分。通过 exit0_init 函数对外部中断 0 进行初始化,将其中断优先级设为最低,同时设置为下降沿触发,并使能该中断以及总中断。在 exit0_isr 这个外部中断 0 的中断服务程序里,首先进行了按键消抖处理。这里需要注意,如果使用 sys_delay_about_ms 函数进行消抖,要确保定时器 2 的中断优先级比外部中断 0 高。消抖后判断按键是否按下,如果按下则执行 WDT_RST 进行喂狗操作。并且,由于按键抖动可能导致中断误触发,即使硬件在进入中断服务程序时会自动清零 IE0 中断标志位,我们仍在最后手动清除它,以增强稳定性。
在 main 函数中,首先进行系统初始化和外部中断 0 初始化。如果是看门狗造成的复位,程序每次重新运行时会先停止动画并显示 “复位了” 的图标,延时 3 秒以便观察,然后开启看门狗并开始播放动画,表示软件正常运行。这里有个重要发现,经过实测,在当前代码环境下,看门狗的溢出时间约为 20 秒,并非官方文档所说的固定 1 秒,这也提醒我们在不同代码环境下要自行实测确定该时间,以便准确把握喂狗时机。
部分代码
- #include "sys.h"
- sbit KEY1 = P3^0;
- //外部中断0初始化
- void exit0_init()
- {
- //设置外部中断0的中断优先级为最低,总共为4级(0-3),值越小,优先级越低
- IP0 &= 0xFE;//将bit0清零
- IP1 &= 0xFE;//将bit0清零
- IE0 = 0;//清除外部中断0的中断标志位
-
- IT0 = 1;//1是设置为下降沿触发,0是设置为低电平触发
- EX0 = 1;//使能外部中断0,对应引脚为P3.0
- EA = 1;//使能总中断
- }
- //外部中断0的中断服务程序
- void exit0_isr() interrupt 0
- {
- //按键消抖,请最好不要用sys_delay_ms函数,如果一定要使用的话,
- //请确保定时器2的中断优先级比我们的外部中断0的优先级要高
- sys_delay_about_ms(1);//请根据自己的实际情况,调节消抖时间
- if(KEY1==0)
- WDT_RST();//进行喂狗操作
-
- //虽然IE0中断标志位在进入中断服务程序时,会被硬件自动清零,
- //但是由于按键有抖动,有可能会造成中断再次被触发,从而使IE0标志位再次被置1,
- //所以我们这里要在最后面手动清除一下IE0标志位,可以有效避免按键抖动造成的误触发
- IE0 = 0;
- }
- void main(void)
- {
- u16 anim;
-
- sys_init();//系统初始化
- exit0_init();//外部中断0初始化
-
- //如果看门狗造成了复位,那么我们程序每次都会重头开始运行,也就是每次都能看到"复位了"的图标
- anim = 0;
- sys_write_vp(0x2000,(u8*)&anim,1);//将动画给停止,显示"复位了"的图标
- sys_delay_ms(3000);//延时3s,目的是为了让大家看清楚"复位了"的图标
- WDT_ON();//开启看门狗
-
- //开始播放动画,表示我们的软件正在正常运行
- anim = 1;
- sys_write_vp(0x2000,(u8*)&anim,1);
- while(1)
- {
- //经过实测,看门狗的溢出时间为20秒左右,请注意,在不同的代码环境下,
- //看门狗的溢出时间可能是不固定的,请自行实测,所以官方文档上所说的固定为1秒是有问题的
- }
- }
复制代码
在实际应用中,我们要充分理解看门狗定时器的工作机制,合理利用外部中断与喂狗操作的配合,并且重视像溢出时间实测这样的细节,才能确保 T5L 芯片系统的稳定可靠运行。不知道大家在使用 T5L 芯片看门狗定时器时有没有遇到其他问题或者有不同的见解呢?
p1点击按键返回停止,p1再次点击复位
编辑:袁航
审阅:袁航
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|