main.c 使用基本定时器6喂狗
int main(void)
{
/*看门狗*/
IWDG_Init(3,5000);//看门狗 5S 实际1S
/*84M/8400=10k=0.1ms 10*0.1ms=1ms */
TIM6_Config(10-1,8400-1); //TIM6 定时喂狗 中断优先级 主0子0
while(1)
{}
}
timer.c
//TIM6 喂狗
//基本定时器6中断初始化
//这里时钟选择为APB1的2倍,而APB1为42M, 即TIM6时钟为84M
//arr:自动重装值。例1000-1,计数器从0数到1000,即T=1000*1us=1ms
//psc:时钟预分频数。例84-1,若时钟为84M,则分频后为84M/84=1MHz 即1us
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
void TIM6_Config(u16 arr,u16 psc) //1ms
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE); ///使能TIM6时钟
TIM_TimeBaseInitStructure.TIM_Period = arr; //自动重装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); //允许定时器6更新中断
TIM_Cmd(TIM6,ENABLE); //使能定时器6
NVIC_InitStructure.NVIC_IRQChannel=TIM6_DAC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00; //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x00; //子优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//喂狗 1ms
void TIM6_DAC_IRQHandler(void) //中断
{
if(TIM_GetITStatus(TIM6,TIM_IT_Update)==SET)
{
IWDG_Feed(); //喂狗
}
TIM_ClearITPendingBit(TIM6,TIM_IT_Update);
}
|