当前位置: 首页 > news >正文

STM32:看门狗

独立看门狗

简介

独立看门狗(IWDG)由独立的低速时钟(LSI)驱动,即便主时钟发生故障,它依然能够正常工作。其主要作用是在程序出现异常时,通过复位来保障系统的稳定性。独立看门狗的喂狗操作相对简单,只需在规定时间内对相关寄存器进行写入操作即可。它适用于对可靠性要求较高,且主时钟可能出现故障的场景。

窗口看门狗

简介

窗口看门狗(WWDG)由系统时钟(PCLK1)分频后驱动,其工作依赖于系统时钟的正常运行。它相较于独立看门狗,具有更严格的时间监控机制。窗口看门狗设置了一个时间窗口,喂狗操作必须在这个时间窗口内完成,早于或晚于该窗口都会导致系统复位。这种特性使其能够更精准地监控程序的运行状态,适用于对程序运行时序要求较为严格的场景。

两个看门狗的区别

在这里插入图片描述

独立看门狗使用方法

在独立看门狗(IWDG)中,看门狗的超时时间
计算公式为
在这里插入图片描述
prer
是预分频器的值,
rlr
是重装载寄存器的值,40 是独立看门狗的时钟频率(单位:kHz)。

int init_iwdg(u8 prer,u16 rlr)
{IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);IWDG_SetPrescaler(prer);IWDG_SetReload(rlr);IWDG_ReloadCounter(); IWDG_Enable();
}
void IWDG_Feed(void)
{IWDG->KR=0xAAAA;
}
int main(void)
{IWDG_Init(41875);while(1){IWDG_Feed();delay_ms(2500);}
}

窗口看门狗使用方法

窗口值:当计数器的值大于窗口值时进行喂狗操作,系统会发生复位。
下限值(固定为 0x40):如果计数器的值递减到 0x40 还没有进行喂狗操作,那么计数器再减一次到 0x3F 时,系统就会复位。
自动喂狗应该在上窗口值和下限值之间
在递减计数器减到 0X40 的时候,进入中断,称它为死前中断或者 叫遗嘱中断,在中函数里面我们应该出来最重要的事情,而且必须得快,因为递减计数器再减 一次,就会产生系统复位。


static void WWDG_NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}void WWDG_Config(uint8_t tr, uint8_t wr, uint32_t prv)
{	// 开启 WWDG 时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);// 设置递减计数器的值WWDG_SetCounter( tr );// 设置预分频器的值WWDG_SetPrescaler( prv );// 设置上窗口值WWDG_SetWindowValue( wr );// 设置计数器的值,使能WWDGWWDG_Enable(WWDG_CNT);	// 清除提前唤醒中断标志位WWDG_ClearFlag();	// 配置WWDG中断优先级WWDG_NVIC_Config();	// 开WWDG 中断WWDG_EnableIT();
}// 喂狗
void WWDG_Feed(void)
{// 喂狗,刷新递减计数器的值,设置成最大WDG_CNT=0X7FWWDG_SetCounter( WWDG_CNT );
}void WWDG_IRQHandler(void)
{// 清除中断标志位WWDG_ClearFlag();//真正使用的时候,这里应该是做最重要的事情}int main(void)
{uint8_t wwdg_tr, wwdg_wr;//初始化窗口看门狗,设置计数器初始值为0X7F,上窗口值为0X5F,预分频器为WWDG_Prescaler_8WWDG_Config(0X7F, 0X5F, WWDG_Prescaler_8);wwdg_wr = WWDG->CFR & 0X7F//wwdg_wr获得上窗口的值while(1){wwdg_tr = WWDG->CR & 0X7F;  //获得计数器值if( wwdg_tr < wwdg_wr )//当计数器的值减小到小于上窗口值的时候{// 喂狗,重新设置计数器的值为最大0X7FWWDG_Feed();}}
}

在调用 WWDG_Config(0X7F, 0X5F, WWDG_Prescaler_8) 函数时,把计数器初始值设为 0X7F,意味着将计数器设置成了其所能表示的最大值。窗口看门狗开启后,计数器会从这个最大值开始逐次递减。当计数器的值大于上窗口值(这里是 0X5F)时进行喂狗操作,系统会复位;而当计数器递减到 0X40 还未喂狗,再减一次到 0X3F 时系统也会复位。因此,需要在计数器的值处于 0X5F 和 0X40 之间时进行喂狗操作,以此保证系统正常运行。

相关文章:

  • Leetcode刷题记录20——找到字符串中所有字母异位词
  • 烽火HG680-MC_晨星MSO9385芯片-2+8G_安卓9.0_不分地区通刷卡刷固件包
  • 第十二章-PHP文件上传
  • 虚拟数字人:从虚拟到现实的跨越与未来展望
  • 多商户 | 可二次开发【全开源】小程序源码商城挑选指南!
  • 在windows使用docker打包springboot项目镜像并上传到阿里云
  • 有关爬虫中数据库的封装——单线程爬虫
  • macos下mysql 5.7/8.0版本切换
  • FPGA基础之基础语法
  • 当元数据遇见 AI 运维:智能诊断企业数据资产健康度
  • HarmonyOS Next~鸿蒙系统UI创新实践:原生精致理念下的设计革命
  • Android Studio中创建第一个Flutter项目
  • 分享:google高级搜索常用的4个入口
  • Unreal Engine 实现智慧水库周边环境以及智慧社区模拟的实例
  • Python 操作 Excel 插入图表:解锁数据可视化的高效密码
  • 空间矩阵的思考
  • 绿色软件合集,一顶10
  • 项目代码生成工具
  • 【机器学习-线性回归-4】线性回归中的最优解:从数学原理到实践应用
  • [Lc_week] 447 | 155 | Q1 | hash | pair {}调用
  • 文化润疆|让新疆青少年成为“小小博物家”
  • “90后”樊鑫履新乌兰察布市察右中旗副旗长人选
  • 物业也能成为居家养老“服务员”,上海多区将开展“物业+养老”试点
  • 挤占学生伙食费、公务考察到景区旅游……青岛通报5起违规典型问题
  • 上海第三家“胖永辉”在浦东开业,设立了外贸产品专区
  • 中公教育薪酬透视:董监高合计涨薪122万,员工精简近三成