生物科技网站模板,wordpress评论积分,网站整体设计,一个视频多平台发布目录
背景
独立看门狗#xff08;IWDG#xff09;
寄存器访问保护
窗口看门狗#xff08;WWDG#xff09;
程序
独立看门狗
设置独立看门狗程序
第一步、使能对独立看门狗寄存器的写操作
第二步、设置预分频和重装载值
第三步、喂狗 第四步、使能独立看门狗
喂狗…目录
背景
独立看门狗IWDG
寄存器访问保护
窗口看门狗WWDG
程序
独立看门狗
设置独立看门狗程序
第一步、使能对独立看门狗寄存器的写操作
第二步、设置预分频和重装载值
第三步、喂狗 第四步、使能独立看门狗
喂狗程序编辑编辑 应用实例
窗口看门狗
设置窗口看门狗程序
第一步、使能PCLK1的外设时钟
第二步、设置预分频和窗口值
第三步、使能WWDG
第四步、中断配置清除中断标识、配置中断优先级、开启中断
第五步、中断优先级配置
第六步、中断处理函数
第七步、窗口看门狗喂狗
应用实例 背景
看门狗在单片机系统中非常重要主要用于防止系统死锁、处理软件故障、应对外部干扰和提高系统可靠性。由于单片机系统容易受到外界干扰导致程序跑飞或陷入死循环看门狗机制能够在程序异常时及时重启系统避免系统崩溃或数据丢失等严重后果通过本篇文章介绍STM32的看门狗种类以及如何使用这两种看门狗。
STM32看门狗主要有两种类型独立看门狗IWDG和窗口看门狗WWDG。 独立看门狗IWDG 独立看门狗IWDG是STM32系列中常见的看门狗类型之一。它使用一个独立的40kHz低速时钟LSI这个时钟源是独立于主系统时钟的所以不需要像USART等外设一样使用前使能外设时钟因此即使在主时钟发生故障时IWDG仍能正常工作。IWDG通过一个12位的递减计数器工作当计数器的值减到0时系统会产生复位信号重启MCU。用户需要在预定的时间内“喂狗”即向看门狗寄存器写入一个特定的值以重置计数器防止系统复位 寄存器访问保护 IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值必须先向 IWDG_KR 寄存器中写入 0x5555 。以不同的值写入这个寄存器将会打乱操作顺序寄存器将重 新被保护。重装载操作 ( 即写入 0xAAAA) 也会启动写保护功能。 状态寄存器指示预分频值和递减计数器是否正在被更新。 窗口看门狗WWDG 窗口看门狗WWDG通过APB1时钟分频后得到的时钟驱动。它与IWDG不同WWDG有一个可配置的时间窗口用于检测应用程序的运行状态。如果应用程序在这个时间窗口内正常运行则不会产生复位信号如果应用程序超出这个时间窗口则会触发复位信号重启系统 WWDG 简介 窗口看门狗通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运 行序列而产生的软件故障。除非递减计数器的值在 T6 位变成 0 前被刷新看门狗电路在达到预置 的时间周期时会产生一个 MCU 复位。在递减计数器达到窗口寄存器数值之前如果 7位的递减 计数器数值(在控制寄存器中) 被刷新 那么也将产生一个 MCU 复位。这表明递减计数器需要在 一个有限的时间窗口中被刷新。 WWDG 主要特性 ● 可编程的自由运行递减计数器 ● 条件复位 ─ 当递减计数器的值小于0x40(若看门狗被启动)则产生复位 。 ─ 当递减计数器在窗口外被重新装载(若看门狗被启动)则产生复位 。见 0 。 ● 如果启动了看门狗并且允许中断当递减计数器等于0x40时产生早期唤醒中断(EWI)它可 以被用于重装载计数器以避免WWDG复位。 WWDG 功能描述 如 果看门狗被启动(WWDG_CR寄存器中的WDGA位被置’1’) 并且当7位(T[6:0])递减计数器从 0x40翻转到0x3F(T6位清零)时则产生一个复位 。 如果软件在计数器值大于窗口寄存器中的数 值时重新装载计数器将产生一个复位。 程序
独立看门狗
设置独立看门狗程序 //看门狗定时时间计算公式:Tout(预分频值*重装载值)/40 (单位ms)
//当前pre为64rlr为625计算得到Tout时间为1秒大概值。#define pre IWDG_Prescaler_64 //分频值范围4,8,16,32,64,128,256
#define rlr 625 //重装载值范围00xFFF4095void IWDG_Init(void){ //初始化独立看门狗IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作IWDG_SetPrescaler(pre); //设置IWDG预分频值IWDG_SetReload(rlr); //设置IWDG重装载值IWDG_ReloadCounter(); //按照IWDG重装载寄存器的值重装载IWDG计数器IWDG_Enable(); //使能IWDG
}
独立看门狗时间
Tout(预分频值*重装载值)/40 (单位ms)推导过程独立看门狗独立于stm32主时钟系统SYSCLK
是使用40Khz的LSI经过预分频后的频率位 40/预分频值
所以看门狗定时器的看门狗的时间为40/(预分频值*重装载值)的倒数//当前pre为64rlr为625计算得到Tout时间为1秒大概值第一步、使能对独立看门狗寄存器的写操作 看函数的定义为 第二步、设置预分频和重装载值 第三步、喂狗 第四步、使能独立看门狗 喂狗程序 void IWDG_Feed(void){ //喂狗程序IWDG_ReloadCounter();//固件库的喂狗函数
}应用实例 窗口看门狗 设置窗口看门狗程序 void WWDG_Init(void){ //初始化窗口看门狗RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 时钟使能WWDG_SetPrescaler(fprer); //设置 WWDG 预分频值WWDG_SetWindowValue(wr); //设置窗口值WWDG_Enable(WWDG_CNT); //使能看门狗,设置 counterWWDG_ClearFlag(); //清除提前唤醒中断标志位WWDG_NVIC_Init(); //初始化窗口看门狗 NVICWWDG_EnableIT(); //开启窗口看门狗中断
}void WWDG_NVIC_Init(void){ //窗口看门狗中断服务程序被WWDG_Init调用NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel WWDG_IRQn; //WWDG 中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 2; //抢占 2 子优先级 3 组 2NVIC_InitStructure.NVIC_IRQChannelSubPriority 3; //抢占 2,子优先级 3,组 2NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;NVIC_Init(NVIC_InitStructure); //NVIC 初始化
}void WWDG_Feed(void){ //窗口喂狗程序WWDG_SetCounter(WWDG_CNT); //固件库的喂狗函数
}void WWDG_IRQHandler(void){ //窗口看门狗中断处理程序WWDG_ClearFlag(); //清除提前唤醒中断标志位//此处加入在复位前需要处理的工作或保存数据
} 第一步、使能PCLK1的外设时钟 第二步、设置预分频和窗口值 //窗口看门狗定时时间计算公式:
//上窗口超时时间单位us 4096*预分频值*(计数器初始值-窗口值)/APB1时钟频率单位MHz
//下窗口超时时间单位us 4096*预分频值*(计数器初始值-0x40)/APB1时钟频率单位MHz#define WWDG_CNT 0x7F //计数器初始值范围0x400x7F
#define wr 0x50 //窗口值范围0x400x7F
#define fprer WWDG_Prescaler_8 //预分频值取值1,2,4,8个人认为在计算超时时间时候
计数器初始值-窗口上界值 1
计数器初始值-窗口下界值 1第三步、使能WWDG 第四步、中断配置清除中断标识、配置中断优先级、开启中断 第五步、中断优先级配置 void WWDG_NVIC_Init(void){ //窗口看门狗中断服务程序被WWDG_Init调用NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel WWDG_IRQn; //WWDG 中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 2; //抢占 2 子优先级 3 组 2NVIC_InitStructure.NVIC_IRQChannelSubPriority 3; //抢占 2,子优先级 3,组 2NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;NVIC_Init(NVIC_InitStructure); //NVIC 初始化
} 第六步、中断处理函数 void WWDG_IRQHandler(void){ //窗口看门狗中断处理程序WWDG_ClearFlag(); //清除提前唤醒中断标志位//此处加入在复位前需要处理的工作或保存数据
} 第七步、窗口看门狗喂狗 void WWDG_Feed(void){ //窗口喂狗程序WWDG_SetCounter(WWDG_CNT); //固件库的喂狗函数
}应用实例