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

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);	//设置波特率115200usart_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.rhkb.cn/news/417318.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust 赋能前端:PDF 分页/关键词标注/转图片/抽取文本/抽取图片/翻转...

❝ 我从不幻想成功。我只会为了成功努力实践 大家好&#xff0c;我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder ❝ 此篇文章所涉及到的技术有 WebAssembly Mupdf Pdf操作( 分页展示/文本抽离/文本标注/获取超链接/Pdf转图片/翻转/截取) 因为&#xff0c;行文…

新型PyPI攻击技术可能导致超2.2万软件包被劫持

一种针对 Python 软件包索引&#xff08;PyPI&#xff09;注册表的新型供应链攻击技术已在野外被利用&#xff0c;并且目前正试图渗透到下游组织中。 软件供应链安全公司 JFrog 将其代号定为Revival Hijack&#xff0c;并称这种攻击方法可用于劫持 2.2万个现有 PyPI 软件包&am…

6、LVGL控件-线条、图片、按钮矩阵

本篇文章目录导航 ♠♠ LVGL控件-线条、图片、按钮矩阵 ♣♣♣♣ 一、LVGL 线条部件 ♦♦♦♦♦♦♦♦ 1.1 线条部件组成部分 ♦♦♦♦♦♦♦♦ 1.2 线条部件基本API ♦♦♦♦♦♦♦♦ 1.3 实验小演示 ♣♣♣♣ 二、LVGL 图片部件 ♦♦♦♦♦♦♦♦ 2.1 图片部件组成部分 ♦♦…

前端框架有哪些?

前言 用户体验是每个开发网站的企业中的重中之重。无论后台有多方面的操作和功能&#xff0c;用户的视图和体验都必须是无缝的最友好的。这需要使用前端框架来简化交互式、以用户为中心的网站的开发。 前端框架是一种用于简化Web开发的工具&#xff0c;它提供了一套预定义的代…

基于蜣螂优化最小二乘支持向量机的数据分类预测Matlab程序DBO-LSSVM 多特征输入多类别输出 含基础程序

基于蜣螂优化最小二乘支持向量机的数据分类预测Matlab程序DBO-LSSVM 多特征输入多类别输出 含基础程序 文章目录 一、基本原理DBO&#xff08;Dung Beetle Optimization&#xff09;算法原理LSSVM&#xff08;Least Squares Support Vector Machine&#xff09;模型原理DBO-LSS…

C语言 | Leetcode C语言题解之第388题文件的最长绝对路径

题目&#xff1a; 题解&#xff1a; #define MAX(a, b) ((a) > (b) ? (a) : (b))int lengthLongestPath(char * input){int n strlen(input);int pos 0;int ans 0;int * level (int *)malloc(sizeof(int) * (n 1));memset(level, 0, sizeof(int) * (n 1));while (po…

iOS——Block与内存管理

需要内存管理的情况 1、对象类型的auto变量。 2、引用了 __block 修饰符的变量。 三种block类型 全局类型 &#xff08;NSGlobalBlock&#xff09; 如果一个block里面没有访问普通局部变量(也就是说block里面没有访问任何外部变量或者访问的是静态局部变量或者访问的是全局…

SpringBoot+Vue实现大文件上传(断点续传-后端控制(一))

SpringBootVue实现大文件上传&#xff08;断点续传&#xff09; 1 环境 SpringBoot 3.2.1&#xff0c;Vue 2&#xff0c;ElementUI&#xff0c;spark-md5 2 问题 在前一篇文章&#xff0c;我们写了通过在前端控制的断点续传&#xff0c;但是有两个问题&#xff0c;第一个问题&…

AUTOSAR Adaptive与智能汽车E/E架构发展趋势

AUTOSAR Adaptive是一个面向现代汽车应用需求的标准&#xff0c;特别适用于那些需要高计算能力和灵活性的应用。以下是AUTOSAR Adaptive的典型特性&#xff1a; 高计算能力&#xff1a;AUTOSAR Adaptive支持使用MPU&#xff08;微处理器&#xff09;&#xff0c;这些处理器的性…

嵌入式开发学习路线(25届校招学习) 嵌入式学习路线七年规划:从大一小白到校招大佬 (学习路线汇总)

嵌入式开发学习路线&#xff08;25届校招可以参考&#xff09; 嵌入式系统作为当前最热门且最有发展前途的IT应用领域之一&#xff0c;吸引了大量有志于从事该行业的学习者。为了系统地掌握嵌入式开发技能&#xff0c;以下是一条详细的学习路线&#xff0c;旨在帮助初学者逐步…

CodeSys中动态切换3D模型

文章目录 需求研究结果 需求 在前面的【CodeSys开发3d机械臂显示控件】中&#xff0c;我们已经实现了一个可以显示3d模型的控件。但是这个控件是和使用的3d模型绑定死的&#xff0c;在安装这个控件时就已经将模型文件于控件一起安装到codesys中。 假如我想在不同的工程中&…

智能家居系统(基于STM32F103C8T6标准库+FreeRTOS+Qt串口开发实现)

视频演示&#xff1a;基于STM32F103C8T6标准库FreeRTOSQt串口开发实现的智能家居项目_哔哩哔哩_bilibili 基于STM32F103C8T6标准库FreeRTOSQt串口开发实现的智能家居项目: https://pan.baidu.com/s/1f41gAfOOnlcQoKoMx3o84A?pwd6j2g 提取码: 6j2g 注&#xff1a;本项目为学习完…

Meta关闭Spark AR平台:未来规划与影响分析

Meta宣布将关闭其移动AR创作平台Spark AR&#xff0c;这一消息在业界引起了广泛关注。尽管Snap和TikTok在AR滤镜领域取得了巨大成功&#xff0c;但Meta却选择了另一条发展道路。本文将探讨这一决策背后的可能原因及其对未来的影响。 关闭Spark AR平台的背后 硬件为主&#xff…

计算机网络(三) —— 简单Udp网络程序

目录 一&#xff0c;初始化服务器 1.0 辅助文件 1.1 socket函数 1.2 填充sockaddr结构体 1.3 bind绑定函数 1.4 字符串IP和整数IP的转换 二&#xff0c;运行服务器 2.1 接收 2.2 处理 2.3 返回 三&#xff0c;客户端实现 3.1 UdpClient.cc 实现 3.2 Main.cc 实现 …

【Mysql】系统服务启动访问报错问题处理:this is incompatible with sql_mode=only_full_group_by

一、背景&#xff1a; 本来已经正常运行的平台&#xff0c;突然有一天由于对服务器进行部分操作迁移&#xff0c;发现jar可以正常启动&#xff0c;但是访问功能一直报错&#xff0c;监控后台日志后&#xff0c;发现了问题&#xff1a; 报错的具体信息如下&#xff1a; Caused…

Linux编译器--gcc/g++使用

目录 一、预编译指令 1.1预处理功能 1.2指令 1.3问题扩展 二、编译&#xff08;生成汇编&#xff09; 三、汇编&#xff08;生成二进制机器语言&#xff09; 四、链接&#xff08;生成可执行文件或库文件&#xff09; 4.1库文件 4.2目标文件和库的链接 4.3动态库和静态…

【Django-Minio-Storage 使用教程】

Django-Minio-Storage 使用教程 安装 Django-Minio-Storage配置 Django 项目官方文档 安装 Django-Minio-Storage 使用 pip 安装 Django-Minio-Storage pip install django-minio-storage配置 Django 项目 在 Django 项目的 settings.py 文件中进行以下配置 INSTALLED_APPS…

【mysql】mysql修改sql_mode之后无法启动

现象&#xff1a;修改后mysql无法启动&#xff0c;不报错 原因&#xff1a;MySQL在8以后sql_mode已经取消了NO_AUTO_CREATE_USER这个关键字。去掉这个关键字后&#xff0c;启动就可以了 修改前&#xff1a; sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR…

Bootstrap前端框架Glyphicons字体图标

115工具网收集提供Bootstrap前端框架Glyphicons字体图标库对照表​​​​​​​&#xff0c;Bootstrap前端UI,Glyphicons字体图标调用,Bootstrap按钮字体图标对照表,包括250多个来自Glyphicon Halflings的字体图标.项目中引用Bootstrap相关文件后即可直接调用下列图标class&quo…

Linux CentOS安装PySpark3.5(单机版)详细教程及机器学习实战

目录 一、安装须知 二、安装Spark 1、下载安装包 2、修改配置文件spark-env.sh 3、验证Spark是否安装成功 三、安装py4j 四、配置环境变量 五、基于PySpark的机器学习实战 1、将数据文件上传HDFS 2、创建代码文件 3、提交应用程序 一、安装须知 前置依赖&#xff1…