本帖最后由 Gavin3389 于 2022-3-11 10:53 编辑
官网的资料都保存好了,
一点点的开始跑各种例程,首先感受最舒畅的一点,官网的资料非常舒适,(例程+说明文档)
好了,今天来看看看门狗例程
例程路径
\ac7801xSampleCode20210720\watchdog
非常整齐和人性化,例程代码和应用笔记
看,内容也都是干货,不冗余
这么温馨的官网资料,突然给我弄不会了,节省了很多时间。
以WDG5STimeout例程为例
主函数非常简单整洁
乍一看,这也太简单了吧
*
* @param[in] none
*
* [url=home.php?mod=space&uid=266161]@return[/url] none
*
* [url=home.php?mod=space&uid=247401]@brief[/url] 配置独立看门狗,超时周期为5S。
*/
int main(void)
{
InitDelay();
WDG_5s_Timerout();
}
InitDelay();
这还没深究,应该是时钟相关吧,
回头看看手册,做做算术题
/*!
* [url=home.php?mod=space&uid=247401]@brief[/url] Init Delay count factor, 1s = TICKS * (1/f) s;
*
* @param[in] none
* [url=home.php?mod=space&uid=266161]@return[/url] none
*/
void InitDelay(void)
{
s_facus = __SYSTEM_CLOCK / 1000000;
s_facms = s_facus * 1000;
}
WDG_5s_Timerout();
实现看门狗的基础配置,测试
这里有些人可能会因为main函数中没有看到while循环而困惑
实则是为了测试功能,官方把while放在了这个函数里,
这样从功能上来说,形成了闭环。
/**
* WDG_5s_Timerout
*
* @param[in] none
* @return none
*
* @brief 配置看门狗超时时间为5S
*/
void WDG_5s_Timerout(void)
{
uint32_t tmpTimeoutValue = WDG_CLK(5); // (119999999+1)/24000000 = 5s(时钟为48M)
WDG_ConfigType WDGConfig;
memset(&WDGConfig,0,sizeof(WDGConfig));
WDGConfig.clockSource = WDG_CLOCK_APB; //0 is 24MHz clk source
WDGConfig.WDGEn = ENABLE;
WDGConfig.interruptEn = ENABLE; //使能中断,延迟128个总线时钟后复位,可在128总线时钟内执行中断例程
//若需要超时立即复位,禁能中断即可
WDGConfig.prescalerEn = DISABLE; //0:disable 256 pre, 1:enable 256 pre
WDGConfig.updateEn = ENABLE; //if update is 0,can't do any setting
WDGConfig.windowEn = DISABLE; //window mode watchdog
WDGConfig.timeoutValue = tmpTimeoutValue; //time = pre*timeout/clk source
WDGConfig.windowValue = NULL;
WDGConfig.callBack = WDGCallback; //设置中断回调
WDG_Init(&WDGConfig);
GPIO_SetDir(GPIOC,GPIO_PIN9,GPIO_OUT); //LED1,用于测试看门狗功能
GPIO_SetPinLevel(GPIOC,GPIO_PIN9,GPIO_LEVEL_HIGH);
WDG_Feed();
while (1)
{
mdelay(4000); //延时4S再喂狗,不会重启,若为验证看门狗有效性,可把时间改为6S
WDG_Feed(); //刷新看门狗
GPIO_SetPinLevel(GPIOC,GPIO_PIN9,GPIO_LEVEL_LOW);
}
}
实际效果
原例程
板子复位后,绿灯先点亮测试
后熄灭,说明正常喂狗
延长喂狗时间
绿灯常亮,喂狗超时
回过去,看看官网的说明文档
非常的nice!!
|