zoukankan      html  css  js  c++  java
  • stm32 看门狗配置

    1.独立看门狗:

    1) 取消寄存器写保护(向 IWDG_KR 写入 0X5555

    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);  //使能或者失能

    2) 设置独立看门狗的预分频系数和重装载值

    void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值

    void IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值

    注意的是分频的取值范围为0~7,且计算时间为Tout=((4×2^prercaler) ×reload) /40

    3) 重载计数值喂狗(向 IWDG_KR 写入 0XAAAA

    IWDG_ReloadCounter(); //按照 IWDG 重装载寄存器的值重装载 IWDG 计数器

    4) 启动看门狗(IWDG_KR 写入 0XCCCC)

    IWDG_Enable(); //使能 IWDG

    这里要注意的是一旦开启了看门狗,就关闭不了了,除非重启。

     1 void IWDG_Init(u8 prer,u16 rlr)
     2 {
     3   IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //①使能对寄存器 I 写操作
     4   IWDG_SetPrescaler(prer); //②设置 IWDG 预分频值:设置 IWDG 预分频值
     5   IWDG_SetReload(rlr); //②设置 IWDG 重装载值
     6   IWDG_ReloadCounter(); //③按照 IWDG 重装载寄存器的值重装载 IWDG 计数器
     7   IWDG_Enable(); //④使能 IWDG
     8 }
     9 //喂独立看门狗
    10 void IWDG_Feed(void)
    11 {
    12   IWDG_ReloadCounter();//reload
    13 }

    2.窗口看门狗:

    1) 使能 WWDG 时钟 

    由于WWDG和IWDG不一样,WWDG使用的是PCLK1时钟,因此使用前要使能时钟。

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 时钟使能

    2) 设置窗口值和分频数

    void WWDG_SetWindowValue(uint8_t WindowValue)

    void WWDG_SetPrescaler(uint32_t WWDG_Prescaler)

    3) 开启 WWDG 中断并分组

    WWDG_EnableIT(); //开启窗口看门狗中断

    接下来是进行中断优先级配置,这里就不重复了,使用 NVIC_Init()函数即可。

    4) 设置计数器初始值并使能看门狗

    void WWDG_Enable(uint8_t Counter)

    5) 编写中断服务函数    

     1 u8 WWDG_CNT=0x7f;
     2 //初始化窗口看门狗
     3 //tr :T[6:0],计数器值
     4 //wr :W[6:0],窗口值
     5 //fprer:分频系数(WDGTB) ,仅最低 2 位有效
     6 //Fwwdg=PCLK1/(4096*2^fprer).
     7 void WWDG_Init(u8 tr,u8 wr,u32 fprer)
     8 {
     9   RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 时钟使能
    10   WWDG_CNT=tr&WWDG_CNT; //初始化 WWDG_CNT.
    11   WWDG_SetPrescaler(fprer); //设置 IWDG 预分频值
    12   WWDG_SetWindowValue(wr); //设置窗口值
    13   WWDG_Enable(WWDG_CNT); //使能看门狗,设置 counter
    14   WWDG_ClearFlag(); //清除提前唤醒中断标志位
    15   WWDG_NVIC_Init(); //初始化窗口看门狗 NVIC
    16   WWDG_EnableIT(); //开启窗口看门狗中断
    17 }
    18 //重设置 WWDG 计数器的值
    19 void WWDG_Set_Counter(u8 cnt)
    20 {
    21   WWDG_Enable(cnt); //使能看门狗,设置 counter .
    22 }
    23 //窗口看门狗中断服务程序
    24 void WWDG_NVIC_Init()
    25 {
    26   NVIC_InitTypeDef NVIC_InitStructure;
    27   NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; //WWDG 中断
    28   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占 2 子优先级 3 组 2
    29   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //抢占 2,子优先级 3,组 2
    30   NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    31   NVIC_Init(&NVIC_InitStructure); //NVIC 初始化
    32 }
    33 void WWDG_IRQHandler(void)
    34 {
    35   WWDG_SetCounter(WWDG_CNT); //当禁掉此句后,窗口看门狗将产生复位
    36   WWDG_ClearFlag(); //清除提前唤醒中断标志位
    37   LED1=!LED1; //LED 状态翻转
    38 }

    知识来源:STM32F1开发指南-库函数版本_V3.1 

  • 相关阅读:
    控件显示和隐藏
    删除标题和边框
    界面图片
    VC界面最前端显示
    在VC++6.0开发中实现全屏显示
    VC比例放大缩小
    plsql dev
    通过OCCI连接oracle(C++)
    VC++使用Pro*CC++
    文件对话框
  • 原文地址:https://www.cnblogs.com/zengsf/p/7201611.html
Copyright © 2011-2022 走看看