首页 > 其他分享 >【GD32】---- 使用GD32调试串口并实现printf打印输出

【GD32】---- 使用GD32调试串口并实现printf打印输出

时间:2024-05-07 16:35:53浏览次数:38  
标签:打印输出 USART usart 串口 GD32 Printf GPIO include

1 复制工程模板

直接复制工程模板里的系统文件和固件库文件到新的工程文件01_USART_Printf
image

2 新建keil工程

参考上一篇博文:【GD32】---- 移植工程模板及点灯测试

3 编写代码

3.1 创建USART文件

创建一个USART.c文件,放于05_UserDriver文件夹中
image

USART.h

/**
 * ************************************************************************
 * 
 * @file USART.h
 * @author zxr
 * @brief 
 * 
 * ************************************************************************
 * @copyright Copyright (c) 2024 zxr 
 * ************************************************************************
 */
#ifndef USART_H_
#define USART_H_

#include "gd32e23x_rcu.h"
#include "gd32e23x_gpio.h"
#include "gd32e23x_usart.h"

#define Printf_GPIO_RCU			RCU_GPIOA		//串口对应GPIO端口的时钟
#define Printf_USART_RCU		RCU_USART0	    //对应串口号的时钟

#define Printf_GPIO			    GPIOA	        //串口对应GPIO端口
#define Printf_GPIO_AF          GPIO_AF_1       //串口是GPIO引脚的复用功能1(查询芯片数据手册)
#define Printf_TX_PIN		    GPIO_PIN_9      //串口对应的GPIO引脚
#define Printf_RX_PIN           GPIO_PIN_10     //串口对应的GPIO引脚

#define Printf_USART		    USART0          //printf所使用的串口

/**
 * ************************************************************************
 * @brief 函数声明
 * ************************************************************************
 */
void USART_Init(void);
void USART_send_char(uint8_t ch);
void USART_send_string(uint8_t *string);

#endif

USART.c

/**
 * ************************************************************************
 * 
 * @file USART.c
 * @author zxr
 * @brief 
 * 
 * ************************************************************************
 * @copyright Copyright (c) 2024 zxr 
 * ************************************************************************
 */
#include "USART.h"

/**
 * ************************************************************************
 * @brief USART初始化配置
 * 
 * 
 * ************************************************************************
 */
void USART_Init(void)
{
	rcu_periph_clock_enable(Printf_GPIO_RCU);	//使能串口对应的GPIO端口的时钟
	rcu_periph_clock_enable(Printf_USART_RCU);	//使能串口时钟
	
	gpio_af_set(Printf_GPIO, Printf_GPIO_AF, Printf_TX_PIN);	//将PA9复用为串口的TX引脚
	gpio_af_set(Printf_GPIO, Printf_GPIO_AF, Printf_RX_PIN);	//将PA10复用为串口的RX引脚
	
	gpio_mode_set(Printf_GPIO, GPIO_MODE_AF, GPIO_PUPD_PULLUP, Printf_TX_PIN);	//复用模式,上拉
	gpio_mode_set(Printf_GPIO, GPIO_MODE_AF, GPIO_PUPD_PULLUP, Printf_RX_PIN);	//复用模式,上拉
	
	gpio_output_options_set(Printf_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, Printf_TX_PIN);//推挽输出
	gpio_output_options_set(Printf_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, Printf_RX_PIN);//推挽输出
	
	usart_deinit(Printf_USART);	//复位串口
	usart_baudrate_set(Printf_USART, 115200);	//设置波特率115200
	usart_parity_config(Printf_USART, USART_PM_NONE);	//无校验位
	usart_word_length_set(Printf_USART, USART_WL_8BIT);	//8位数据长度
	usart_stop_bit_set(Printf_USART, USART_STB_1BIT);	//1位停止位
	
	usart_enable(Printf_USART);	//使能串口
	usart_transmit_config(Printf_USART, USART_TRANSMIT_ENABLE);	//使能串口发送功能
	usart_receive_config(Printf_USART, USART_RECEIVE_ENABLE);	//使能串口接收功能
}

/**
 * ************************************************************************
 * @brief USART发送单个字符
 * 
 * @param[in] ch  要发送的字符
 * 
 * ************************************************************************
 */
void USART_send_char(uint8_t ch)
{
	usart_data_transmit(Printf_USART, (uint8_t)ch);	//发送一个字符
	while(usart_flag_get(Printf_USART, USART_FLAG_TBE) == RESET);	//等待发送数据缓冲区标志置位
	
}

/**
 * ************************************************************************
 * @brief USART发送字符串
 * 
 * @param[in] string  字符串
 * 
 * ************************************************************************
 */
void USART_send_string(uint8_t *string)
{
	while(string && *string)	//地址为空或者值为空跳出
	{
		USART_send_char(*string++);
	}
}



3.2 USART基本功能测试

/**
 * ************************************************************************
 * 
 * @file main.c
 * @author GD32
 * @brief 
 * 
 * ************************************************************************
 * @copyright Copyright (c) 2024 GD32 
 * ************************************************************************
 */
#include "gd32e23x.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"

#include "USART.h"
/**
 * ************************************************************************
 * @brief 主函数main
 * 
 * 
 * @return 
 * ************************************************************************
 */
int main(void)
{
	USART_Init();
	USART_send_string("hello\n");
	while(1)
	{

	}
}

测试结果

基本函数功能正常,可以输出内容
image

3.3 重定向printf

为了方便打印数字,小数等内容,重定向printf函数。首先c语言的printf函数中不断循环调用fputc函数,所以需要重写fputc函数,这个函数的功能就是打印输出一个字符。

添加头文件

打开USATR.h文件,在里面添加#include "stdio.h"

添加函数声明

然后再声明一下int fputc(int ch, FILE *f);函数

重写fputc函数

USART.c中,重写fputc函数

/**
 * ************************************************************************
 * @brief 重定向printf函数
 * 
 * @param[in] ch  Comment
 * @param[in] f  Comment
 * 
 * @return 
 * ************************************************************************
 */
int fputc(int ch, FILE *f)
{
    usart_data_transmit(Printf_USART, (uint8_t) ch);
    while(RESET == usart_flag_get(Printf_USART, USART_FLAG_TBE));
    return ch;
}

3.4 测试printf

补充main函数

main.c中添加测试代码

/**
 * ************************************************************************
 * 
 * @file main.c
 * @author GD32
 * @brief 
 * 
 * ************************************************************************
 * @copyright Copyright (c) 2024 GD32 
 * ************************************************************************
 */
#include "gd32e23x.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"

#include "USART.h"
/**
 * ************************************************************************
 * @brief 主函数main
 * 
 * 
 * @return 
 * ************************************************************************
 */
int main(void)
{
	USART_Init();
	//USART_send_string("hello\n");
	printf("hello\n");
	printf("%d\n", 10);
	while(1)
	{

	}
}

勾选微库

编译前记得勾选微库Use MicroLIB
image

如果勾选后编译报错,且报错内容为:
.\Objects\01_USART_Printf.axf: Error: L6218E: Undefined symbol __use_two_region_memory (referred from startup_gd32e23x.o).

.\Objects\01_USART_Printf.axf: Error: L6218E: Undefined symbol __initial_sp (referred from entry2.o).
解决办法可参考我的博文:关于keil中勾选微库"Use MicroLIB"调试printf时编译报错问题

编译烧录运行

串口调试助手正常显示
image

串口调试及printf调试成功

标签:打印输出,USART,usart,串口,GD32,Printf,GPIO,include
From: https://www.cnblogs.com/zxr-blog/p/18176169

相关文章

  • 【GD32】---- 移植工程模板
    1新建模板文件夹新建一个名叫03_GD32TemplateProject的文件夹,用于建造工程模板2移植官方库文件在模板文件夹里新建5个文件夹,分别存放官方库文件和系统驱动文件01_main存放main函数02_Startup存放系统启动文件03_System存放官方的系统文件04_Firmware_PeripheralD......
  • 01_SerialPort类串口通信
     文档:SerialPort类(System.IO.Ports)|MicrosoftLearn  页面展示: 代码:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.IO.Ports;usingSystem.Linq;usingSystem.Text......
  • 【专题STM32F03】 使用 STM32Cube\Repository\STM32Cube_FW_F1_V1.8.5 中例程由ST77
    1)修改Project\STM32Cube_FW_F1_V1.8.5\Projects\STM32F103RB-Nucleo\Demonstrations\Adafruit_LCD_1_8_SD_Joystick2)接线(见stm32f1xx_nucleo.h)LCD_LED_PIN接高电平LCD_CS_PIN  接PB6LCD_DC_PIN  接PA9LCD_SPI_CLK  接SPI1,PA5LCD_SPI_SDA  接SPI1,PA73)修......
  • linux下调试串口设备
    USB转串口常用CH34x芯片,该芯片有linux下的驱动。在默认情况下,大部分linux发行版都包含了CH34x的驱动,唯一缺点就是版本比较久。可以先插上开发板,一般是挂载到/dev/ttyCH341USB0文件下,如果该文件不存在,有两种可能,一种是驱动版本太久,可以下载官方的驱动文件,然后编译安装。官方驱......
  • FreeRTOS串口中断接收数据
    1volatileuint8_tRxBuffer;2voidStartTask04(voidconst*argument)3{4/*USERCODEBEGINStartTask04*/5uint8_tlen;6osEventevt;7HAL_UART_Receive_IT(&huart1,&RxBuffer,1);8__HAL_UART_ENABLE_IT(&huart1,U......
  • 什么是DTU和串口服务器的区别
    在工业物联网的快速发展中,数据传输单元(DTU)和串口服务器作为两种关键设备,各自扮演着重要的角色。对于传统行业来说,了解它们的基本概念和区别,有助于更好地选择和应用这些技术,提升生产效率和智能化水平。本文将向传统行业解释DTU和串口服务器的基本概念,并探讨它们之间的主要区别......
  • 串口服务器可以直接连接工业路由器吗
    串口服务器可以直接连接工业路由器吗在工业物联网的架构中,串口服务器和工业路由器都是不可或缺的重要组件。串口服务器的主要功能是将串口通信转换为网络通信,实现数据的远程传输和管理;而工业路由器则负责在工业环境中提供稳定、可靠的网络连接,确保数据的顺畅传输。那么,串口服务器......
  • 串口服务器和光纤交换机有什么不同
    串口服务器与光纤交换机在功能和应用上存在显著区别。串口服务器主要实现串口设备与以太网设备之间的数据转换与传输,适用于远程监控、数据采集等场景;而光纤交换机则专注于高速光纤网络中的数据交换,为大型企业或数据中心提供稳定、高效的数据传输服务。简而言之,串口服务器侧重串口......
  • stm32串口晶振不对输出乱码+汇承HC-14lora模块
    最近要用到一个lora无线透传模块,然后就先用两个32开发板(用的STM32F103C8T6)试试简单的收发数据。结果,第一步串口发送一句话就寄了,我串口打印了“hi”,结果出现了一堆乱码,我寻思着,就这一句代码也不至于还能错吧。。。然后我以为是USB-TTL的问题,换了一个能用的还是一样。。。但是很奇......
  • 解决方案 | 获取所有的打印输出的图纸尺寸的名称GetCanonicalMediaNames返回为空的原
     巨大的坑,该代码来自于acadauto_2014--AutoCAD2014ActiveXReferenceGuide.chm但是存在一个巨大的bug。'获取所有的打印输出的图纸尺寸的名称,但是事前必须设置【打印机对象】也就是Layouts("Model").ConfigName="DWFClassic.pc3"这样的代码,否则返回为空。也就是说,先设......