本帖最后由 vt2017 于 2020-11-22 12:17 编辑
最近用AT32在做一个低功耗的项目,为了实现低功耗模式下的定时唤醒,我选择的是使用相对比较简单的看门狗来做,下面就分享一下使用过程~
为了最大限度的降低功耗,我用的是待机模式(standby mode),先看看几种低功耗模式以及唤醒的区别:
可以看到待机模式下,能够满足定时唤醒的只有看门狗和RTC,虽然RTC也能够实现唤醒的功能,但暂时我还没有实现这部分功能,后续应该会抽空把RTC唤醒的方法也实现,可以做个对比~
AT32提供了两种看门狗,分别是独立看门狗(IWDG)和窗口看门狗(WWDG),其区别大概有以下几点:
1、独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效;窗口看门狗由从 APB1 时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。
2、IWDG 最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合;WWDG 最适合那些要求看门狗在精确计时窗口起作用的应用程序。
3、IWDG相对于WWDG超时时间可以设置的很长,IWDG最大可设置为几十秒而WWDG最多几十毫秒。
4、WWDG具有唤醒中断,可在发生超时前产生中断进行喂狗,避免程序复位,IWDG无此功能
由于待机模式下WWDG是不工作的,并且其超时时间也不符合需求,所以我们用IWDG来做唤醒定时器。
来看一下IWDG的配置方法:
IWDG_KeyRegWrite(IWDG_KeyRegWrite_Enable); //解开IWDG寄存器的访问保护
IWDG_SetPrescaler(IWDG_Psc_256);//配置IWDG时钟的分频,配到最大256
IWDG_SetReload(0xFFF);//设置重载值0xFFF
IWDG_ReloadCounter();//其实可以不用在这里重载,但按我的经验重载一下会比较好
IWDG_Enable();//使能IWDG
通过以上5句代码就将独立看门狗配置好啦,我配置的超时时间大概是30s,即进入待机模式半分钟之后唤醒。
使用过程中还有以下几个注意点:
1、看门狗开启之后是无法关闭的,只有系统复位才能够将其关闭
2、为了在程序执行过程中不造成看门狗复位,建议在每次进入低功耗之前再去开启看门狗
3、关于调试模式,可以在调试模块中开启 DBG_IWDG_STOP,使得进入调试时看门狗停止计数,避免复位
4、在选项字节中能够配置使用硬件 or 软件看门狗,硬件看门狗则不需要在代码中初始化,开机后会立即使能IWDG
|