初级会员
- 积分
- 86
- 金钱
- 86
- 注册时间
- 2017-3-4
- 在线时间
- 21 小时
|
1金钱
代码如下,望大神帮助
main函数
#include "stm32f10x.h"
#include "delay.h"
#include "LED.h"
#include "usart.h"
#include "WWDG.h"
//独立看门狗main
/*
int main(void)
{
delay_init();
LED_Init();
KEY_Init();
BEEP_Init();
delay_ms(200);
LED2=0;
IWDG_Init(4,625);//
while(1)
{
if(KEY_Scan(1)==KEY0_PRES)
{
IWDG_ReloadCounter();
}
}
}
*/
//窗口看门狗main
int main(void)
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2
uart_init(115200);
LED_Init();
LED2=0;
delay_ms(300);
WWDG_Init(0X7F,0X5F,WWDG_Prescaler_8);//计数器值为0x7f,窗口寄存器为0x5f,分频系数为8
while(1)
{
LED2=1;
delay_ms(300);
}
}
WWDG函数
#include "WWDG.h"
#include "LED.h"
//保存WWDG计数器的设置值,默认为最大
u8 WWDG_CNT=0x7f;
//初始化窗口看门狗
//tr T[6:0] 计数器值(初值)
//wr W[6:0] 窗口值
//fprer 分频系数(WDGTB) 仅最低两位有效
//Fwwdg=PCLK1/(4096*2^fprer)
void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);//WWDG时钟使能
WWDG_CNT=tr&WWDG_CNT;//初始化IWDG_CNT(低七位)
WWDG_SetPrescaler(fprer);//设置IWDG预分频值
WWDG_SetWindowValue(wr);//设置窗口值
WWDG_Enable(WWDG_CNT);//(启动并设置初始值)使能看门狗, 设置counter
WWDG_ClearFlag();//清除提前唤醒中断标志位
WWDG_NVIC_Init();//初始化窗口看门狗 NVIC
WWDG_EnableIT();//开启窗口看门狗中断(使能提前唤醒中断)
}
//重设置WWDG计数器的值
void WWDG_Set_Counter(u8 cnt)
{
WWDG_Enable(cnt);//使能看门狗, 设置counter
}
//窗口看门狗中断服务函数
void WWDG_NVIC_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn;//WWDG中断
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢先优先权_抢占2,子优先级3,组2
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//响应优先级_抢占2,子优先级3,组2
NVIC_Init(&NVIC_InitStructure);//NVIC初始化
}
void WWDG_IRHandler(void)
{
WWDG_SetCounter(WWDG_CNT);//喂狗。当禁掉此句,窗口看门狗将产生复位
WWDG_ClearFlag();//清除提前唤醒中断标志位
LED3=!LED3;//LED状态反转(来指示喂狗成功)
}
实验现象:LED2不停闪烁,而LED3没有反映……
|
|