一、看门狗介绍:






上述图片介绍的开门狗的时钟,喂狗时间的计算和参考。
二、全部代码
看门狗:
#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);
}
}

开源社区
