请选择 进入手机版 | 继续访问电脑版
搜索
查看: 210|回复: 1

[分享] STM32CubeMX系列|独立看门狗

[复制链接]

该用户从未签到

1272

主题

2390

帖子

0

蝴蝶豆

管理员

最后登录
2020-10-30
发表于 2020-9-21 13:11:21 | 显示全部楼层 |阅读模式
独立看门狗

1. 独立看门狗简介

看门狗其实就是一个定时器,从功能上说它可以让微控制器在程序发生意外(程序进入死循环或跑飞)的时候,能重新回复到系统刚上电状态,以保障系统出问题的时候可以重启一次。说的复杂一点,看门狗就是能让程序出问题是能重新启动系统
STM32的独立看门狗(IWDG)由内部专门的40KHz低速时钟驱动,即使主时钟发生故障,它也仍然有效。注意IWDG的时钟是一个内部RC时钟,是一个在30~60KHz之间的一个可变化的时钟,只是我们在估算的时候以40KHz的频率来计算,看门狗对时间的要求不是很精确
独立看门口功能框图如下。实际上独立看门口狗是一个递减计数器,当计时器的值减到0时,IWDG会产生一个复位信号,系统复位重新启动。为避免产生看门狗复位,则需在计数器减到0之前重载计数器,即“喂狗”。当程序出错时没有刷新计数器,计数器递减到0,系统复位重新启动,避免程序继续错误运行



1_meitu_18.jpg


独立看门狗超时时间(40KHz的输入时钟LSI)


2_meitu_19.jpg


2. 硬件设计

使用USART1来打印调试信息,PC0用来指示程序是否复位

3_meitu_20.jpg


3. 软件设计3.1 STM32CubeMX设置
  • RCC设置外接HSE,时钟设置为72M;IWDG的时钟默认为LSI时钟
  • PC0设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平
  • USART1选择为异步通讯方式,波特率设置为115200Bits/s,传输数据长度为8Bit,无奇偶校验,1位停止位
4_meitu_21.jpg


  • 激活IWDG,IWDG的时钟为40kHz,此时设置计数器时钟为32分频,则分频后的时钟频率为1.25KHz(时钟周期为1s/1250 = 0.8ms),递减基础器重载值(down-counter reload value)配置为1000,即800ms不刷新IWDG则系统复位

5_meitu_22.jpg

  • 输入工程名,选择工程路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码



3.2 MDK-ARM编程

  1. void MX_IWDG_Init(void){
  2.   hiwdg.Instance = IWDG;
  3.   hiwdg.Init.Prescaler = IWDG_PRESCALER_32;
  4.   hiwdg.Init.Reload = 1000;
  5.   if (HAL_IWDG_Init(&hiwdg) != HAL_OK){
  6.     Error_Handler();
  7.   }
  8. }
复制代码

  • 在main函数中编写代码,while循环里每500ms喂一次狗
  1. int main(void){
  2.   HAL_Init();
  3.   SystemClock_Config();
  4.   /* Initialize all configured peripherals */
  5.   MX_GPIO_Init();
  6.   MX_IWDG_Init();
  7.   MX_USART1_UART_Init();
  8.   /* USER CODE BEGIN 2 */
  9.   printf("\r\n***** AndyXi IWDG test program *****\r\n");
  10.   HAL_Delay(300);
  11.   HAL_GPIO_WritePin(GPIOC,LED1_Pin,GPIO_PIN_RESET);
  12.   /* USER CODE END 2 */
  13.   /* USER CODE BEGIN WHILE */
  14.   while (1){
  15.         printf("\r\nRefreshes the IWDG...!\r\n");
  16.         HAL_IWDG_Refresh(&hiwdg);
  17.         HAL_Delay(500);
  18.     /* USER CODE END WHILE */
  19.   }
  20. }
复制代码



4. 下载验证
  • while循环里每500ms喂一次狗,因此程序不会被复位,LED1常亮


6_meitu_23.jpg


  • 如果注释掉while循环里的喂狗动作,程序会一直被复位,LED1闪烁




7_meitu_24.jpg








回复

使用道具 举报

该用户从未签到

2

主题

70

帖子

2

蝴蝶豆

高级会员

最后登录
2020-10-29
发表于 2020-9-22 08:58:42 | 显示全部楼层
这个看门口没有使能就启动了?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /2 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2020-10-31 15:46 , Processed in 0.071293 second(s), 17 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表