N32L406C8芯片RTC闹钟唤醒与独立看门狗IWDG配合使用,RTC时钟采用外部32.768Khz外部晶振,闹钟A中断用于芯片休眠唤醒,由于该芯片RTC驱动已发布过,此处不在记录,如果项目需求不一样,可以修改相关代码,以适应设计需求。闹钟A可以设置唤醒时间,由于项目需要只做了24小时之内的闹钟,这样,产品最大休眠时间可以做到一天起来一次,有效减少产品功耗。理想是美好的,现实却很骨感,大批量测试发现有一部分芯片总是程序跑飞,后来又加了窗口看门狗,结果依旧不理想,最后,实在没有办法,就只能用独立看门狗了,缺点是,独立看门狗一旦启动,无法停止(即使休眠模式下,独立看门狗也在工作),,所以芯片必须周期性唤醒,喂下狗,相比之前,功耗会增加;有点是芯片跑飞,可以救命,独立看门狗周期设置为最大:26.2144秒,RTC闹钟25秒唤醒一次喂狗:IWDG_ReloadKey();这里主要做下设计思路记录,代码次之。仅记录看门狗初始化代码,代码实测。
void iwdgInit() //初始化独立看门狗
{
RCC_EnableLsi(ENABLE);
/* Wait till LSI is ready */
while (RCC_GetFlagStatus(RCC_CTRLSTS_FLAG_LSIRD) == RESET)
{
}
IWDG_WriteConfig(IWDG_WRITE_ENABLE);
/* IWDG counter clock: LSI/32 */
IWDG_SetPrescalerDiv(IWDG_PRESCALER_DIV256);//6.4ms计数加1
/* Set counter reload value to obtain 250ms IWDG TimeOut.
Counter Reload Value = 250ms/IWDG counter clock period
= 250ms / (LSI/32)
= 0.25s / (LsiFreq/32)
= LsiFreq/(32 * 4)
= LsiFreq/128 */
// IWDG_CntReload(LsiFreq / 128);
IWDG_CntReload(4095); //0-4095 溢出周期:6.4*4096 = 26.2144秒
/* Reload IWDG counter */
IWDG_ReloadKey();
/* Enable IWDG (the LSI oscillator will be enabled by hardware) */
IWDG_Enable();
}