STM32
直播中

陈键

7年用户 1007经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

STM32CubeMX怎么配置生成?

独立看门狗与窗口看门狗的特点是什么?

STM32CubeMX怎么配置生成?

回帖(1)

陈衡毅

2021-9-22 15:42:22
一、看门狗介绍



  • STM32的看门狗分为独立看门狗和窗口看门狗两种,两者的使用范围大致如下图所示:









  • STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。独立看门狗(IWDG)是独立于系统之外,因为有独立时钟。窗口看门狗(WWDG)是系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去作用了。主要用于监视软件错误。
  • 使用看门狗的目的:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗威廉希尔官方网站 就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号)。









  • 独立看门狗(IWDG)与窗口看门狗(WWDG)的特点:









  • 独立看门狗(IWDG)没有中断功能,只要在计数器减到0(下限)之前,重新装载计数器的值,就不会产生复位,独立看门狗有硬件和软件之分,硬件是通过烧写器的“设定选项几节等”配置,一旦开启了硬件看门狗,那么就停不下来了,只能在重新配置“设定选项几节等”才能关掉硬件看门狗,软件看门狗只需要设置IWDG->KR=0XCCCC;就可以启动看门狗了,软件狗可以在系统复位时关掉,如果在在初始化里开启软件看门狗,那就开启了软件看门狗,独立看门狗是12位递减的寄存器,使用片子内部的RC振荡器,这个振荡器是关不掉的。
  • 窗口看门狗(WWDG)有中断,这个中断的作用是在计数器达到下限0x40的时候,产生中断,让你喂狗,如果你不喂狗,计数器的值变为0x3f的时候,将会产生系统复位,即使是喂狗,也应该在中断里快速喂狗,要不时间长了计数器减一也会变成0x3f产生复位,这个时间根据芯片手册的公式进行计算即可得到,窗口看门狗只有软件开启方式,还有一个上限值,这个值如果大于计数器的初始值,那么就没有任何作用了,这个值小于计数器的初始值得时候,当计数器的值大于上限值时你对计数器进行装载,将会产生复位,只有在计数器减到小于上限值时,你才能重新装载计数器,意思就是说只有计数器的值在上限值和下限值之间你才能装载计数器,否则就会产生系统复位,当上限值小于下限值,也没有意义。

二、STM32CubeMX配置(本文使用的STM32CubeMX版本为5.6.0)
思路:每进入喂狗一次,串口打印输出一次喂狗成功
1.MCU选型
本例程使用的为STM32L051C8T6型号
2.使能时钟





3.设置GPIO口





4.开启独立看门狗
①配置状态










由图可知LSI频率为37KHZ,看门狗定义周期时间的方式和基本、通用类型可编程定时器完全一致,假设定义1秒周期的看门狗定时器,超过1秒不喂狗就进行系统复位,计算方式如下:这里





提示:由于LSI振荡器精度有限,在运行过程中会存在一定的误差。
②串口打印部分的配置可参看前面的文章(4)串口实验配置
5.配置STM32CubeMX生成工程文件










6.点击GENERATE CODE生成工程文件
二、KEIL程序
1.相关函数:
独立看门狗初始化函数,此函数初始化了在STM32CubeMX内设置的参数,系统已经处理好了,并已经添加在了main函数内;
MX_IWDG_Init();  //独立看门狗初始化 喂狗调用函数,这个需要我们自行添加到main函数的while内;
HAL_IWDG_Refresh(&hiwdg); 本例程的main.c
int main(void){  /* USER CODE BEGIN 1 */  /* USER CODE END 1 */  /* MCU Configuration--------------------------------------------------------*/  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */  HAL_Init();  /* USER CODE BEGIN Init */  /* USER CODE END Init */  /* Configure the system clock */  SystemClock_Config();  /* USER CODE BEGIN SysInit */  /* USER CODE END SysInit */  /* Initialize all configured peripherals */  MX_GPIO_Init();  MX_IWDG_Init();  MX_USART1_UART_Init();  /* USER CODE BEGIN 2 */  HAL_UART_Transmit_IT(&huart1 ,aTxBuffer,sizeof(aTxBuffer)); //sizeof()可读取目标数组长度        HAL_UART_Receive_IT(&huart1,aRxBuffer,1);        printf("rnSTM32L051C8T6 开发板独立看门狗实验rn");  /* USER CODE END 2 */  /* Infinite loop */  /* USER CODE BEGIN WHILE */  while (1)  {                                printf("nr 开始喂狗 !!!nr");                HAL_IWDG_Refresh(&hiwdg);                printf("nr 喂狗成功 !!!nr");                HAL_Delay(500);    /* USER CODE END WHILE */    /* USER CODE BEGIN 3 */  }  /* USER CODE END 3 */} 2.编译文件,下载。即可,实现效果如下:





源工程文件代码下载:https://download.csdn.net/download/cheng_nnan/12333614
举报

更多回帖

发帖
×
20
完善资料,
赚取积分