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

news2024/9/23 17:21:33

1 复制工程模板

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

2 新建keil工程

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

3 编写代码

3.1 创建USART文件

创建一个USART.c文件,放于05_UserDriver文件夹中
在这里插入图片描述

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)
	{

	}
}

测试结果

基本函数功能正常,可以输出内容
在这里插入图片描述

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
在这里插入图片描述

如果勾选后编译报错,且报错内容为:
.\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调试成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2105530.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

macOS安装Maven

安装Java Java Downloads | Oracle 官网下载默认说最新的Java22版本&#xff0c;注意这里我们要下载的是Java8&#xff0c;对应的JDK1.8 需要登陆Oracle&#xff0c;没有账号的可以百度下。账号:908344069qq.com 密码:Java_2024 Java8 jdk1.8配置环境变量 open -e ~/.bash_p…

关于edge浏览器登陆CSDN安全验证不跳出验证码

前言 也就是最近这几天才出现这个问题&#xff0c;以前用edge浏览器登陆csdn时即使需要安全验证也能正常弹出验证码&#xff0c;现在根本没反应。 正文 我用edge浏览器登陆时&#xff0c;显示如下界面&#xff0c;就卡住不动了。 起初我以为是我浏览器可能设置了拦截的问题…

数据分析利器:Java与MySQL构建强大的数据挖掘系统

数据分析在当今信息时代具有重要的作用&#xff0c;它可以帮助企业和组织深入理解数据&#xff0c;发现隐藏在数据中的模式和规律&#xff0c;并基于这些洞察进行决策和优化。Java与MySQL作为两个强大的工具&#xff0c;结合起来可以构建出一个高效、可靠且功能丰富的数据挖掘系…

《中文Python穿云箭量化平台二次开发技术09》设计一个可视化股票池量化平台项目用于实现选股和自动交易

《中文Python穿云箭量化平台》是纯Python开发的量化平台&#xff0c;因此其中很多Python模块&#xff0c;我们可以自己设计新的量化工具&#xff0c;例如自己新的行情软件、新的量化平台、以及各种量化研究工具。 穿云箭自带指标公式源码运行模块&#xff0c;可以为其他量化平台…

ROS/ROS2版本和Gazebo版本

简洁版本&#xff1a; ROS Noetic Gazebo 11 &#xff08;ubuntu 20.04&#xff09;ROS Jazzy Gazebo Harmonic &#xff08;ubuntu 24.04&#xff09; 其他版本搭配也可以学习和研究但是成本过高。 如何贯穿从ROS kinetic到ROS Jazzy的教程。 如何实现旧新的平滑过度。 …

python常用库学习-Matplotlib使用

文章目录 安装 Matplotlib导入库基本示例1. 绘制简单的线图2. 散点图3. 柱状图4. 直方图5. 子图 更多高级功能1. 自定义样式2. 文本和注释3. 保存图形 示例&#xff1a;使用 Matplotlib 绘制多个图表示例 1: 绘制多个线图示例 2: 绘制散点图和直方图 参考文献 Matplotlib 是 Py…

【QT】VS2020+QT插件 CMake项目开发踩坑记录

背景 我使用的是VS2022&#xff0c; 安装了QT的两个插件&#xff0c;并且使用CMake进行工程管理。 当然如果你想通过VS开发qt&#xff0c;第一步是安装QT&#xff08;我目前安装了最新的6.7版本&#xff09; 然后才是安装VS中的QT插件。 这篇文章&#xff0c;主要记录&#x…

Navicat出了免费版本

官方下载地址 Navicat出了一款免费版本Navicat Premium Lite&#xff0c;相比正常版本阉割了很多功能&#xff0c;最让人无奈的是没有美化sql功能。 可以满足我们的日常需求&#xff0c;提供了基础的功能&#xff1a;创建连接、连接分组、管理表、管理数据、导入导出数据。还…

台球助教APP小程序的前端交互设计

在当今移动互联网时代&#xff0c;台球助教APP小程序作为一种便捷的学习工具&#xff0c;正在成为越来越多台球爱好者的首选。作为设计人员&#xff0c;在开发台球助教APP小程序时&#xff0c;我们的目标是创造一个既美观又实用的应用程序&#xff0c;让用户在使用过程中感到舒…

VS编译环境中printf() scanf()等文件操作函数不安全编译报错的解决方法

如题&#xff0c;在使用诸如printf() scanf() fopen()等函数时会出现如下图这样不安全的错误 解决方法&#xff1a; 在程序的前面添加此预编译指令 #pragma warning(disable:4996) 添加后即可编译通过。

基于vue框架的超市管理系统yqogz(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,商品分类,商品信息,员工,进货信息 开题报告内容 基于Vue框架的超市管理系统开题报告 一、研究背景与意义 随着信息技术的飞速发展和零售行业的数字化转型&#xff0c;超市作为传统零售业的重要组成部分&#xff0c;面临着提升管…

「OC」剪不断,理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究

「OC」剪不断&#xff0c;理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究 文章目录 「OC」剪不断&#xff0c;理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究前言介绍UIResponderUIGestureRecognizerUIControl 正文UIGestur…

都9月了,说好的系统规划与管理师改版教程呢?

今天距离2024年下半年的系统规划与管理师考试&#xff0c;还有66天的时间&#xff0c;六六大顺&#xff01; 差不多是一个月之前&#xff0c;系统规划与管理师的改版消息被刷屏了&#xff0c;刷屏的原因是系统规划与管理师改版的消息&#xff0c;据说新版大纲和教材已经完成备案…

每日OJ_牛客_五子棋(判断是否有赢)

目录 牛客_五子棋&#xff08;判断是否有赢&#xff09; 解析代码 牛客_五子棋&#xff08;判断是否有赢&#xff09; 五子棋__牛客网 题目&#xff1a; 用例输入&#xff1a; .................... .................... .................... .................... ....…

Nginx: 模块化管理编译安装与配置结构

Nginx 模块化管理机制 Nginx 是一个高性能web和反向代理服务器&#xff0c;尤其是在激烈的Web服务器竞争领域中能够依然保持很好的这个发展势头&#xff0c;并且在现在的众多企业中得到一个广泛的应用&#xff0c;这一切其实跟Nginx架构设计是分不开的 另外高度模块化的设计也…

计算机毕业设计 二手闲置交易系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

影石相机tf内存卡数据格式化后恢复方法

在数字化时代&#xff0c;‌相机成为了我们记录生活、‌捕捉瞬间的重要设备。‌影石相机&#xff0c;‌以其出色的性能和便捷的操作&#xff0c;‌赢得了众多摄影爱好者的青睐。‌然而&#xff0c;‌在使用过程中&#xff0c;‌我们可能会遇到一些意外情况&#xff0c;‌如不小…

PTA L1-041 寻找250

L1-041 寻找250&#xff08;10分&#xff09; 对方不想和你说话&#xff0c;并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。 输入格式&#xff1a; 输入在一行中给出不知道多少个绝对值不超过1000的整数&#xff0c;其中保证至少存在一个“2…

828华为云征文:华为云 Flexus X 实例性能测评——SuperBench 一键窥见性能

今天我拿到了华为云 Flexus X 实例&#xff0c;这款云服务是华为云推出的有一款明星产品&#xff0c;面向零售、金融、游戏等行业大多数通用工作负载场景。这次&#xff0c;我们就来测评一下它的性能到底怎么样&#xff01; Flexus 云服务 X 实例 在测评之前&#xff0c;我们…

星河产业应用创新奖,AI产业实干者的闪耀时刻

华晨宝马汽车有限公司搭建企业级 Agent 服务平台&#xff0c;推理成本降低50%&#xff08;获2023年星河产业应用创新奖&#xff09; 泰康保险集团股份有限公司实现保险理赔场景数字化升级&#xff0c;理赔作业效率提升27%&#xff08;获2022年飞桨产业应用创新奖&#xff09; …