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

GD32入门到实战25--独立看门狗

程序运行时要及时喂狗!!!

我们要设置看门狗最大超时时间2000ms

所以我们32分频:40k/32 = 1.25k  (0.8ms周期)

装载值为2000ms/0.8ms=2500

添加fwdgt.c

编写wdg_drv.c

#include "gd32f30x.h"
#include <stdint.h>/**
***********************************************************
* @brief 独立看门狗初始化
* @param
* @return 
***********************************************************
*/
void WdgDrvInit()
{/*关闭EWDGT PSC和EWDGTRLD的写保护*//*配置预分频器和重装载寄存器*/fwdgt_config(2500,FWDGT_PSC_DIV32);//分频后40khz / 32 = 1.25khz,周期0.8ms,2500 * 0.8 = 2000ms/*开启开门狗*/fwdgt_enable();
}/**
***********************************************************
* @brief 喂狗
* @param
* @return 
***********************************************************
*/
void FeedDog(void)
{fwdgt_counter_reload();
}

wdg_drv.h

#ifndef _WDG_DRV_H
#define _WDG_DRV_H/**
***********************************************************
* @brief 喂狗
* @param
* @return 
***********************************************************
*/
void FeedDog(void);/**
***********************************************************
* @brief 独立看门狗初始化
* @param
* @return 
***********************************************************
*/
void WdgDrvInit();#endif

驱动层写完了,我们在应用层创建业务文件

wdg_app.c

#include "gd32f30x.h"
#include <stdint.h>/**
***********************************************************
* @brief 独立看门狗初始化
* @param
* @return 
***********************************************************
*/
void WdgDrvInit()
{/*关闭EWDGT PSC和EWDGTRLD的写保护*//*配置预分频器和重装载寄存器*/fwdgt_config(2500,FWDGT_PSC_DIV32);//分频后40khz / 32 = 1.25khz,周期0.8ms,2500 * 0.8 = 2000ms/*开启开门狗*/fwdgt_enable();
}/**
***********************************************************
* @brief 喂狗
* @param
* @return 
***********************************************************
*/
void FeedDog(void)
{fwdgt_counter_reload();
}

wdg_app.h

#include "wdg_drv.h"
#include <stdio.h>
/**
***********************************************************
* @brief 独立看门狗任务处理函数
* @param
* @return 
***********************************************************
*/
void WdgTask(void)
{FeedDog();printf("********喂狗*********\n");
}

main.c

#include <stdint.h>
#include <stdio.h>
#include "led_drv.h"
#include "key_drv.h"
#include "wdg_drv.h"
#include "systick.h"
#include "usart_drv.h"
#include "delay.h"
#include "usb2com_app.h"
#include "hmi_app.h"
#include "wdg_app.h"typedef struct
{uint8_t run;                // 调度标志,1:调度,0:挂起uint16_t timCount;          // 时间片计数值uint16_t timRload;          // 时间片重载值void (*pTaskFuncCb)(void);  // 函数指针变量,用来保存业务功能模块函数地址
} TaskComps_t;/*任务调度结构体*/static TaskComps_t g_taskComps[] =  /*任务调度结构体数组,存放各个业务功能模块调度参数*/
{/*填入各个业务功能模块*/{0, 5,   5,   HmiTask},{0, 1000, 1000,WdgTask},/* 添加业务功能模块 */
};#define TASK_NUM_MAX   (sizeof(g_taskComps) / sizeof(g_taskComps[0]))
/*用宏定义计算结构体数组的个数*///sizeof(g_taskComps):计算整个数组 g_taskComps 的大小(以字节为单位)。
//sizeof(g_taskComps[0]):计算数组中单个元素的大小(以字节为单位)。
//通过整个数组的大小除以单个元素的大小,得到数组中元素的数量/*
******************************************
* @brief 任务调度函数(判断所有业务模块的标志位)
* @param 
* @return
********************************************
*/
static void TaskHandler(void)
{for (uint8_t i = 0; i < TASK_NUM_MAX; i++){if (g_taskComps[i].run)                  // 判断时间片标志{g_taskComps[i].run = 0;              // 标志清零g_taskComps[i].pTaskFuncCb();        // 执行调度业务功能模块}}
}/*
******************************************
* @brief 时间片递减函数 1ms-1时间片
* @param 
* @return
********************************************
*/
static void TaskScheduleCb(void)
{for (uint8_t i = 0; i < TASK_NUM_MAX; i++){if (g_taskComps[i].timCount){g_taskComps[i].timCount--;if (g_taskComps[i].timCount == 0){g_taskComps[i].run = 1;g_taskComps[i].timCount = g_taskComps[i].timRload;}}}
}static void DrvInit(void)
{SystickInit();LedDrvInit();KeyDrvInit();DelayInit();UsartDrv_Init();WdgDrvInit();
}
static void AppInit(void)
{Usb2ComAppInit();TaskScheduleCbReg(TaskScheduleCb);}int main(void)
{	DrvInit();AppInit();printf("**********看门狗测试*********\n");while (1){TaskHandler();}
}

http://www.xdnf.cn/news/1425079.html

相关文章:

  • JAVA后端开发——MyBatis 结合 MySQL JSON 类型查询详解
  • 【STM32】贪吃蛇 [阶段 3] 增强模块结构(架构优化)
  • curl 介绍及使用教程
  • python爬虫之selenium库进阶(小白五分钟从入门到精通)
  • 基本渗透概念
  • Raft 协议在 Nacos 中的实现
  • 从零开始实现Shell | Linux进程调度实战
  • Product Hunt 每日热榜 | 2025-09-01
  • 基于YOLOv11的脑卒中目标检测及其完整数据集——推动智能医疗发展的新机遇!
  • 齿轮里的 “双胞胎”:分度圆与节圆
  • [React]监听Form中某个字段的变化
  • 微算法科技(NASDAQ:MLGO)张量网络与机器学习融合,MPS分类器助力顶夸克信号识别
  • deepseek doubao chatgpt 优缺点分析
  • 并发--并发中的线程状态及不同状态下线程所在队列
  • React学习教程,从入门到精通, React 入门指南:创建 React 应用程序的语法知识点(7)
  • OpenCV-CUDA 图像处理
  • 数据库常见故障类型
  • 知识产品和标准化
  • 在 Qt 中加载 .qm 翻译文件
  • 跳跃游戏(二):DFS 求解最少跳跃次数与最优路径
  • 专项智能练习(Word)
  • JavaSE:抽象类和接口
  • 计算机视觉(五):blur
  • 原子操作(Atomic Operation) 是指不可被中断的操作——要么完整执行,要么完全不执行
  • 贵州在假期及夏天结束后保持旅游活力的策略分析
  • AI如何重塑电力工程设计?揭秘良策金宝AI的六大“超能力”
  • SQLSERVER关键字:N
  • VBA数据库解决方案第二十二讲:根据工作表数据生成数据库中数据表
  • 算法练习——189.轮转数组
  • 【逆序对 博弈】P10737 [SEERC 2020] Reverse Game|普及+