bsp_wwdg.c
3.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "bsp.h"
#include "stm32f4xx_wwdg.h"
/*
*********************************************************************************************************
*
* 模块名称 : 窗口看门狗程序
* 文件名称 : bsp_wwdg.c
* 版 本 : V1.0
* 说 明 : WWDG例程。
* 修改记录 :
* 版本号 日期 作者 说明
* V1.0 2013-12-04 armfly 正式发布
*
* Copyright (C), 2013-2014, 安富莱电子 www.armfly.com
*********************************************************************************************************
*/
#include "bsp.h"
/*
*********************************************************************************************************
* 函 数 名: bsp_InitWwdg
* 功能说明: 窗口看门狗配置
* 形 参:
* _ucTreg : T[6:0],计数器值 范围0x40 到 0x7F
* _ucWreg : W[6:0],窗口值 必须小于 0x80
* WWDG_Prescaler : 窗口看门狗分频 PCLK1 = 42MHz
* WWDG_Prescaler_1: WWDG counter clock = (PCLK1/4096)/1
* WWDG_Prescaler_2: WWDG counter clock = (PCLK1/4096)/2
* WWDG_Prescaler_4: WWDG counter clock = (PCLK1/4096)/4
* WWDG_Prescaler_8: WWDG counter clock = (PCLK1/4096)/8
* 返 回 值: 无
*********************************************************************************************************
*/
u8 WWDG_CNT=0X7F;
void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE); //使能窗口看门狗时钟
WWDG_CNT=tr&WWDG_CNT; //初始化WWDG_CNT.
WWDG_SetPrescaler(fprer); //设置分频值
WWDG_SetWindowValue(wr); //设置窗口值
// WWDG_SetCounter(WWDG_CNT);//设置计数值
WWDG_Enable(WWDG_CNT); //开启看门狗
NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn; //窗口看门狗中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级为2
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //子优先级为3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能窗口看门狗
NVIC_Init(&NVIC_InitStructure);
WWDG_ClearFlag();//清除提前唤醒中断标志位
WWDG_EnableIT();//开启提前唤醒中断
}
//窗口看门狗中断服务程序
//void WWDG_IRQHandler(void)
//{
// static u8 Count = 0;
// WWDG_SetCounter(0x7f); //重设窗口看门狗值
// WWDG_ClearFlag(); //清除提前唤醒中断标志位
//
// Count += 1;
// if(Count > 1)return;
//
// USART_ITConfig(USART6, USART_IT_RXNE, DISABLE);
// USART_ITConfig(USART6, USART_IT_TXE, DISABLE);
// USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
// USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
// USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
// USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
// USART_ITConfig(USART3, USART_IT_RXNE, DISABLE);
// USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
//
// NVIC_SystemReset();
//}
void FeedDog(void)
{
if((WWDG->CR&0X7F)<(WWDG->CFR&0X7F)) // 计数器值tr必须小于窗口值wr时才能喂狗,在之前喂狗则太早,会产生看门狗复位
{
WWDG_SetCounter(0X7F);
}
}
void bsp_InitWWDG(void)
{
WWDG_Init(0x7F,0X7E,WWDG_Prescaler_8); //计数器值为7f,窗口寄存器为5f,分频数为8
}