目录
一、实验目的
1.配置独立看门狗(IWDG),通过按键进行喂狗并使用LED进行观察现象;
2.配置窗口看门狗(WWDG),并且编写看门狗检测清除程序,使用一个LED灯进行结果显示。
二、实验原理
1.(1) IWDG有独立的时钟,不需要使用库函数开启;
(2)向IWDG-KR写入0x5555,之后才能设置分频系数;
(3)向IWDG-KR写入0XAAAA喂狗;
(4) IWDG定时器溢出会导致系统复位。
2. (1)WWDG时钟在APBI总线需要单独开启;
(2)WWDG需要设置窗口值和重载值;
(3)过早或过晚地喂狗,都会产生一个中断或复位;
(4)可以在WWDG中断服务函数中喂狗。
三、实验仪器
电脑、开发板、UV5软件、共享文件Tempalte。
四、实验内容
1.用UV5软件打开共享文件Template。
2 (1)IWDG
添加librares \src文件夹下的stm32f10x_ rcc、stm32f10x_ iwdg.c、stm32f10x_gpio.c到工程
librares文件夹下,并在stm32f10x_conf.h中去掉相应的注释。
(2)WWDG
添加librares \src文件夹下的stm32f10x_ rcc、stm32f10x_gpio.c、stm32f10x_wwdg.c、misc.c到工
程中的libraries文件夹中,并在stm32f10x_conf.h中去掉相应的注释。
3.编写程序
(1)IWDG主程序(main.c)如下:
#include "stm32f10x.h"
void GPIO_Config(void);
void delay(void);
void IWDG_Config(void);
int main(void)
{
GPIO_Config();
GPIO_SetBits(GPIOC,GPIO_Pin_9);
delay();
GPIO_ResetBits(GPIOC,GPIO_Pin_9);
IWDG_Config();
while(1)
{
if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_3)==0)
IWDG_ReloadCounter();
}
}
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
void IWDG_Config(void)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(IWDG_Prescaler_32);
IWDG_SetReload(625);
IWDG_Enable();
}
void delay(void)
{
uint32_t i;
for(i=0;i<6000000;i++)
{}
}
(2)WWDG
主程序(main.c)如下:
#include "stm32f10x.h"
void GPIO_Config(void);
void delay(void);
int main(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_Config();
GPIO_ResetBits(GPIOC,GPIO_Pin_8);
delay();
GPIO_SetBits(GPIOC,GPIO_Pin_8);
delay();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
WWDG_SetPrescaler(WWDG_Prescaler_8);
WWDG_EnableIT();
WWDG_SetWindowValue(0X50);
WWDG_Enable(0X70);
NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0X70;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0X70;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
while(1)
{}
}
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void delay(void)
{
uint32_t i;
for(i=0;i<6000000;i++)
{}
}
中断程序(stm32f10x_it.c)如下:
void WWDG_IRQHandler(void)
{
uint8_t cr;
cr=WWDG->CR;
cr&=0x7f;
if(cr<0x50)
{
WWDG_SetCounter(0x70);
WWDG_ClearFlag();
led=~led;
if(led==0)
GPIO_ResetBits(GPIOC,GPIO_Pin_8);
else
GPIO_SetBits(GPIOC,GPIO_Pin_8);
}
}
4.编译——>配置ST-Link——>下载——>复位——>观察。
五.实验结果及改进
1.IWDG
按下复位键后,若不按按键,则不会启动喂狗的代码,PC8不停闪烁,说明系统一直在复位;如果
按下按键,则会喂一次狗,暂停复位一次;如果按键按下不松开,则PC8常亮,说明系统在按下按
键期间没有复位。
(2)WWDG
按下复位键后,观察到PC8管脚置0再置1后,开始快速反转,说明在不断喂狗,系统一直在运
行。
窗口判断
程序和WWDG主程序相同,中断程序(将中断函数中的窗口判断语句注释掉)如下:
void WWDG_IRQHandler(void)
{
uint8_t cr;
cr=WWDG->CR;
cr&=0x7f;
//if(cr<0x50)
//{
WWDG_SetCounter(0x70);
WWDG_ClearFlag();
led=~led;
if(led==0)
GPIO_ResetBits(GPIOC,GPIO_Pin_8);
else
GPIO_SetBits(GPIOC,GPIO_Pin_8);
//}
}
按下复位键后,可观察到PC8管脚的状态慢速地不停翻转,说明喂狗指令过早或过晚,导致系统不
断复位。
六.实验结论
在进行WWDG窗口看门狗时,编译链接后编译器显示0Enos(S).0 Warning但按下复位键后,开发
板上的现象是PC8每间隔1S闪烁一次,与该有的实验现象不符,这可是一个难题,因为不是语法
上的错误,所以不好找。在经过多次的与老师的程序比对后,发现是在中断程序中出了问题,将
extern uint32_t led 写成了 uint8_t led。改过了,再次编译、链接、下载、复位后,现象与预期现
象相符。