目录
例程开发环境:
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:
- 定义看门狗设备ID以及重装载值,看门狗时钟333.333,而CPU时钟是666.666使用公式计算装载值:(CPU时钟/2)*num,num即看门狗狗咬时间,3就是3s
- 定义看门狗实例
- 声明看门狗初始化函数
/*!
\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:
- 实现看门狗初始化函数
/*!
\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◕∀◕)ノ