我爱台妹mmd 发表于 2023-1-31 20:22

MM32之独立看门狗

IWDG主要性能:


• 自由运行的递减计数器
• 时钟由独立的振荡器提供(可在停止和待机模式下工作)
• 看门狗被激活后,则在计数器计数至0x0000 时产生复位。

IWDG功能描述:

在键寄存器(IWDG_KR)中写入0xCCCC。开始启动独立看门狗;此时计数器开始从其复位值0xFFF 递减计数。当计数器计数到末尾0x000 时,会产生一个复位信号(IWGD_RESET)。无论何时,只要在键寄存器IWDG_KR 中写入0xAAAA,IWDG_RLR 中的值就会被重新加载到计数器,从而避免产生看门狗复位。

看门狗寄存器保护:

IWDG_PR 和IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR 寄存器中写入0x5555。以不同的值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入0xAAAA)也会启动写保护功能。状态寄存器指示预分频值和递减计数器是否正在被更新。



我爱台妹mmd 发表于 2023-1-31 20:23

我爱台妹mmd 发表于 2023-1-31 20:23

我爱台妹mmd 发表于 2023-1-31 20:27

下图为预分频寄存器IWDG_PR

我爱台妹mmd 发表于 2023-1-31 20:27

由上图可知分频系数有最低的三位来决定4-256分频

独立看门狗(IWDG)

Tout=((4×2^prer) ×rlr) /40Khz

独立看门狗由内部专门的 40Khz 低速时钟(LSI)驱动。

其中 Tout 为看门狗溢出时间(单位为 s);

prer 为看门狗时钟预分频值(IWDG_PR 值),范围为 0~7;

(4×2^prer)整体为实际预分频值,预分频值可取值为4/8/16/32/64/128/256。

rlr 为看门狗的重装载值(IWDG_RLR 的值);

我爱台妹mmd 发表于 2023-1-31 20:28

我爱台妹mmd 发表于 2023-1-31 20:29

#include "WWDG.h"
#include "led.h"
void wwdg_init(u8 prer,u16 rlr)
{
    RCC->CSR|=RCC_CSR_LSION;//开启内部低速时钟
    IWDG->KR=0X5555;//使能对IWDG->PR和IWDG->RLR的写
    IWDG->PR=prer;//设置分频系数
    IWDG->RLR=rlr;//从加载寄存器 IWDG->RLR
    IWDG_Feed();//reload
    IWDG->KR=0XCCCC;//使能看门狗
}
void IWDG_Feed(void)
{
    IWDG->KR=0XAAAA;//reload                                                                                          
}

我爱台妹mmd 发表于 2023-1-31 20:30

int main(void)
{
    u8 flage=0;
    delay_init();                     //延时初始化
    LED_Init();                                 //初始化与LED连接的硬件接口   
    uart_nvic_init(SystemCoreClock/1000000,115200);       //串口初始化为115200
   LED1=1;
    KEY_Init();
    printf("uart ok!\r\n");
    wwdg_init(4,625);
    while(1)
    {
      if(KEY_Scan(0)==WKUP_PRES)//按键喂狗函数
      {
            flage=30;
            IWDG_Feed();
            LED1=0;
      }
      delay_ms(500);
      if (flage>0)
      {
      flage--;
      IWDG_Feed();
      printf("IWDG_Feed ok!\r\n");
      }
    }       
}

我爱台妹mmd 发表于 2023-1-31 20:30

看门狗的时间的计算在上面我们已经给出了计算的方法,大家看不懂的结合上面的计算过程看一下
页: [1]
查看完整版本: MM32之独立看门狗