网站建设及报价格方案,晋江论坛网友留言区,wordpress 最强主题,建定制营销型网站从下往上看:
1. 时钟设置 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);//使能独立看门狗时钟 WWDG_SetPrescaler(WWDG_Prescaler_8);//看门狗预分频器WWDG counter clock (PCLK1/4096)/8 2.设置窗口值
实际就是设置WWDG_CR的低七位值, 但是这个值要大于0x40(也就是… 从下往上看:
1. 时钟设置 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);//使能独立看门狗时钟 WWDG_SetPrescaler(WWDG_Prescaler_8);//看门狗预分频器WWDG counter clock (PCLK1/4096)/8 2.设置窗口值
实际就是设置WWDG_CR的低七位值, 但是这个值要大于0x40(也就是bit T6必须为1, 如果小于的话, 直接就复位, 因此窗口的上限值的取值范围: 0x40~ 0x7F)
看门狗使能的话, 则WWDG_CR的位WDGA置1 WWDG_SetWindowValue(wr); WWDG_Enable(WWDG_CNT); 3. 中断开启?
WWDG_EnableIT() 这个还利用了位膨胀, 来开启WWDG_CFR的bit9.
WWDG_ClearFlag();//清除提前唤醒中断标志位WWDG_EnableIT();//开启提前唤醒中断 WWDG_CFR: bit6:0 : 设置窗口值 bit7:8 : 设置分配 bit9 : 提前唤醒中断, 此位若置’1’则当计数器值达到40h即产生中断。此中断只能由硬件在复位后清除。
4.开启了中断,那么当然要设置中断优先级
NVIC_InitStructure.NVIC_IRQChannelWWDG_IRQn; //窗口看门狗中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority0x02; //抢占优先级为2NVIC_InitStructure.NVIC_IRQChannelSubPriority0x03; //子优先级为3NVIC_InitStructure.NVIC_IRQChannelCmdENABLE; //使能窗口看门狗NVIC_Init(NVIC_InitStructure);
5.运行原理
实际他就是一个倒计数定时器, 当我们设置的初始值减到0x3F的时候,会产生复位, 如果我们开启了复位前中断,那么会先运行中断, 然后复位.我们可以在复位中断保存一些数据,.
目前在实际项目还没用过, 没有对时序要求这么严格的项目.
正点原子例程代码
void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE); //使能窗口看门狗时钟WWDG_CNTtrWWDG_CNT; //初始化WWDG_CNT. WWDG_SetPrescaler(fprer); //设置分频值WWDG_SetWindowValue(wr); //设置窗口值WWDG_Enable(WWDG_CNT); //开启看门狗NVIC_InitStructure.NVIC_IRQChannelWWDG_IRQn; //窗口看门狗中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority0x02; //抢占优先级为2NVIC_InitStructure.NVIC_IRQChannelSubPriority0x03; //子优先级为3NVIC_InitStructure.NVIC_IRQChannelCmdENABLE; //使能窗口看门狗NVIC_Init(NVIC_InitStructure);WWDG_ClearFlag();//清除提前唤醒中断标志位WWDG_EnableIT();//开启提前唤醒中断
}//窗口看门狗中断服务程序
void WWDG_IRQHandler(void)
{WWDG_SetCounter(WWDG_CNT); //重设窗口看门狗值WWDG_ClearFlag();//清除提前唤醒中断标志位LED1!LED1;
}