Análise detalhada do cão de guarda independente IWDG

índice

Análise detalhada do cão de guarda independente IWDG

Por que deveria haver um cão de guarda?

O princípio de temporização do cão de guarda

Introdução às funções de registro

Princípio de contagem do cronômetro de vigilância

Registros relacionados ao Watchdog

Registro KR

Registro de relações públicas

Registro RLR

Registro SR

Conhecimento básico de watchdog

O que é "tempo de estouro"?

Qual é a utilidade do prescaler?

Como o "tempo de estouro" é calculado?

Coeficientes de prescaler diferentes e tempo de overflow correspondentes a diferentes valores de recarga

Período de tempo limite mínimo e período de tempo limite máximo

Função de biblioteca de operação de watchdog independente IWDG

Etapas de operação de watchdog independente de IWDG

Exemplo de função

Main.c

Led.c

Led.h.

Iwdg.c

Iwdg.h

Key.h

Key.c

resultado da operação


Análise detalhada do cão de guarda independente IWDG

Por que deveria haver um cão de guarda?

 

O princípio de temporização do cão de guarda

Introdução às funções de registro

 

Princípio de contagem do cronômetro de vigilância

Registros relacionados ao Watchdog

Registro KR

 

Registro de relações públicas

 

Registro RLR

 

Registro SR

 

Conhecimento básico de watchdog

O que é "tempo de estouro"?

O tempo de estouro refere-se ao "tempo para diminuir do valor de recarregamento para 0". Quando o tempo desde a última ativação do registro de chave exceder o tempo de estouro, o watchdog será redefinido automaticamente e o programa começará a ser executado após o recarregamento. Por exemplo: quando definimos o tempo de overflow para 1s, mas o tempo que operamos o registro de chave do último registro de tecla de ativação é 1,2s, isso significa que o programa foi redefinido e executado desde o início (executado a partir do cabeçalho da função principal) )

Qual é a utilidade do prescaler?

 

Como o "tempo de estouro" é calculado?

 

 

 

Coeficientes de prescaler diferentes e tempo de overflow correspondentes a diferentes valores de recarga

 

Período de tempo limite mínimo e período de tempo limite máximo

Tempo limite mínimo

Quando o valor de recarga é 1 e o coeficiente do prescaler é 1, o tempo de estouro é (1 / 40KHz) s

Tempo limite mais longo

Quando o valor de recarga é 0x0FFF e o coeficiente do prescaler é 256, o tempo de estouro é (1 / 40KHz * 256 * 0xFFF) s

Função de biblioteca de operação de watchdog independente IWDG

 

 

Etapas de operação de watchdog independente de IWDG

Descrição da etapa

Descrição da função de biblioteca correspondente

Cancelar registro de proteção contra gravação

IWDG_WriteAccessCmd ()

Defina o coeficiente do prescaler do watchdog independente para determinar o relógio

IWDG_SetPrescaler ()

Defina o valor de recarga do watchdog e determine o tempo de estouro

IWDG_SetReload ()

App alimentando o cachorro

IWDG_ReloadCounter ()

Habilitar watchdog

IWDG_Enable ()

Exemplo de função

Main.c

#include "iwdg.h"  
#include "led.h"  
#include "delay.h"  
#include "key.h"  
#include "stm32f10x.h"  
  
int main()  
{  
    delay_init(); // 使能定时器初始化delay函数  
    delay_ms(500);  
    LED_InitConfig();  
    IWDG_InitConfig(625, IWDG_Prescaler_16); // 溢出时间为1s  
    KEY_InitConfig();  
    LED0 = 0;  
      
    while(1)  
    {  
        if(KEY0 == 0)  
        {  
            delay_ms(10);  
            if(KEY0 == 0)  
            {  
                IWDG_ReloadCounter(); // 配置KR寄存器将重装载值加载进递减计数器中  
            }  
        }     
    }  
}  

 

Led.c

#include "led.h"  
#include "stm32f10x.h"  
  
void LED_InitConfig()  
{  
      
    GPIO_InitTypeDef GPIO_InitStructure;  
      
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能外设时钟  
      
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;  
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
    GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化IO口属性  
      
    GPIO_ResetBits(GPIOB, GPIO_Pin_5); // 初始化IO口状态  
}  

 

Led.h.

#ifndef _LED_H  
#define _LED_H  
  
#include "sys.h"  
  
void LED_InitConfig();  
  
#define LED0 PBout(5)  
  
#endif  

 

Iwdg.c

#include "iwdg.h"  
#include "stm32f10x.h"  
  
void IWDG_InitConfig(u16 RLR,u16 PR)  
{  
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); // 先对KR寄存器写入0x5555来允许修改PR寄存器与RLR寄存器的值  
      
    IWDG_SetPrescaler(PR); // 给预分频寄存器设置预分频系数  
      
    IWDG_SetReload(RLR); // 在重装载寄存器中设置重装载值  
      
    IWDG_ReloadCounter(); // 对KR寄存器吸入0xAAAA来将重装载值装入递减计数器中替换默认值0x0FFF  
      
    IWDG_Enable(); // 对KR寄存器写入0xCCCC来配置完IWDG所有属性后使能IWDG独立看门狗  
}  

 

Iwdg.h

#ifndef _IWDG_H  
#define _IWDG_H  
  
#include "sys.h"  
  
void IWDG_InitConfig(u16 RLR,u16 PR);  
  
#endif  

 

Key.h

#ifndef _KEY_H  
#define _KEY_H  
  
#include "stm32f10x.h"  
  
void KEY_InitConfig();  
  
#define KEY0 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4)  
  
#endif  

 

Key.c

#include "key.h"  
#include "stm32f10x.h"  
  
void KEY_InitConfig()  
{  
    GPIO_InitTypeDef GPIO_InitStructure;  
      
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); // 使能外设时钟  
      
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;  
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
    GPIO_Init(GPIOE, &GPIO_InitStructure); // 配置KEY0的属性  
    // 切记:引脚在输入状态不可以给予引脚初始电平  
}  

resultado da operação

Quando pressionamos a tecla KEY0 antes de reiniciar, o LED0 não piscará e o LED0 permanecerá aceso.

 

Acho que você gosta

Origin blog.csdn.net/weixin_45590473/article/details/108011731
Recomendado
Clasificación