STM32
直播中

莫循虎

7年用户 934经验值
私信 关注
[问答]

STM32F103ZET6独立看门狗有哪些操作步骤

STM32F103ZET6独立看门狗有哪些操作步骤?
STM32F103ZET6独立看门狗的主函数是什么?

回帖(1)

魏双艳

2021-9-17 18:02:34
  一.开发板原理图
  硬件设备与printf重定向一致。
  PS:该程序在上一个printf重定向的实验中修改完成。
  二.操作步骤。
  分析:
  首先独立看门狗的作用是用于检测并解决由软件错误导致的故障,当软件出错的时候,可以通过独立看门狗将系统复位。
  它的实质是一个12位的递减计数器,当数值递减到0的时候会让系统产生一次复位,如果在0之前刷新了数值的话系统就不会复位了,这个过程称之为喂狗。
  该功能的供电由VDD电压域供电,所以在停止模式和待机模式下也能工作。
  PS:由于独立看门狗开启过后就无法关闭,除非是系统复位且不开启独立看门狗。
  所以如果可以不用独立看门狗的话,就尽量的不要启用。
  
  1:是IWDG的时钟。它由其专用的低速时钟LSI驱动,计时主时钟发生故障仍然可以保持工作。频率为40KHz(由于该时钟并不是很精确,所以该看门狗只使用于对于时间精度要求比较低的场合)。
  2:是IWDG的预分频器寄存器,LSI时钟通过一个8位预分频寄存器IWDG_PR分频后输入给计数器时钟。通过对该寄存器写入值来设置分频因子。(4、8、16、32、64、128、256)
  计数器时钟(CK-CNT) = 40/4*2……PRE(PRE即预分频系数)。经过一个时钟,计数器的值就会减一。(PRE从0——6)
  3:是计数器,有12位,计数范围从 0x000——0xFFF.
  4:是重装载值的寄存器。,一样有十二位,设定的是计数器的初始值。从该值开始计数,到0会产生一次复位。溢出时间(TimeOut) = (4*2^PRE)/40*ReloadValue(ms)
  5:是密钥寄存器(IWDG_KR)。这个寄存器是IWDG的一个控制寄存器。
  当写入的值不同时,寄存器会有不同的控制效果:
  0X5555:因为预分频寄存器和重装载值寄存器都有写访问保护,要修改寄存器的值的时候就要先接触写保护。
  0XAAAA:写入这个将IWDG_RLR寄存器内的值重装载到计数器中。
  0XCCCC:写入这个将启动IWDG的功能,此属软件启动,一旦开启的IWDG的话它就关不掉,只有复位才可以关掉。
  6:是它的状态寄存器(IWDG——SR),只有位0:PVU和位1:RVU操有效,只能由硬件置0和1.当RVU状态是1的时候表明看门狗计数器重装载值的更新,置为1的时候表明重装载值的更新正在进行中,更新完毕之后由硬件清0。PVU:看门狗预分频值更新,硬件1表示预分频值的更新正在进行中,完成后由硬件置为0.
  三.程序部分。
  要用独立看门狗的话要加入有关独立看门狗的文件。
  
  然后新建一个文件夹IWDG用于存放有关独立看门狗的源文件和头文件。
  
  双击STM32中的IWDG的头文件,查看相关的配置。
  进入独立看门狗的头文件中查看相关的操作。右边的五个函数分别的意义是如下图所示。
  
  进行相关的配置即可。上面也是IWDG初始化的程序。
  接下来还要编写一个 喂狗的程序。
  
  这就是IDWG的所有的源文件的程序书写。
  之后在头文件中声明以下,添加该文件夹的编译路径即可开始编写主函数。
  
  添加自己的独立看门狗的书写的文件夹路径即可。
  主函数的书写。
  IWDG.h文件
  #ifndef _IWDG_H
  #define _IWDG_H
  #include “system.h”
  void IWDG_FeedDOG(void);
  void IWDG_Init(u8 IWDG_Prescaler, u16 Reload);
  #endif
  IWDG.c文件
  #include “iwdg.h”
  void IWDG_Init(u8 Prescaler, u16 Reload)
  {
  //开启寄存器的写操作
  IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
  IWDG_SetPrescaler(Prescaler);
  //设置预分频系数
  IWDG_SetReload(Reload);
  //设定重载值
  IWDG_ReloadCounter();
  //重新装载
  IWDG_Enable();
  //独立看门狗使能
  }
  //喂狗 void IWDG_FeedDOG(void)
  {
  IWDG_ReloadCounter();//重新装载初值
  }
  main.c文件
  #include “system.h”
  #include “SysTick.h”
  #include “led.h”
  #include “pwm.h”
  #include “Usart.h”
  #include “key.h”
  #include “iwdg.h”
  /********************************************* 程序写好后,下载到开发板上,打开我们的串口调试助手, 设置波特率为9600,数据位8位,停止位1位 按下向上的按键,第二个led会亮起同时串口会打印喂狗信息 如果1280ms内没有按下的话,led2就会重新熄灭,并且串口会打印出复位系统的信息 led1的闪烁表明我们的程序是否正常在进行。(检测作用) *********************************************/
  int main()
  {
  u8 i;
  SysTick_Init(72);
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  LED_Init();
  KEY_Init();
  USART1_Init(9600);
  IWDG_Init(4, 800);
  //IWDG的初始化,分频系数为4, 初始装载值是800
  //根据计算可以知道如果在1280ms内没有执行喂狗的话就会重启程序 printf(“复位系统rn”);
  while(1)
  {
  if(KEY_Scan(0) == KEY_UP)
  //按下向上按键为喂狗操作
  {
  IWDG_FeedDOG();
  led2=0;
  //led2做提示灯
  printf(“喂狗rn”);
  //串口上打印信息
  }
  i++;
  if(i%20 == 0)
  {
  led1=!led1;
  //led1用于检测程序是否在正常的及逆行
  }
  delay_ms(10);
  }
  }
  四。实验现象
  按下上键过后会打印喂狗。
举报

更多回帖

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