ZYNQ-Vitis(SDK)裸机开发之(六)Watchdog看门狗的使用

目录

一、ZYNQ看门狗简介

.二、Vitis工程编写

1.头文件wdt_hdl.h:

2.源文件wdt_hdl.c: 

​3.在main函数中调用看门狗初始化


例程开发环境:

SOC芯片:ZYNQ7020

开发环境:Vivado2020.2,Vitis2020.2

一、ZYNQ看门狗简介

看门狗主要是实现程序在运行异常、崩溃卡死的状态下,使系统进行重启的功能,ZYNQ看门狗为PS核内置功能,因此无需对PS端进行特殊配置,也不需要增加PL端的任何IP核;因此本项目工程是在ZYNQ-Vitis(SDK)裸机开发之(一)串口实验工程基础上开发的,一些block design的设计方法,Vitis工程的建立方法等,均在该篇文章中进行了详细的讲解,大家可以去参考:

ZYNQ-Vitis(SDK)裸机开发之(一)串口收发使用:PS串口+PL串口、多个串口使用方法

.二、Vitis工程编写

1.头文件wdt_hdl.h:

  1. 定义看门狗设备ID以及重装载值,看门狗时钟333.333,而CPU时钟是666.666使用公式计算装载值:(CPU时钟/2)*num,num即看门狗狗咬时间,3就是3s
  2. 定义看门狗实例
  3. 声明看门狗初始化函数
/*!
    \file    wdt_hdl.h
    \brief   firmware functions to manage intr
    \version 2024-03-12, V1.0.0
	\author  tbj
*/

#ifndef WDT_HDL_H
#define WDT_HDL_H

#include "crc_cal.h"

#ifdef __cplusplus
 extern "C" {
#endif

//看门狗设备ID号以及复位时间计数(3s)
#define WDT_DEVICE_ID		XPAR_SCUWDT_0_DEVICE_ID
#define WDT_LOAD_VALUE		(XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ / 2) * 3

//看门狗实例
XScuWdt Watchdog;

int InitWdt(XScuWdt * WdtInstancePtr, u16 DeviceId);

#ifdef __cplusplus
}
#endif

#endif /* WDT_HDL_H */

2.源文件wdt_hdl.c: 

  1. 实现看门狗初始化函数

/*!
    \file    wdt_hdl.c
    \brief   firmware functions to manage watchdog
    \version 2024-04-10, V1.0.0
	\author  tbj
*/

#include "wdt_hdl.h"

//看门狗初始化函数
/* @brief:看门狗初始化函数
 * @param:看门狗对象指针
 * @param:看门狗设备ID
 */
int InitWdt(XScuWdt * WdtInstancePtr, u16 DeviceId)
{
	int Status;
	XScuWdt_Config *ConfigPtr;

	ConfigPtr = XScuWdt_LookupConfig(DeviceId);
	Status = XScuWdt_CfgInitialize(WdtInstancePtr, ConfigPtr,
					ConfigPtr->BaseAddr);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	//设置为看门狗模式(还有定时器模式可以设置)
	XScuWdt_SetWdMode(WdtInstancePtr);
	//配置计数时间
	XScuWdt_LoadWdt(WdtInstancePtr, WDT_LOAD_VALUE);
	//使能看门狗
	XScuWdt_Start(WdtInstancePtr);
	//喂狗
	XScuWdt_RestartWdt(&Watchdog);

	return XST_SUCCESS;
}

 

3.在main函数中调用看门狗初始化

int main()
{
	//看门狗测试
#ifdef WATCHDOG_TEST
	InitWdt(&Watchdog, WDT_DEVICE_ID);
#endif

	while(1){

	}
    return 0;
}

通过XScuWdt_RestartWdt(&Watchdog);函数,在操作时间较长较复杂的位置,进行喂狗操作,防止狗咬系统复位;

测试看门狗是否正常运行时,可将喂狗操作去掉,观察ZYNQ的Done等,是否固定频率亮灭,如果是,则证明ZYNQ由于没有喂狗,在被一直复位重启。

创作不易,希望大家点赞、收藏、关注哦!!!ヾ(o◕∀◕)ノ

### Zynq 看门狗实现复位重启方法 在嵌入式系统中,为了防止程序失控或死机,通常采用看门狗定时器来监控系统的健康状态。对于Zynq设备而言,软件可编程的看门狗定时器(SWDT)可以用于触发系统复位。 #### 配置独立看门狗 配置过程涉及初始化、设置超时周期以及定期刷新计数器以阻止意外复位的发生。具体操作如下: - **初始化**:首先需要启用并配置看门狗模块的相关参数,比如设定初始倒计数值和选择合适的分频系数以便定义合理的监视窗口大小。 - **喂狗机制**:应用程序应当设计有规律性的事件循环,在此期间调用API函数去更新看门狗的状态,即所谓的“喂狗”,从而避免因未及时处理而导致的非计划性复位行为[^1]。 ```c // 初始化看门狗 XScuWdt_Config *Config; int Status; Config = XScuWdt_LookupConfig(XPAR_SCUWDT_0_DEVICE_ID); Status = XScuWdt_CfgInitialize(&Watchdog, Config, Config->BaseAddress); if (Status != XST_SUCCESS){ return XST_FAILURE; } // 设置超时时间(单位为秒) uint32_t timeout_seconds = 5; // 假设我们希望每五秒钟喂一次狗 XScuWdt_SetTimeoutValue(&Watchdog, timeout_seconds * XPAR_XWDTTB_CLK_FREQ_HZ); // 启动看门狗 XScuWdt_Start(&Watchdog); ``` 一旦发生异常情况未能按时喂狗,则计数器达到零点之后便会发出复位指令给处理器核心,进而引起整个系统的重启动作。这种强制性的恢复措施有助于提高系统的稳定性和可靠性[^2]。 值得注意的是,当系统经历了一次由看门狗引发的复位后,所有的内部存储单元都会被清除,这意味着任何易失性的数据都将丢失;同时,现场可编程逻辑阵列(PL)部分同样会被重置回到默认状态[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

披着假发的程序唐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值