Stark_GS · 2022年11月22日 · 广东

【GD32F427开发板试用】01-USART发送&串口重定向

【GD32F427开发板试用】01-USART发送&串口重定向


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);                                                //PC6复位
                                                //PC6复位
}

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模式
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);//设置GPIO输出类型和速度
    
    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);//复位串口0
    usart_baudrate_set(USART0,115200U);//设置串口0的波特率
    
    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"


//此处代码与使用 Printf 函数相关,使用时要添加 stdio.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);    //反转PC6
        delay_1ms(200);
        
        USART_TransmitString("这是一个串口测试\r\n");
        
        printf("串口重定向测试\r\n");
    }
}

测试串口打印及LED指示代码运行状态

1234.png

推荐阅读
关注数
4
文章数
14
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息