用户工具

站点工具


iwdg看门狗实验_复位arm
银杏科技有限公司旗下技术文档发布平台
技术支持电话0379-69926675-801
技术支持邮件Gingko@vip.163.com
版本 日期 作者 修改内容
V1.0 2020-07-04 gingko 初次建立

实验六:IWDG看门狗实验——复位ARM

一、 实验目的与意义

  1. 了解STM32 IWDG结构。
  2. 了解STM32 IWDG 特征。
  3. 掌握IWDG的使用方法。
  4. 掌握STM32 HAL库中IWDG属性的配置方法。
  5. 掌握KEIL MDK 集成开发环境使用方法。

二、 实验设备及平台

  1. iCore4 双核心板点击购买
  2. JLINK(或相同功能)仿真器点击购买
  3. Micro USB线缆。
  4. Keil MDK 开发平台。
  5. STM32CubeMX开发平台。
  6. 装有WIN XP(及更高版本)系统的计算机。

三、 实验原理

1、看门狗简介

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

2、独立看门狗(IWDG)

  • 此器件具有两个嵌入式看门狗外设,具有安全性高、定时准确及使用灵活的优点。两个看门狗外设(独立和窗口)均可用于检测并解决由软件错误导致的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。
  • 独立看门狗(IWDG)由其专用低速时钟(LSI)驱动,因此即便在主时钟发生故障时仍然保持工作状态。窗口看门狗(WWDG)时钟由APB1时钟经预分频后提供,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够安全独立工作,并且对时间精度要求较低的场合。WWDG最适合那些要求看门狗在精度计时窗口起作用的应用程序。

3、IWDG主要特性

  • (1) 自由运行递减计数器。
  • (2) 时钟由独立RC振荡器提供(可在待机和停止模式下运行)。
  • (3) 复位条件:
    • 当递减计数器值达到0x000时产生复位(如果看门狗已激活)。
    • 在窗口之外重载递减计数器时复位(如果看门狗已激活)。

  • 看门狗功能由 VCORE 电压域供电,在停止模式和待机模式下仍能工作。
  • 通过向键寄存器 (IWDG_KR)中写入值 0x0000 CCCC 来启动独立看门狗时,计数器开始从复位值 0xFFF 递减计数。当计数器计数到终值(0x000)时会产生一个复位信号(IWDG复位)。
  • 任何时候将键值 0x0000 AAAA写到IWDG_KR寄存器中, IWDG_RLR的值就会被重载到计数器,从而避免产生看门狗复位。

4、IWDG寄存器

(1)键寄存器(IWDG_KR)
  • 该寄存器的各位描述如图:

  • 在键寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值0xFFF递减计数。当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET)。无论何时,只要键寄存器IWDG_KR中被写入0xAAAA,IWDG_RLR中的值就会被重新加载到计数器中从而避免产生看门狗复位。
  • IWDG_PR和IWDG_RLR寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR寄存器中写入0x5555。将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入0xAAAA)也会启动写保护功能。
(2)预分频寄存器(IWDG_PR)
  • 该寄存器用来设置看门狗时钟的分频系数,最低为4,最高位256,该寄存器是一个32位的寄存器,但是我们只用了最低3位,其他都是保留位。预分频寄存器各位定义如图所示:

(3)重装载寄存器(IWDG_RLR)
  • 该寄存器用来保存重装载到计数器中的值。该寄存器也是一个32位寄存器,但是只有低12位是有效的,该寄存器的各位描述如图所示:

  • 只要对以上三个寄存器进行相应的设置,我们就可以启动 STM32F7 的独立看门狗。
  • 这里我们还要特别说明一下,STM32F7的独立看门狗还可以当做窗口看门狗使用,这是通过配置窗口寄存器IWDG_WINR来实现的。当我们没有设置IWDG_WINR寄存器的时候,独立看门狗就是我们前面讲解的工作过程,窗口计数器从其复位值0xFFF递减计数,当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET),只要键寄存器IWDG_KR中被写入0xAAAA,IWDG_RLR中的值就会被重新加载到计数器中从而避免产生看门狗复位。如果我们设置了IWDG_WINR寄存器的值(不等于0xFFF),那么当计数器值大于窗口值(IWDG_WINR)的值的时候如果执行重装操作,则会产生复位。所以我们必须在计数器的值在IWDG_WINR和0之间的时候执行重载,也就形成了一个窗口的概念。本实验我们将不设置IWDG_WINR寄存器的值,也就是不开启窗口功能。
  • STM32内部包含独立看门狗,通过看门狗可以监控程序运行,程序运行错误时,未在规定时间喂狗,自动复位ARM。本实验通过按键按下,停止喂狗,制造程序运行错误,从而产生复位。

四、 实验程序

1、主函数

int main(void)
{
  /* MCU 配置*/
  /* 重置所有外围设备,初始化Flash接口和Systick */
  HAL_Init();
  /* 配置系统时钟 */
  SystemClock_Config();
  /* 初始化所有已配置的外围设备 */
  MX_GPIO_Init();
  MX_IWDG_Init();
  /* 无限循环 */
  while (1)
  {
        while(ARM_KEY_STATE == KEY_DOWN); //如果按键按下则进入循环,不再喂狗
        HAL_IWDG_Refresh(&hiwdg); //喂狗
        LED_RED_ON;
        LED_GREEN_OFF;
        LED_BLUE_OFF;
        HAL_Delay(500);
        LED_RED_OFF;
        LED_GREEN_ON;
        LED_BLUE_OFF;
        HAL_Delay(500);
        LED_RED_OFF;
        LED_GREEN_OFF;
        LED_BLUE_ON;
        HAL_Delay(500);
  }
}

2、独立看门狗初始化函数

void MX_IWDG_Init(void)
{
  hiwdg.Instance = IWDG;
  hiwdg.Init.Prescaler = IWDG_PRESCALER_64; //选择IWDG的预分频器。
  hiwdg.Init.Window = 0xfff; //要与递减计数器比较的窗口值。
 
  hiwdg.Init.Reload = 1000; //指定IWDG减计数器重新加载值。
  if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

3、喂狗函数

HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
{
  /* 使用重载寄存器中定义的值重载IWDG计数器*/
  __HAL_IWDG_RELOAD_COUNTER(hiwdg);
  /* 返回函数状态 */
  return HAL_OK;
}
  • 该函数的作用是把值0xAAAA写入到IWDG_KR寄存器,从而触发计数器重载, 即实现独立看门狗的喂狗操作。

五、 实验步骤

  1. 把仿真器与iCore4的SWD调试口相连(直接相连或者通过转接器相连);
  2. 把iCore4通过Micro USB线与计算机相连,为iCore4供电;
  3. 打开Keil MDK 开发环境,并打开本实验工程;
  4. 烧写程序到iCore4上;
  5. 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。

六、 实验现象

  • iCore4双核心板三色LED交替闪烁,当按键按下超过2s,看门狗复位ARM。
iwdg看门狗实验_复位arm.txt · 最后更改: 2022/03/22 10:18 由 sean