courses:embedded_system:独立看门狗实验
独立看门狗实验
实验目的
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