清采NOTE

理解他人 善待自己

用户工具

站点工具


courses:embedded_system:窗口看门狗实验

窗口看门狗实验

实验目的

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

实验内容

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

实验说明

main.c
/*******************************************************************************
*
--------------------------------------------------------------------------------
* 实 验 名      : 窗口看门狗实验
* 实验说明      : 通过配置好内部窗口看门狗,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);
    }		
}

wwdg.c
#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步:修改主函数为:

任务3_main.c
#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). 串口终端同步显示。