一、独立看门狗IWDG概述
1.)看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断或产生系统复位。
2.)功能图:(由于本人无法贴图,请见参考手册,125页)
3.)独立看门狗(IWDG)由专用的40kHz 的低速时钟为驱动;因此,即使主时钟发生故障它也仍然有效。
4.)其中IWDG_PR为预分频器寄存器,IWDG_RLR为重新加载计数器寄存器,IWDG_KR为控制器存器。IWDG_SR为状态寄存器。(见图)
5.)IWDG_KR写入OXCCCC,启动独立看门狗功能,计数器值开始递减,减到0时,看门狗复位。IWDG_KR写入0XAAAA,计数器值被重新加载,即避免看门狗复位。IWDG_KR写入0X5555,则允许写IWDG_PR 和IWDG_RLR寄存器写操作。写入其它值,IWDG_PR 和IWDG_RLR被保护,数据将无法写入这两个寄存器。IWDG_SR状态寄存器指示预分频值和递减计数器是否正在被更新。IWDG_RLR寄存器范围为0-0xfff.
6.)如果用户在选择字节中启用了“硬件看门狗“功能,在系统上电复位后,看门狗会自动开始运行;如果在计数器计数结束前,若软件没有向键寄存器写入相应的值,则系统会产生复位。
7。)看门狗复位时,系统复位,程序重新开始运行。
二、实验功能
为了实现IWDG复位功能,本人做了一个实验:
采用优易特电子的EDU开发板,功能如下:
系统上电,蜂鸣器延时叫一声,之后关闭。IWDG 40K的内部低速时钟进行8分频产生5KHZ的看门狗计数时钟,RLR设为2500,即看门狗复位时间设为500MS。LD1灯亮,表示看门狗初始化完毕。开启看门狗功能。定时器3定为200MS定时器,在每次定时器中断中,将看门狗计数器重新加载,当加载到25(5S)次以后,不再加载看门狗。这样,看门狗会在后面的时间发生复位,从而系统重新运行。检查蜂鸣器是否每约5S叫一声,如果这样表示IWDG发生了复位。功能检验完成。
经实验证明,以上功能均正确。
三、程序如下
main()
{
u32 temp;
RCC_init();
Gpio_int();
GPIO_ResetBits(GPIOC,GPIO_Pin_6);//蜂鸣器叫一声关闭
for(temp=0;temp<200000;temp++);
GPIO_SetBits(GPIOC,GPIO_Pin_6);
IWDG_init();
GPIO_SetBits(GPIOF,GPIO_Pin_6);//LD1灯亮
Timer_init();
NVIC_init();
while(1);
}
……………………………………………………………………….
void IWDG_init(void)
{
/* Enable write access to IWDG_PR and IWDG_RLR registers */
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
/* IWDG counter clock: 40KHz(LSI) / 8 = 5 KHz */
IWDG_SetPrescaler(IWDG_Prescaler_8);
/* Set counter reload value to 2499,500ms */
IWDG_SetReload(2499);
/* Reload IWDG counter */
IWDG_ReloadCounter();
/* Enable IWDG (the LSI oscillator will be enabled by hardware) */
IWDG_Enable();
}
void NVIC_init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void Timer_init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// ---------------------------------------------------------------
// TIM3 Configuration: 定时器3配置
// TIM3CLK = 36 MHz, Prescaler =36000, TIM3 counter clock = 1KHz
// SET TTIM3 TIME 200mS
//---------------------------------------------------------------
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
// Time base configuration
TIM_TimeBaseStructure.TIM_Period = 200;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
//Enables peripheral Preload register on ARR
TIM_ARRPreloadConfig(TIM3,ENABLE);
// Prescaler configuration
TIM_PrescalerConfig(TIM3, 35999, TIM_PSCReloadMode_Immediate);
TIM_InternalClockConfig(TIM3);
//Enables TIM interrupts
TIM_ITConfig(TIM3,TIM_FLAG_Update,ENABLE);
//TIM3 enable counter
TIM_Cmd(TIM3, ENABLE);
}
………………………………………………………………………
void TIM3_IRQHandler(void)
{
static u8 count=0;
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
//TIM3溢出中断需执行的代码在此添加
count++;
if(count<=25)
{
/* Enable write access to IWDG_PR and IWDG_RLR registers */
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
/* Reload IWDG counter */
IWDG_ReloadCounter();
}
}
}
四、结语
独立看门狗时钟由内部40KHZ提供,所以不受主时钟的影响,即一旦启动看门狗,即便在调试过程中,暂停程序运行,看门狗也将不会停止,在复位时间到后仍会将系统复位。