GD32VW553看门狗喂狗时间配置

分享作者:3310
评测品牌:萤火工场
评测型号:GD32VW553-IOT
发布时间:2026-01-12 10:00:47
2
概要
本文介绍了基于GD32VW553芯片的看门狗功能实现,并阐述了看门狗在程序监控中的重要性。
开源口碑分享内容

一、​​看门狗介绍:


上述图片介绍的开门狗的时钟,喂狗时间的计算和参考。

二、全部代码

看门狗:

#include "gd32vw55x.h"

#include "systick.h"

#include <stdio.h>

#include "gd32vw553h_eval.h"

#include "wtdog.h"

void dog_Init(WatchDog_Type type)

   {

       if (type == FreeDog)

           {

               rcu_osci_on(RCU_IRC32K);

               //while(rcu_osci_stab_wait(RCU_IRC32K) == ERROR); // 等待时钟稳定

               fwdgt_write_enable();//允许写入

               //计数到0,产生一个复位

               fwdgt_config(4000,FWDGT_PSC_DIV16);//延时2s

               fwdgt_write_disable();//禁止写入

               fwdgt_enable();//使能

           }

       else if (type == Windog)

       {

           rcu_periph_clock_enable(RCU_WWDGT);//开启时钟

           wwdgt_deinit();//恢复默认配置

           //freq = 42mhz/psc*4096; t = 1/freq; feedtime = t * (111-63)

           wwdgt_config(127,111,WWDGT_CFG_PSC_DIV4);//24.5ms

           wwdgt_counter_update(127);  //确保初始化时Count是127

           wwdgt_enable();//使能

       }

   }

   //喂狗

   void Feeddog(WatchDog_Type type)

   {

       if (type == FreeDog)//独立看门狗

           {

               fwdgt_write_enable();

               fwdgt_counter_reload();

               fwdgt_write_disable();

           }

       if (type == Windog)//窗口看门狗

           {

            uint8_t current_cnt = WWDGT_CTL & 0x7F; // 获取当前计数器值

           // 仅在计数器进入[111,127]区间时喂狗

            if(current_cnt >64 && current_cnt <= 111)

               {

                   wwdgt_counter_update(127); // 重置计数器为127

               }

                   

           }


   }

Delay:

#include "gd32vw55x.h"

#include "systick.h"

#include <stdio.h>

#include "gd32vw553h_eval.h"

#include "UART.H"

static uint32_t fac_us = 0;

static uint32_t fac_ms = 0;

void Delay_Init(void)

{

   //SysTimer_SetControlValue(SysTimer_MTIMECTL_CMPCLREN_Msk );

  //  清除CMPCLREN位(实现不自动清零)

   SysTimer->MTIMECTL &= ~SysTimer_MTIMECTL_CMPCLREN_Msk;

   SysTimer_SetCompareValue(SystemCoreClock / 4000);

   fac_us = SystemCoreClock / 4000000U;  

   fac_ms = fac_us * 1000U;    

   

}

static void delay_ticks(uint64_t ticks)

{

   uint64_t start = SysTimer->MTIMER;

   volatile uint64_t current;

   while (1) {

       current = SysTimer->MTIMER;

       if ((uint64_t)(current - start) >= ticks) {

           break;

       }

   }

}

/* us 级延时 */

void delay_us(uint32_t us)

{

   uint64_t ticks = (uint64_t)us * fac_us;

   delay_ticks(ticks);

}

/* ms 级延时 */

void delay_ms(uint32_t ms)

{

   uint64_t ticks = (uint64_t)ms * fac_ms;

   delay_ticks(ticks);

}

串口:

#include "gd32vw55x.h"

#include "systick.h"

#include <stdio.h>

#include "gd32vw553h_eval.h"

void Uart_Init(void)

{

   // 时钟使能

   rcu_periph_clock_enable(RCU_GPIOA);

   rcu_periph_clock_enable(RCU_GPIOB);

   rcu_periph_clock_enable(RCU_USART0);

   // GPIO配置

   gpio_af_set(GPIOB,GPIO_AF_8,GPIO_PIN_15);

   gpio_af_set(GPIOA,GPIO_AF_2,GPIO_PIN_8);

   /* 配置TX为复用模式 上拉模式 */

   gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_15);

   /* 配置RX为复用模式 上拉模式 */

   gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_8);

   /* 配置TX为推挽输出 50MHZ */

   gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_15);

   

   // 串口的配置

   usart_baudrate_set(USART0,115200);//波特率

   usart_parity_config(USART0,USART_PM_NONE);//无校验位

   usart_word_length_set(USART0,USART_WL_8BIT);//8位

   usart_stop_bit_set(USART0,USART_STB_1BIT);//一位停止位

   usart_transmit_config(USART0,USART_TRANSMIT_ENABLE);

   usart_receive_config(USART0,USART_RECEIVE_ENABLE);

   usart_enable(USART0);//使能

}

/// 重定向c库函数printf到串口,重定向后可使用printf函数

int fputc(int ch, FILE *f)

{

   /* 发送一个字节数据到串口 */

   usart_data_transmit(USART0, (uint8_t)ch);

   

   /* 等待发送缓冲区空*/

   while (usart_flag_get(USART0, USART_FLAG_TC) == RESET);    

   

   return (ch);

}

// 重定向c库函数scanf到串口,重写后可使用scanf、getchar等函数

int fgetc(FILE *f)

{

   /* 等待串口输入数据(接收缓冲区非空) */

   

   while (usart_flag_get(USART0, USART_FLAG_RBNE) == RESET);

   return (int)usart_data_receive(USART0);

}

// 发送数据

void Uart_SendData(uint16_t Data)

{

   usart_data_transmit(USART0, Data);

   // 等待发送完成

   while(RESET == usart_flag_get(USART0, USART_FLAG_TC));

}

// 发送实现(阻塞式)

void USART_Polling_Send(uint8_t* data, uint32_t len) {

   while(len--) {

       while(RESET == usart_flag_get(USART0, USART_FLAG_TC));

       usart_data_transmit(USART0, *data++);

   }

}

// 阻塞式接收

uint8_t USART_Polling_Receive(void) {

   uint8_t data = 0;

   // 阻塞等待接收缓冲区非空

   while(RESET == usart_flag_get(USART0, USART_FLAG_RBNE));

   

   // 读取接收数据

   data = usart_data_receive(USART0);

   // 手动清除接收标志

   usart_flag_clear(USART0, USART_FLAG_RBNE);

   

   return data;

}


main:

#include "gd32vw55x.h"

#include "systick.h"

#include <stdio.h>

#include "gd32vw553h_eval.h"

#include "wtdog.h"

#include "UART.H"

#include "delay.h"


int main(void)

   {

       //systick_config();

       Uart_Init();

       Delay_Init();

       

       USART_Polling_Send((uint8_t *)"hello world",11);

       

       //dog_Init(FreeDog);

       //Feeddog(FreeDog);

       dog_Init(Windog);

       

     

       while(1) {

           

         //printf("hello world\n");

         delay_ms(25);

         //delay_1ms(5);

         Uart_SendData('J');

         //Feeddog(FreeDog);

         Feeddog(Windog);

         

         

       }

   }



全部评论
暂无评论
0/144