当前位置: 首页 > news >正文

32单片机——独立看门狗

1、IWDG的简介 

        IWDG:Independent watchdog,即独立看门狗

        独立看门狗本质上是一个定时器,该定时器是一个12位的递减计数器,当计数器的值减到0的时候,就会产生一个复位信号

        如果在计数没减到0之前,重置计数器的值的话,那么就不会产生复位信号,这个动作我们称为喂狗

(1)本质:能产生系统复位信号的计数器

(2)特性:12位的递减的计数器,时钟由独立的RC振荡器提供(可在待机和停止模式下运行),看门狗被激活后,当递减计数器计数到0x000时产生复位

(3)喂狗:在计数器计数到0之前,重装载计数器的值,防止复位

(4)作用:主要用于检测外界电磁干扰或硬件异常导致的程序跑飞问题,即检测异常 

什么是异常?

外界电磁干扰或者自身系统(硬件或软件)异常,造成程序跑飞,如:陷入某个不正常的死循环,打断正常的程序运行 

(5)应用:在一些需要高稳定性的产品中,并且对时间精度要求较低的场合

2、IWDG框图

简图如下所示:

3、IWDG溢出时间计算

T_{out}:看门狗溢出时间

f_{IWDG}:看门狗的时钟源频率(30~60Khz),一般以40Khz来计算

prer:IWDG_PR的值(000~111)

rlr:看门狗重装载值(0~4095) 

4、IWDG的配置步骤

(1)取消PR/RLR寄存器写保护,设置IWDG,预分频系数和重装载值,启动IWDG

HAL_IWDG_Init();

(2)及时喂狗,即写入0xAAAA到IWDG_KR

HAL_IWDG_Refresh();

IWDG配置:

IWDG_HandleTypeDef iwdg_handle;  //iwdg句柄
//初始化iwdg
void iwdg_init(uint8_t psc,uint16_t alr){
    iwdg_handle.Instance=IWDG;  //寄存器基地址
    iwdg_handle.Init.Prescaler=psc;  //预分频系数
    iwdg_handle.Init.Reload=alr;  //重装载值
    HAL_IWDG_Init(&iwdg_handle);  //取消写保护
}

//喂狗
void iwdg_refresh(void){
    HAL_IWDG_Refresh(&iwdg_handle);
}

HAL_IWDG_Init

功能:使能IWDG,设置预分频系数和重装载值等 

HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg) 

typedef struct{
  IWDG_TypeDef                 *Instance;  /*  寄存器基地址  */

  IWDG_InitTypeDef             Init;           /*  IWDG必需参数  */
} IWDG_HandleTypeDef;

typedef struct{
  uint32_t Prescaler;  /*  预分频系数  */

  uint32_t Reload;      /*  重装载值(0~0x0FFF)  */

} IWDG_InitTypeDef;

Prescaler预分频系数如下所示:

#define IWDG_PRESCALER_4      0x00000000U                                             /*  4  */
#define IWDG_PRESCALER_8      IWDG_PR_PR_0                                        /*  8   */
#define IWDG_PRESCALER_16     IWDG_PR_PR_1                                       /*  16  */
#define IWDG_PRESCALER_32     (IWDG_PR_PR_1 | IWDG_PR_PR_0)      /*  32  */
#define IWDG_PRESCALER_64     IWDG_PR_PR_2                                       /*  64  */
#define IWDG_PRESCALER_128    (IWDG_PR_PR_2 | IWDG_PR_PR_0)     /*  128 */
#define IWDG_PRESCALER_256    (IWDG_PR_PR_2 | IWDG_PR_PR_1)     /*  256 */ 

HAL_IWDG_Refresh 

功能:把重装载寄存器的值重载到计数器中,喂狗 

HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg) 

5、实现喂狗操作

int main(void){
    uint8_t key;
    HAL_Init();
    sys_stm32_clock_init(RCC_PLL_MUL9);  //设置系统时钟
    delay_init(72);
    
    led_init();
    beep_init();
    key_init();
    usart_init(115200);  //串口
    HAL_Delay(100);
    
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
    iwdg_init(IWDG_PRESCALER_64,625);  //初始化iwdg    设置预分频系数64     重装值625    溢出时间1s
    while (1){
        key=scan(0);
        if(key==4){        //当按下KEY_UP键时喂狗
            iwdg_refresh();
        }
  }
}
 

http://www.xdnf.cn/news/226711.html

相关文章:

  • OpenCV 图形API(74)图像与通道拼接函数-----合并三个单通道图像(GMat)为一个多通道图像的函数merge3()
  • 前端技巧——性能优化篇
  • 哪些因素会影响远程视频监控的质量?浅述EasyCVR视频智能诊断技术
  • 【AI平台】n8n入门5:创建MCP服务,及vscode调用MCP测试
  • Spring AOP概念及其实现
  • uniapp如何获取安卓原生的Intent对象
  • 基于用户场景的汽车行驶工况构建:数据驱动下的能耗优化革命
  • 游戏引擎学习第249天:清理调试宏
  • ZYNQ MPSOC之PL与PS数据交互DMA方式
  • Android学习总结之算法篇六(数组和栈)
  • 2025东三省D题深圳杯D题数学建模挑战赛数模思路代码文章教学
  • 边缘计算:数字世界的”末梢神经系统”解析-优雅草卓伊凡
  • 阿里云 ECS 服务器进阶指南:存储扩展、成本优化与架构设计
  • Linux C++ xercesc xml 怎么判断路径下有没有对应的节点
  • C++静态编译标准库(libgcc、libstdc++)
  • (初探)强化学习路径规划的理论基础与代码实现
  • 理解数据湖
  • 无忧AI综合插件,可实现图色识别、机器视觉、图像编辑等多种功能
  • C++ 与多技术融合的深度实践:从 AI 到硬件的全栈协同
  • ActiveMQ 可靠性保障:消息确认与重发机制(二)
  • 【鸿蒙HarmonyOS】一文详解华为的服务卡片
  • 在深度学习中,什么是线性插值(linear interpolation)?
  • 实战:用 Spring Boot 快速构建一个 Kafka 消息系统
  • 江西省电价新政发布!微电网源网荷储充一体化平台重塑企业能源格局!
  • AI 助力 Python:长时序植被遥感动态分析与生态评估
  • spring--事务详解
  • Grounding DINO
  • ROS:发布相机、IMU等设备消息主题
  • 【默子速报】DeepSeek新模型 Prover-V2 报告解读
  • 某大麦某眼手机端-抢票