目录
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。改过了,再次编译、链接、下载、复位后,现象与预期现
象相符。