【GD32】07 - UART串口通信

news2024/12/24 9:09:44

GD32F407中的UART

今天我用的型号是GD32F407,用其他型号的小伙伴在使用UART的时候注意一下自己手上板子的资源就行,我们使用固件库就算是不同型号其实也是没有什么太大差别的。

我们废话不多说,直接开始讲怎么使用UART。

首先我们先确定串口的TX和RX是哪些引脚。

我使用USART0,那么用到的引脚就是GPIOB的6和7号引脚。

那么我们要做的就是打开GPIOB的外设时钟;开启GPIO的引脚复用;设置GPIO的模式。

这边就不一一介绍这些函数了,因为之前的文章都有,并且也不是本文的重点。

    rcu_periph_clock_enable(RCU_GPIOB);
    gpio_af_set(GPIOB,GPIO_AF_7,GPIO_PIN_6|GPIO_PIN_7);
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_6|GPIO_PIN_7);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_6|GPIO_PIN_7);

接下来我们配置UART,首先也是要先打开对应的外设时钟。

    rcu_periph_clock_enable(RCU_USART0);

接下来是对串口设置。

复位串口,一般情况下我们在配置之前都调用一下,第一次配置的时候不调用也没关系。

usart_deinit(USART0); 

设置串口的波特率,理论上想设置啥值都可以,但是我们要考虑到通信对方,因此我们填入常用的波特率,如9600,115200等。

usart_baudrate_set(USART0,9600);

设置校验位,一般选择无校验。

usart_parity_config(USART0,USART_PM_NONE);

设置数据位长度,一般都是8bit。

usart_word_length_set(USART0,USART_WL_8BIT);

设置停止位,一般都是1bit。

usart_stop_bit_set(USART0,USART_STB_1BIT);

使能串口,直接调用不用传参。

usart_enable(USART0);

使能串口发送。

usart_transmit_config(USART0,USART_TRANSMIT_ENABLE);

使能串口接收。

usart_receive_config(USART0, USART_RECEIVE_ENABLE);

发送数据,注意这边参数的取值范围,发送数据的范围居然是0~0x1FF,类型是uint32_t。但是在实践的时候发现,类型还是uint16_t。可能是固件库版本不同的缘故。

因此我们使用的时候还是以uint16_t的为准。

接收数据用的函数在类型的问题上和上面发送数据是一样的。

当然了,光有上面的函数可收不到数据,我们需要开启接收中断。

我们要接收数据,那么就选择读数据缓冲区不为空的时候中断。

usart_interrupt_enable(USART0,USART_INT_RBNE);

除了用上面这个函数使能,我们还需要配置NVIC,就用下面这两行(中断优先级可以修改)。

nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);           //中断等级分组
nvic_irq_enable(USART0_IRQn,1,1);                           //设置串口中断等级

如果我们收到了数据,那么就会进入中断执行函数,我们可以在启动文件中寻找。

进入中断执行函数之后,我们需要做两个操作,一个是检测中断标志位,另一个是清除中断标志位。

void USART0_IRQHandler(void){
    if((RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE))){
        

        usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE);
    }
}

除了在接收数据需要读取清除标志位,我们发送数据同样需要。

我们注意到这个函数也可以或许到读数据缓冲区非空的标志位,差别就在于一个是中断中使用,而另一个(这个)是查询使用的。

void sendData(uint16_t data){
    while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
    usart_data_transmit(USART0,data);  
}

通过上面这些函数我们就可以使用GD32来收发数据了。

下面这个例子我配置了串口0,收到数据之后会将数据再发回去。

#include "board.h"

void sendData(uint16_t data){
    while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
    usart_data_transmit(USART0,data);  
}

void USART0_IRQHandler(void){
    if((RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE))){
        uint8_t data = (uint8_t)usart_data_receive(USART0);
        sendData(data);
        usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE);
    }
}

int main(void){
    board_init();
    
    rcu_periph_clock_enable(RCU_GPIOB);
    rcu_periph_clock_enable(RCU_USART0);
    
    gpio_af_set(GPIOB,GPIO_AF_7,GPIO_PIN_6|GPIO_PIN_7);
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_6|GPIO_PIN_7);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_6|GPIO_PIN_7);
    
    usart_deinit(USART0);                                       // 复位串口    
    usart_baudrate_set(USART0,9600);                            // 设置波特率    
    usart_parity_config(USART0,USART_PM_NONE);                  // 无校验    
    usart_word_length_set(USART0,USART_WL_8BIT);                // 8位数据位    
    usart_stop_bit_set(USART0,USART_STB_1BIT);                  // 1位停止位
    usart_enable(USART0);                                       // 使能串口
    usart_transmit_config(USART0,USART_TRANSMIT_ENABLE);        // 使能串口发送
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);         // 使能串口接收
    usart_interrupt_enable(USART0,USART_INT_RBNE);              //使能串口中断
    
    nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);           //中断等级分组
    nvic_irq_enable(USART0_IRQn,1,1);                           //设置串口中断等级
    
    while (1){
        delay_ms(1000);
    }
}

可以正常收发数据。

根据之前STM32串口的经验,我们可以将printf重定向到串口上,在STM32中我们直接重写fputc,然后在Keil的设置中勾选Use MicroLlB就行了,但是在GD32F407中勾选Use MicroLlB在编译后会有两个错误。

解决方案也不是没有,那就是我们不勾选Use MicroLlB了,我们除了重写fputc之外再加上一些代码即可。

#if !defined(__MICROLIB)
//不使用微库的话就需要添加下面的函数
#if (__ARMCLIB_VERSION <= 6000000)
//如果编译器是AC5  就定义下面这个结构体
struct __FILE
{
        int handle;
};
#endif

FILE __stdout;

//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
        x = x;
}
#endif

int fputc(int ch, FILE *f){
    sendData(ch);
    return ch;
}

接下来我们实验一下,在主循环里使用printf打印一句话(记得#include<stdio.h>)。

可以发现重写fputc之后可以直接使用printf了,这样子我们在调试程序的时候就可以把信息打印到串口助手上了。

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

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

相关文章

【面试干货】Static关键字的用法详解

【面试干货】Static关键字的用法详解 1、Static修饰内部类2、Static修饰方法3、Static修饰变量4、Static修饰代码块5、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java编程语言中&#xff0c;static是一个关键字&#xff0c;它可…

猫头虎博主全栈前沿AI技术领域矩阵社群

猫头虎博主全栈前沿AI技术领域矩阵社群 &#x1f44b;大家好&#xff0c;我是猫头虎&#xff01;今天我要向大家介绍一个非常重要的社群矩阵——专为全栈前沿AI技术领域的朋友们打造的各种技术交流和资源互助的社群。这些社群不仅能帮助大家快速提升技术水平&#xff0c;还能拓…

深度学习笔记: 最详尽解释混淆矩阵 Confusion Matrix

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; 混淆矩阵 假设我们有包含临床测量数据的医疗数据&#xff0c;例如胸痛、良好的血液循环、动脉阻塞和体重…

LeetCode 子集

原题链接78. 子集 - 力扣&#xff08;LeetCode&#xff09; 这是一道暴力搜索问题参考大佬们的题解&#xff0c;对这类题目做出一下总结 1.确定递归参数变量 2.递归结束条件 3.做出选择&#xff0c;递归调用进入下一层 4.回溯&#xff0c;返回到递归前的状态 要完成前面这…

Golang内存分配

Go内存分配语雀笔记整理 Golang内存模型设计理念思考核心代码阅读mspanmcachemcentral中心缓存mheap分配过程 Golang内存模型设计理念思考 golang内存分配基于TCmalloc模型&#xff0c;它核心在于&#xff1a;空间换时间&#xff0c;一次缓存&#xff0c;多次复用&#xff1b;…

重大丨深中通道今通车!继港珠澳大桥后,三思再度点亮世界工程

6月30日下午3时&#xff0c;国家重大工程深中通道正式通车试运营&#xff0c;向世界再次展示中国智慧和基建实力。已承接过包括港珠澳大桥海底隧道在内2500多条隧道照明工程的上海三思电子工程有限公司&#xff0c;为这座超级工程提供了LED隧道照明、东西人工岛照明及显示、管理…

HAP官方力作:MEGA项目管理应用正式上线

开发背景 自2024年3月起&#xff0c;明道云推出了MEGA系列应用&#xff0c;基于MEGA Industrial的经营业务&#xff0c;逐步拓展至企业价值链的各个环节&#xff08;MEGA Industrial Co 是明道云预设的一家虚拟公司&#xff0c;主要面向工业制造行业客户&#xff0c;提供产线规…

node_modules/@umijs/runtime“ does not exist in container.

近日&#xff0c;在做pro ant react 项目时&#xff0c;遇到了如下这样的错误&#xff0c;开始通过vs code 的通义灵码折腾了一阵子&#xff0c;后面在csdn上一搜索&#xff0c;马上就找到答案了&#xff0c;特记录一下&#xff0c;后面再遇到这样的问题也就有迹可循了。 参考…

强对抗的 SquidLoader 针对中国企业发起攻击

研究人员近期发现了一种高对抗强度的 Loader&#xff0c;其通过钓鱼邮件附件传递给受害者。根据恶意软件所具备的引诱和规避行为&#xff0c;研究人员将其命名为 SquidLoader。SquidLoader 最早在 2024 年 4 月下旬被发现&#xff0c;但研究人员认为其至少已经活跃了一个月以上…

AE射频电源维修PE-II 10K中频电源维修

AE CESAR射频电源维修 PEII-10K镀膜电源&#xff1b;射频电源RF-5S&#xff1b;RFG3000&#xff1b;RFG3001等系列维修。 主要服务于太阳能光伏、PVD镀膜&#xff0c;半导体薄膜、离子注入、刻蚀&#xff0c;平板显示&#xff0c;光盘、光电子LED等制造工艺以及科研院校、技术研…

YOLO在目标检测与视频轨迹追踪中的应用

YOLO在目标检测与视频轨迹追踪中的应用 引言 在计算机视觉领域&#xff0c;目标检测与视频轨迹追踪是两个至关重要的研究方向。随着深度学习技术的飞速发展&#xff0c;尤其是卷积神经网络&#xff08;CNN&#xff09;的广泛应用&#xff0c;目标检测与视频轨迹追踪的性能得到…

2024年广东省食品安全管理员考试精选练习题库

76.已具有主体资格的企业申请食品流通可&#xff0c;该企业的&#xff08;&#xff09;为可申请人。 A.投资者 B.经营负责人 C.本身 答案&#xff1a;C 77.食用亚硝酸盐的销售只面向&#xff08;&#xff09;。 A.食品生产加工行业 B.餐饮业 C.食品流通单位 答案&…

Rakis: 免费基于 P2P 的去中心化的大模型

是一个开源的&#xff0c;完全在浏览器中运行的去中心化 AI 推理网络&#xff0c;用户无需服务器&#xff0c;打开即可通过点对点网络使用 Llama-3、Mistral、Gemma-2b 等最新开源模型。 你可以通过右上角的 Scale Worker &#xff0c;下载好模型后挂机就能作为节点加入到这个…

SpringSecurity6 | 基于数据库实现登录认证

SpringSecurity6 | 基于数据库认证 ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringSecurity6 ✨特色专栏: MySQL学习 🥭本文内容: SpringSecurity6 | 基于数据库实现登…

基于机器学习的零售商品销售数据预测系统

1 项目介绍 1.1 研究目的和意义 在电子商务日益繁荣的今天&#xff0c;精准预测商品销售数据成为商家提升运营效率、优化库存管理以及制定营销策略的关键。为此&#xff0c;开发了一个基于深度学习的商品销售数据预测系统&#xff0c;该系统利用Python编程语言与Django框架&a…

数据结构与算法笔记:实战篇 - 剖析搜索引擎背后的经典数据结构和算法

概述 像百度、Google 这样的搜索引擎&#xff0c;在我们平时的工作、生活中&#xff0c;几乎天天用到。如果我们把搜索引擎也当做一个互联网产品的话&#xff0c;那它跟社交、电商这些类型的产品相比&#xff0c;有一个非常大的区别&#xff0c;那就是&#xff0c;它是一个技术…

内容分发网络(CDN)学习记录

目录 静态内容动态内容CDN工作原理CDN缓存 CDN关键技术1.内容路由功能2.内容分发技术&#xff1a;内容分发技术主要是PUSH和PULL3.内容存储技术4.内容管理技术 全局负载均衡基于DNS的GSLB基于HTTP重定向的GSLB基于IP欺骗的GSLB服务器群选择策略 静态内容 静态内容是不会因用户…

隐私计算实训营第二期第七课:XGB算法与SGB算法开发实践

隐私计算实训营第二期-第七课 第七课&#xff1a;XGB算法与SGB算法开发实践1 决策树模型1.1 决策树的训练和预测过程1.2 决策树的发展过程 2 GBDT模型2.1 Boosting核心思想2.2 GBDT原理 3 XGB模型3.1 XGB核心思想3.2 XGB优点 3 隐语纵向树模型3.1 数据纵向分割3.2 隐私保护的树…

学习笔记——动态路由——IS-IS中间系统到中间系统(背景)

一、IS-IS技术背景 1、前言 IS-IS最初是国际标准化组织ISO(the International Organization for Standardization)为它的无连接网络协议CLNP(ConnectionLess Network Protocol)设计的一种动态路由协议。 和OSPF一样&#xff0c;IS-IS也是一种基于链路状态并使用最短路径优先…

医疗器械FDA认证中,如何准备SBOM文件?

在医疗器械FDA认证过程中&#xff0c;准备SBOM&#xff08;软件物料清单&#xff09;文件是确保医疗器械软件部分符合FDA要求的关键步骤。以下是准备SBOM文件的清晰指南&#xff1a; 一、了解SBOM文件的目的和重要性 SBOM文件用于详细列出医疗器械所使用的所有软件组件、版本…