1. 了解STM32的内部窗口看门狗; 2. 学会配置窗口看门狗。
利用窗口看门狗的中断功能来喂狗,通过 printf 打印输出。
/******************************************************************************* * -------------------------------------------------------------------------------- * 实 验 名 : 窗口看门狗实验 * 实验说明 : 通过配置好内部窗口看门狗,printf打印初始显示数据后进入窗口看门狗中断 , 进行喂狗,间隔一段时间后返回主函数打印输出“STM32 主循环!”,中断 不停喂狗,在串口助手上显示其输出 ,按下复位开关重新运行 见文件内截图 ,程序设计中所有中断函数都放在中断stm32f10x_it.c文件 * 连接方式 : * 注 意 : 所用函数在头文件.c文件内 *******************************************************************************/ #include "public.h" #include "printf.h" #include "systick.h" #include "wwdg.h" /**************************************************************************** * Function Name : main * Description : Main program. * Input : None * Output : None * Return : None ****************************************************************************/ int main() { printf_init(); //printf初始化 wwdg_init(); //窗口看门狗初始化配置 printf("STM32 欢迎您!\r\n"); while(1) { printf("STM32 主循环!\r\n"); delay_ms(1000); } }
#include "wwdg.h" /******************************************************************************* * 函 数 名 : wwdg_init * 函数功能 : 窗口看门狗模式配置初始化 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void wwdg_init() { NVIC_InitTypeDef NVIC_InitStructure;//中断结构体定义 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);// WWDG时钟使能 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//看门狗的优先级要高于其他 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); WWDG_SetPrescaler(WWDG_Prescaler_8);//设置WWDG预分频数值 WWDG_SetWindowValue(0x5F);//窗口上边界数值 WWDG_Enable(0x7F);//使能窗口看门狗 WWDG_ClearFlag(); //清除提前唤醒中断标志 WWDG_EnableIT();//开启窗口看门狗中断 }
注意: 看门狗中断程序在 stm32f10x_it.c 中
void WWDG_IRQHandler(void) //窗口看门狗中断程序 { WWDG_SetCounter(0x7F); //喂狗 WWDG_ClearFlag(); printf("喂狗\r\n"); }
1. 使用 1 根 2P 杜邦线连接核心板 PA2连接“两路串行通信”单元的TXD1,PA3与 RXD1连接。(printf 输出定义在USART2上面) 2. “两路串行通信”单元中的卧式开关打在“串行”上,串口线DB1同电脑连接。 3. 在KEIL软件中调试运行“窗口看门狗”工程文件。 4. 实验现象:打开PC端串口调试助手 选择连接串口,设置波特率为9600,字符串显示。
1. 按上述步骤调试出结果; 2. 自行配置看门狗刷新窗口,观察现象;延长喂狗时间,同时保证程序正常运行时不触发复位; 3. 设置异常不喂狗,观察复位现象; 4. 加入第1个LED灯作为观察信号,要求: 第一次启动程序时LDE-1灯亮,当正常喂狗时,LED-1灯灭; 第一次启动程序时LDE-1灯亮,设置异常,无法正常喂狗时,LED-1灯闪烁。
任务2:
1). 刷新窗口(喂狗窗口)下界固定为 0x40(0x40-1=0x3f时复位),上界通过修改配置寄存器 WWDG_SetWindowValue(0x??) 实现; 这里需满足 0x?conf>0x40,否则恒复位; 2). 修改控制寄存器计数值,即看门狗计数器:WWDG_Enable(0x?ctr); 当设置 0x?ctr>0x?conf 时,存在一段不允许刷新时间(狗不饿),当单门狗计数器值到达 0x?conf 时,进入喂狗窗口,可以喂狗; 当设置 0x?ctr<0x?conf 时,狗一直处于饥饿状态,即刚喂完又饿了,属于连续监测浪费资源。
任务3:
在看门狗中断喂狗函数 stm32f10x_it.c 中加入死循环:
void WWDG_IRQHandler(void) { while(1){} //设置异常 WWDG_SetCounter(0x7F);//喂狗 WWDG_ClearFlag(); printf("喂狗\r\n"); }
任务4:
第1步:配置
1). 将前面学过的LED灯功能文件 **led.c** 加入 APP 中; 2). 用1根8p杜邦线连接 PC0~PC7 与 “单色流水灯”单元 JP15 的 I1~I8。
第2步:修改主函数为:
#include "led.h" // 加入头文件 int main() { printf_init(); //printf初始化 wwdg_init(); //窗口看门狗初始化配置 printf("STM32 欢迎您!\r\n"); LED_Init(); //LED灯初始化 GPIO_ResetBits(GPIOC,LED); //IO口输出低电平,灯亮 while(1) { printf("STM32 主循环!\r\n"); delay_ms(1000); GPIO_SetBits(GPIOC,LED); //IO口输出高电平,灯灭 } }
第3步:修改 led.h 中的管脚定义,选中第1个 LED 灯
#define LED GPIO_Pin_0
第4步:观察
1). 程序在第1次启动时,第1个LED灯亮1后熄灭;如任务3设置异常后,第1个LED灯将闪烁,表示喂狗失败,不断复位; 2). 串口终端同步显示。