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

STM32H743-ARM例程9-IWDG看门狗

目录

  • 实验平台
  • 实验介绍
  • 看门狗
  • IWDG
    • IWDG框图
    • IWDG寄存器
      • 键值寄存器 IWDG_KR
      • 预分频寄存器(IWDG_PR)
      • 重装载寄存器(IWDG_RLR)
  • STM32CubeMX生成工程
  • 实验程序
  • 实验现象

实验平台

硬件:银杏科技GT7000双核心开发板-ARM-STM32H743XIH6,银杏科技iToolXE仿真器
软件:最新版本STM32CubeH7固件库,STM32CubeMX v6.10.0,开发板环境MDK v5.35,串口工具putty

实验介绍

  本章我们介绍,如何使用串口向STM32H743发送指令,来完成看门狗喂狗操作。

看门狗

  在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界磁场的干扰,造成各种寄存器和内存的数据混乱,会导致程序指针错误,不在程序区,取出错误的程序指令等,都会陷入死循环。程序的正常运行被打断,由单片机控制的系统无法继续正常工作,会造成整个系统陷入停滞状态,发生不可预料的后果。看门狗就是定期的查看芯片内部的情况,一旦发生错误就向芯片发出重启的电路。看门狗命令在程序的中断中拥有最高的优先级。

IWDG

  独立看门狗(IWDG)用通俗一点的话来解释就是一个12位的递减计数器,当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号,即IWDG_RESET。 果在计数没减到0之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。看门狗功能由 VDD 电压域供电, 在停止模式和待机模式下仍能工作。

IWDG框图

在这里插入图片描述
  从框图我们可以看到,IWDG的12位递减计数器得到一个8位预分频处理器处理后的lsi_ck信号,满足一定条件后,输出复位信号iwdg_out。
在这里插入图片描述
  STM32H7的独立看门狗由内部专门的32Khz低速时钟(LSI)驱动,即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部RC时钟,所以并不是准确的32Khz,而是在17~47Khz之间的一个可变化的时钟,只是我们在估算的时候,以32Khz的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。

IWDG寄存器

键值寄存器 IWDG_KR

该寄存器的各位描述如图:
在这里插入图片描述

  在键寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值0xFFF递减计数。当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET)。无论何时,只要键寄存器IWDG_KR中被写入0xAAAA,IWDG_RLR中的值就会被重新加载到计数器中从而避免产生看门狗复位。
IWDG_PR和IWDG_RLR寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR寄存器中写入0x5555。将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入0xAAAA)也会启动写保护功能。

预分频寄存器(IWDG_PR)

  该寄存器用来设置看门狗时钟的分频系数,最低为4,最高位256,该寄存器是一个32位的寄存器,但是我们只用了最低3位,其他都是保留位。预分频寄存器各位定义如图:
在这里插入图片描述

重装载寄存器(IWDG_RLR)

  该寄存器用来保存重装载到计数器中的值。该寄存器也是一个32位寄存器,但是只有低12位是有效的,该寄存器的各位描述如图:
在这里插入图片描述
只要对以上三个寄存器进行相应的设置,我们就可以启动STM32H7的独立看门狗。
喂狗计算公式为::Tout = ((4×2^pre) × rlr) /32 (ms)
若设置pre=4(64分频),rlr=500时,即Tout=(64×500)/32=1秒,此时必须在一秒内至少喂狗一次,我们可以设置每800ms喂狗一次。

STM32CubeMX生成工程

我们参考前面章节STM32H743-结合CubeMX新建HAL库MDK工程,打开CubeMX软件,重复步骤不再展示,我们来看配置IWDG部分如下图所示:
在这里插入图片描述

实验程序

1. 主函数

int main(void)
{char buffer[UART_BUFFER_SIZE];int i;int n=0;HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_IWDG1_Init();MX_USART6_UART_Init();uart6.initialize(115200);uart6.printf(".  输入 test 并敲回车进行测试  .\r\n");while (1){// 独立看门狗设置"喂狗"时间为1s,如果超过1s没有"喂狗",则"被狗咬",即STM32
复位 if(uart6.receive_ok_flag == 1){uart6.receive_ok_flag = 0;memset(buffer,0,20);memcpy(buffer,uart6.receive_buffer,20);for(i = 0;i < 20;i ++){buffer[i] = tolower(buffer[i]);}if(memcmp(buffer,"test",strlen("test")) == 0){n=1;}else{uart6.printf("\r\n\033[1;31;40mBad Command!\r\n");}		}while(n==1)                           //输入test不再喂狗,STM32将复位HAL_IWDG_Refresh(&hiwdg1);         //每800ms喂狗一次,防止被狗咬HAL_Delay(800);LED_ON;}
}

2. IWDG1初始化函数

void MX_IWDG1_Init(void)
{hiwdg1.Instance = IWDG1;hiwdg1.Init.Prescaler = IWDG_PRESCALER_64;hiwdg1.Init.Window = 4095;hiwdg1.Init.Reload = 500;if (HAL_IWDG_Init(&hiwdg1) != HAL_OK){Error_Handler();}
}

3. 喂狗函数
在HAL中重载计数值的函数是HAL_IWDG_Refresh,它的作用是把值0xAAAA写入到IWDG_KR寄存器,从而触发计数器重载,即实现独立看门狗的喂狗操作。该函数声明为:

HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
{__HAL_IWDG_RELOAD_COUNTER(hiwdg);return HAL_OK;
}

实验现象

GT7000双核心板LED常亮,当向终端发送“test”后,程序不再喂狗,看门狗复位arm后可在串口接收到“输入 test 并敲回车进行测试”,并且led短暂熄灭后重新常亮。
在这里插入图片描述

http://www.dtcms.com/a/414739.html

相关文章:

  • 什么是 mmdet3d
  • 建设银行嘉兴分行网站首页胶州网站建设dch100
  • Metal - 9. 深入剖析 3D 场景
  • 3DVG的当前面临的挑战和问题
  • 无代码企业网站开发网站建设管理和维护
  • 【C++】string类的常见接口的使用
  • 网站建设制作设计营销公司杭州亚马逊雨林探险作文
  • 东莞圆心科技网站开发哪里有做网站系统
  • 网站定位要点 有哪些方面大航母网站建设费用
  • iServer 启动端口冲突
  • 大连网站建设佳熙科技湖南专业seo优化公司
  • 单词配对记忆游戏小程序V1.1.0-“太空霓虹“视觉升级版
  • 如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘onnxruntime’ 问题
  • 设备租赁结算软件有哪些
  • 全网首先 Docker Compose 启动Postgresql18
  • 公司网站非响应式模板网站建设包括内容
  • 180课时吃透Go语言游戏后端开发5:Go语言中的条件语句
  • 企业信息化建设总体规划设计方案
  • 淮北做网站的公司网站建设荣茂
  • Redis 核心知识体系总结
  • 网站图片速度临沂市经济开发区建设局网站
  • React第四天——hooks
  • 地方网站如何做网页版梦幻西游好玩吗
  • 无人机,无人车等机器人系统分布式集群技术难点
  • 企业网站硬件方面建设如何做移动端网站
  • 【代码随想录day 28】 力扣 1005. K次取反后最大化的数组和
  • Python 2025:云原生与容器化技术的新浪潮
  • 上网出现危险网站wordpress批量修改文章内链接
  • 速通ACM省铜第十六天 赋源码(Sigma Cubes和Find Permutation 2和Rotate and Sum Query)
  • 算法题(219):纪念品