IWDG特性说明
IWDG(Independent WatchDog,独立看门狗),从字面上看,好像是设置了一个安全系统,防止外来的干扰;从 STM32 操作说明上看,实际上是放了一条狗咬自己(Reset复位),不想被咬就要不断的**”喂狗“**,而且是放出来后就关不回去(启动看门狗工作,启动后就不能停)?!这个功能在不想让自己陷入打瞌睡、昏迷的条件下是很好用的。
其中,下命令是由 KR 负责;调整喂狗的时间是 PR (时长)和 RLR(计数) 组合;
这一段描述是 KR 用0xCCCC 打开 WDG 后,就要定时 用 0xAAAA ”喂狗“;要调整”喂狗的时间“就要由 KR=0x5555 打开后,调整 PR 和 RLR。从下面的涵式 IWDG_Init(u8 prer,u16 rlr) 可以看到整个流程。
//***** IWGD.c ******
//看门狗·
//prer:0~7
//·频率 =4*2^prer.
//rlr:重装计数值,然后倒数到 0x0000
//实际 timer 的时间:Tout=((4*2^prer)*rlr)/40 (ms).
void IWDG_Init(u8 prer,u16 rlr)
{
IWDG->KR=0X5555;//写入0x5555表示允许访问IWDG_PR(IWDG->PR)和IWDG_RLR(IWDG->RLR)寄存器
IWDG->PR=prer; //写入分频的大小,有 8 种
IWDG->RLR=rlr; //写入计数值 IWDG->RLR
IWDG->KR=0XAAAA;//reload
IWDG->KR=0XCCCC;//写入0xCCCC,启动看门狗工作,启动后就不能停
}
//这个叫做”喂狗“ ,是个”重装“ 动作,让 IWDG 重新计数
void IWDG_Feed(void)
{
IWDG->KR=0XAAAA;//reload
}
IWDG 在参考手册的说明
虽然 KR 有 16 bits,但是只认识 3 组字, 0x5555、0xAAAA、0xCCCC; 而且,还只能写入,如果要读,读出来只有 0x0000。
PR 只用 3 个 bit,有 8 种变化,产生下图的时间值。
RLR 只用了 11 个 bit
前面提到, RLR 要在 KR = 0x5555 后才能写入,这里又说 要在 SR 的 RVU bit 为 0 时才重装;写程式的人都会想,是不是要再写一段 ”SR = xxxx"?
仔细看了 SR 的说明, 这个 RVU 和 PVU 都是硬件控制的。
下列是 IWDG 的框架图
这张图有一段提醒,就是 RC 振荡器可能不是那么精准,40 kHz 只是个参考值。APB 的接口时钟会有一点点的影响。不过也不是那么严重。
独立看门狗的应用场景
LSI 时钟影响 RC 的正确频率
这个实验的程式分析
主程式 main.c
int main(void)
{
Stm32_Clock_Init(9); //
delay_init(72); //
uart_init(72,115200);// 与前面的实验相同,请参照
LED_Init(); // 与前面的实验相同,请参照
KEY_Init(); // 与前面的实验相同,请参照
delay_ms(300); //
IWDG_Init(4,625); // 启动 IWDG PR=4, RLR=625
LED0=0; // 打开 LED0
while(1)
{
if(KEY_Scan(0)==WKUP_PRES)IWDG_Feed(); // WKUP_PRES= 4
delay_ms(10);
}
}
依据 Tout=((4*2^prer)*rlr)/40 (ms) 的公式
Tout = ((4x2^4)*625)/40 (ms) =1000(ms)
实验的结果
本期笔记完毕!
。