HC32F460开发之看门狗功能
文章目录
- 前言
- 一、看门狗是什么?
- 二、看门狗的使用
- 1.简介
- 2.启动
- 3.刷新看门狗计数器
- 总结
前言
在一些设备需要长时间稳定运行的场合中,看门狗功能可以说是必不可少的。但在一些低功耗设备中,硬件看门狗的启用又会增大设备的功耗。在实际的项目开发中,是否需要启用看门狗需要根据实际需求而定。大部分的MCU都带有看门狗计数器,HC32F460内置就有两个看门狗计数器,分别为专用的看门狗计数器(SWDT)和通用的看门狗计数器(WDT)。今天,我们主要就HC32F460来讲解下看门狗功能的使用。
一、看门狗是什么?
看门狗,又叫watchdog timer,是一个硬件计时电路,一般用来监测由软件故障导致的系统故障。在看门狗启动后,硬件计数器会开始计时,当计数溢出时,则会产生看门狗复位,使得MCU复位。在看门狗计数期间(产生看门狗复位信号之前),我们需要定时去刷新计数器(也就是我们常说的喂狗)。若是程序出现未知的逻辑错误导致程序跑飞或进入死循环,在设定的时间内没有及时喂狗,则会发生看门狗超时复位。因此,看门狗功能可以针对程序因一些潜在错误或外界恶劣环境等干扰导致的系统死机,在无人工干预情况下自动恢复系统工作状态。
二、看门狗的使用
在了解了看门狗的概念和功能后,下面还是一样,我们需要回到HC32F460的芯片用户手册,结合官方的DEMO来了解HC32F460看门狗功能的使用。
1.简介
首先是关于看门狗的简介,HC32F460有两个看门狗计数器,一种是计数时钟源为专用内部 RC(SWDTLRC:10KHz)的专用看门狗计数器(SWDT),另一种是计数时钟源为 PCLK3 的通用看门狗计数器(WDT)。这两种计数器的主要区别如下:
下面主要介绍SWDT的使用方法。
2.启动
从上面的表格中我们可以得知,看门狗的启动方式有两种,一种是硬件启动,一种是软件启动。SWDT专用看门狗计数器只支持硬件启动方式。硬件启动方式是指启动时从主闪存区域读取看门狗计数器的设定信息(ICG0 寄存器),计数器自动开始计数。
工程配置步骤如下:
在库函数配置文件ddl_config.h中打开宏定义
#define DDL_ICG_ENABLE (DDL_ON)
#define DDL_SWDT_ENABLE (DDL_ON)
工程中添加相关文件后,hc32f460_icg.h打开宏定义
#define ICG0_SWDT_HARDWARE_START (ICG_FUNCTION_ON)
WDT_CR寄存器主要用于配置看门狗时钟分频系数,计数周期,刷新区域等,配置如下
/*!< SWDT register config */
#define ICG0_SWDT_AUTS (SWDT_AUTO_START_AFTER_RESET)
#define ICG0_SWDT_ITS (SWDT_RESET_REQUEST)
#define ICG0_SWDT_PERI (SWDT_COUNT_UNDERFLOW_CYCLE_256)
#define ICG0_SWDT_CKS (SWDT_COUNT_SWDTCLK_DIV256)
#define ICG0_SWDT_WDPT (SWDT_0To100PCT)
#define ICG0_SWDT_SLTPOFF (SWDT_SPECIAL_MODE_COUNT_STOP)
WDT_CR寄存器说明
这样配置完成后,SWDT看门狗就可以正常启动了。
3.刷新看门狗计数器
看门狗启动后,我们需要在工程中新增一个任务,定时去刷新看门狗计数器。
刷新动作如图所示
库函数中也有相关的函数封装实现
/*********************************************************************************** \brief SWDT refresh counter**** \param [in] None**** \retval Ok Process successfully done********************************************************************************/
en_result_t SWDT_RefreshCounter(void)
{en_result_t enRet = Ok;M4_SWDT->RR = SWDT_REFRESH_START_KEY;M4_SWDT->RR = SWDT_REFRESH_END_KEY_;return enRet;
}
在工程中创建一个看门狗任务,用于定时进行看门狗计数器的刷新操作
/* 看门狗任务 */rt_thread_init(&swdt_thread,"swdt task",swdt_task,RT_NULL,&swdt_stack,sizeof(swdt_stack),swdt_priority,1000);rt_thread_startup(&swdt_thread);
/*** @brief 看门狗任务* * @details 看门狗计数周期为1/(10KHz/256(div))*256=6.5536(s)* * @param para */
static void swdt_task(void * para)
{PRO_LOG(LOG_DEBUG, "Entry %s. \r\n", __func__);while(1){/* 重置计数器 */SWDT_RefreshCounter();rt_thread_delay(5000);}
}
SWDT专用看门狗复位将 RMU_RSTF0.SWDRF 置位,我们可以根据这个标志位来判断是否看门狗复位信号产生。
RMU_GetResetCause(&stcRmuRstCause);
if (Set == stcRmuRstCause.enSwdt)
{printf("RESET_SWDT_TRIGGER. \r\n");
}
else
{printf("RESET_OTHER_TRIGGER\r\n");
}
RMU_ClrResetFlag();
总结
关于看门狗的使用,官方用户手册和例程介绍也较为详细(例程:icg\icg_swdt_reset_hw_startup),这里就不再提供源码。以上就是今天要讲的内容,若是有什么地方理解错误,也欢迎大家留言指出。
HC32F460开发之看门狗功能相关推荐
- (29)基于FPGA实现看门狗功能(FPGA不积跬步101)
1 引言 微处理(ARM.单片机)在特殊的环境下,运行代码或程序会跑到非预期状态,也就是说系统可能会进入死循环,这种情况微处理器无法进行自我恢复,只能通过复位或者重启进行解决.看门狗就是解决这种情况 ...
- Python 看门狗功能实现
前言: 用 python 实时实现监控一个文件夹功能,将监控到的 Excel(笔者目前用于解析excel文件)解析写到 mysql 中,起功能和 sparkStreaming 中的 textFileS ...
- 【芯片应用】具有看门狗功能的超低功耗系统计时器TPL5010
目录 一.简介 二.同系列对比 三.引脚 四.应用推荐 五.编程 六.PCB设计 七.封装分享 一.简介 具有看门狗功能的纳瓦级功耗系统计时器-TPL5010 TPL5010是一款超低功耗的计时器,其 ...
- STM32F4 HAL库开发 -- 独立看门狗(IWDG)
之前讲过看门狗,参看:STM32开发 – 看门狗详解 一.HAL库配置独立看门狗步骤 1.取消寄存器写保护,设置看门狗预分频系数和重装载值. 首先我们必须取消 IWDG_PR和 IWDG_RLR寄存器 ...
- STM8单片机ADC模拟看门狗功能实现
看门狗的功能大家都知道,而这个模拟看门狗又是什么东西呢? 简单的说就是这个模拟看门狗可以实时监控ADC采样的数据,当采样的数据值小于设置的最小值或者大于设置的最大值时,单片机就会触发ADC中断 ...
- 手把手教你开发stm32——看门狗(基于hal库)
目录: 1.独立看门狗介绍 1.1.独立看门狗简介 1.2.独立看门狗功能描述 1.3.独立看门狗工作框图 2.独立看门狗实验 2.1.cubemx配置 2.2.具体代码实现 3.独立看门狗的相关寄存 ...
- STM32F103看门狗功能实现
STM32F10xxx内置两个看门狗,提供了更高的安全性.时间的精确性和使用的灵活性.两个看 门狗设备( 独立看门狗 和 窗口看门狗 )可用来检测和解决由软件错误引起的故障:当计数器达到给 定的超 ...
- 物联网-移远M26模块OpenCPU开发第3讲(看门狗)
之前在物联网-移远M26模块OpenCPU开发第1讲中提到过需要给外部看门狗芯片喂狗才能正常工作,阅读过的读者应该知道,我是通过周期性的控制M26的一个GPIO引脚电平变化来实现喂狗的.关于其硬件参考 ...
- 《嵌入式 – GD32开发实战指南》第17章 看门狗
开发环境: MDK:Keil 5.30 开发板:GD32F207I-EVAL MCU:GD32F207IK GD32 有两个看门狗,一个是独立看门狗,另外一个是窗口看门狗,独立看门狗号称宠物狗,窗口看 ...
最新文章
- Windows 8 Metro App学习笔记(九)—磁砖
- 差分约束 【bzoj2330】[SCOI2011]糖果
- 浅析三种特殊进程:孤儿进程,僵尸进程和守护进程
- [TJOI2011] 书架(线段数优化dp + 单调栈)
- Java:ChronicleMap第3部分,快速微服务
- oracle Sql语句分类
- Linux进程核心代码怎么查看,GCOV查看arm-linux代码覆盖率
- Undefined symbols for architecture armv7错误解决方法
- 并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)
- ContextCapture(Smart3D)资源汇总
- APP 接口拦截与参数破解
- android五线谱播放器,口袋五线谱app下载
- php国际象棋棋盘,php趣味编程 - php输出国际象棋棋盘 - 小徐
- iphone相册储存空间已满_iPhone 总提示“iCloud储存空间将满”,如何解决?
- 阅读笔记:Poison Over Troubled Forwarders: A Cache Poisoning Attack Targeting DNS Forwarding Devices
- TortoiseSVN patch 创建并应用补丁
- GOP、IDR、CAR、BLA、RASL、RADL
- 2020-27th-07 蒟蒻团 【陈睿的考验】详解
- 【tableau】4个基本图表
- Web 视频播放前前后后那些事
热门文章
- 单片机小白之旅—51仿真器
- 数据库开发之酒店管理系统08入住登记查询
- H264学习(二)编码方法和编码工具简介
- 检验仪器与计算机接口通信,检验仪器与计算机接口技术
- 打开app显示未连接网络连接到服务器,个人所得税app未连接到互联网怎么办 网络连接解决办法...
- SUB-1G无线射频收发器芯片DP4301/CMT2300A无线遥控器应用
- 【LabVIEW懒人系列教程-小白入门】1.24LabVIEW文件IO之txt文本...
- 解析淘宝助理导出的csv文件
- 实战:150行Go实现高性能socks5代理
- 基于SSH开发的陶瓷工厂进存销管理系统 JAVA MySQL