目录

独立看门狗实验

实验目的

1. 了解STM32的内部独立看门狗;
2. 学会配置独立看门狗。

实验内容

利用独立看门狗的中断功能来喂狗,通过 printf 打印输出。

实验说明

main.c
/*******************************************************************************
*   		       
--------------------------------------------------------------------------------
* 实 验 名      : 独立看门狗实验
* 实验说明      : 通过配置好内部独立看门狗,printf打印初始显示数据后进入while循环开始喂狗,
                 在串口助手上显示其输出,按下复位开关重新运行
* 连接方式      : 
* 注    意      : 所用函数在头文件.c文件内
*******************************************************************************/
 
#include "public.h"
#include "printf.h"
#include "systick.h"
#include "iwdg.h"
 
/****************************************************************************
* Function Name  : main
* Description    : Main program.
* Input          : None
* Output         : None
* Return         : None
****************************************************************************/
int main()
{	
    printf_init(); //printf初始化
    iwdg_init();   //独立看门狗初始化配置
    printf("STM32 欢迎您!\r\n");
    while(1)
    {
        IWDG_ReloadCounter(); //喂狗的时间为1.28s
        printf("喂狗\r\n");	
        delay_ms(1000);	//只要在喂狗时间内喂狗就不会让系统以为死机进入复位状态
    }			
}

iwdg.c
#include "iwdg.h"
 
/*******************************************************************************
* 函 数 名      : iwdg_init
* 函数功能      : 独立看门狗模式配置初始化	   
* 输    入      : 无
* 输    出      : 无
*******************************************************************************/
void iwdg_init()	//独立看门狗初始化配置
{
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); // 使能寄存器,写功能
    IWDG_SetPrescaler(IWDG_Prescaler_64); // 设置IWDG预分频系数 = 64/40K = 1.6ms
    IWDG_SetReload(800); // 设置IWDG重装载值,12位的(0~4095),取800,则喂狗时间 = 800*1.6ms = 1.28s
    IWDG_ReloadCounter(); // 按照IWDG重装载寄存器的值重装载IWDG计数器
    IWDG_Enable();//使能IWDG
}

实验步骤

1. 使用 1 根 2P 杜邦线连接核心板 PA2连接“两路串行通信”单元的TXD1,PA3与 RXD1连接。(printf 输出定义在USART2上面)
2. “两路串行通信”单元中的卧式开关打在“串行”上,串口线DB1同电脑连接。
3. 在KEIL软件中调试运行“独立看门狗”工程文件。
4. 实验现象:打开PC端串口调试助手 选择连接串口,设置波特率为9600,字符串显示。

实验任务

1. 按上述步骤调试出结果;
2. 将主程序中 while 循环内的延时增大到2秒,观察现象,并分析原因,解决问题;
3. 将 iwdg.c 中第12行的预分频系数 IWDG_Prescaler_64 设置为 IWDG_Prescaler_4,观察现象;
   若产生复位,试分析原因并解决此问题;
4. 若想每隔 5 秒钟才喂一次狗,如何保证看门狗有效(不会产生复位)?

任务解答

任务2:

1). 延时增大到2秒时,MCU反复复位。
2). 原因:独立看门狗的喂狗时间为1.28s,而延时2秒后狗已饿死,认为系统异常,进入复位。

任务3:

1). 现象:MCU反复复位;
2). 原因:预分频系统改变之后,喂狗时间变为 (4/40K) * 800 = 0.08s << 延时 1s,狗饿死了;
3). 解决:减少延时为不超过 delay_ms(80)。

任务4:

将延时改为5s后,即

    delay_ms(1000);
    delay_ms(1000);
    delay_ms(1000);
    delay_ms(1000);
    delay_ms(1000);

发现每隔1.28s后MCU就复位了,这是因为开启了看门狗之后,在规定时间不喂狗,就会产生复位,程序根本不可能连续运行5s。在原始程序的设定下,喂狗时间就是1.28s。为解决此问题,可通过增大预分频系数和重装载系数解决,即在 iwdg.c 中修改

    IWDG_SetPrescaler(IWDG_Prescaler_256); //设置IWDG预分频系数 = 256/40K = 6.4ms
    IWDG_SetReload(1000); //设置IWDG重装载值,12位的(0~4095),取1000则喂狗时间 = 1000*6.4ms = 6.4s