USART 简介及特点
四个 USART 和两个 UART,工作频率高达 12.5 MB/s
支持异步和时钟同步串行通信模式
IrDA SIR 编码器和解码器支持
LIN 中断生成和检测
符合 ISO 7816-3 标准的智能卡接口
USART(USART0、USART1、USART2、USART5)和 UART(UART3、UART4)用于在并行和串行之间转换数据接口,使用同步或异步提供灵活的全双工数据交换转移。 它也常用于 RS-232 标准通信。 USART 包括一个可编程的波特率发生器,它能够对系统时钟进行分频以产生USART 发送器和接收器的专用时钟。 USART 还支持 DMA 高速数据通信功能。
开发环境&参考文档
Keil-MDK 5.27.1.0
Windows11
固件库-GD32F4xx\_Firmware\_Library\_V3.0.2
GD32F427xx\_Datasheet\_Rev1.2
GD32F4xx\_User\_Manual\_Rev2.7\_CN
GD32F4xx 固件库使用指南\_V1.0
代码部分
GPIO 端口配置 LED
gpio.h 文件
#ifndef _GPIO_H_
#define _GPIO_H_
#include "gd32f4xx.h"
void GPIO_Init(void);
#endif
gpio.c 文件
#include "gpio.h"
void GPIO_Init(void)
{
rcu_periph_clock_enable(RCU_GPIOC);
gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6);
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
gpio_bit_reset(GPIOC, GPIO_PIN_6);
}
USART 功能初始化
uart.h 文件
#ifndef _UART_H_
#define _UART_H_
#include "gd32f4xx.h"
void USART_Init(void);
void USART_ReceiveString(void);
void USART_TransmitString(char *String);
#endif
uart.c 文件
此处需要注意使用 USART0 时,配置PA9 PA10 为 USART0 时发出的是乱码,是由于板子上的PA9被占用(可看原理图部分),所以此处 UART0 配置为PB6 PB7
端口的复用功能在数据手册的 2.6.6 章节可以查找到,此处不截图了
#include "uart.h"
void USART_Init(void)
{
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_USART0);
gpio_af_set(GPIOB,GPIO_AF_7,GPIO_PIN_6);
gpio_af_set(GPIOB,GPIO_AF_7,GPIO_PIN_7);
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_6);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_7);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
usart_deinit(USART0);
usart_baudrate_set(USART0,115200U);
usart_word_length_set(USART0,USART_WL_8BIT);
usart_parity_config(USART0,USART_PM_NONE);
usart_stop_bit_set(USART0,USART_STB_1BIT);
usart_receive_config(USART0, USART_RECEIVE_ENABLE);
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
usart_enable(USART0);
}
void USART_ReceiveString(void)
{
}
void USART_TransmitString(char *String)
{
while(*String)
{
usart_data_transmit(USART0,*String++);
while(usart_flag_get(USART0,USART_FLAG_TC)==0);
}
}
void USART0_IRQHandler()
{
}
串口重定向实现 printf 打印
Printf.h 文件
#ifndef _PRINTF_H_
#define _PRINTF_H_
#include "stdio.h"
#include "uart.h"
#endif
Printf.c 文件
注意:此处要判断串口是否发送完成!!!
#include "Printf.h"
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
usart_data_transmit(USART0,(uint32_t)ch);
while(RESET == usart_flag_get(USART0,USART_FLAG_TC));
return ch;
}
主函数 main.c
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "gpio.h"
#include "uart.h"
int main(void)
{
systick_config();
GPIO_Init();
USART_Init();
while(1)
{
gpio_bit_toggle(GPIOC, GPIO_PIN_6);
delay_1ms(200);
USART_TransmitString("这是一个串口测试\r\n");
printf("串口重定向测试\r\n");
}
}
测试串口打印及LED指示代码运行状态
原作者:Stark_GS