GD32F103RCT6/GD32F303RCT6(6.3)USART通讯实验

 本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发

向上代码兼容GD32F450ZGT6中使用

后续项目主要在下面该专栏中发布:

https://blog.csdn.net/qq_62316532/category_12608431.html?spm=1001.2014.3001.5482

感兴趣的点个关注收藏一下吧!

电机驱动开发可以跳转:

GD32F103RCT6/GD32F303RCT6-实战项目-无刷电机驱动(1)_gd32f103rct6例程-CSDN博客

BMS电源系统开发可以跳转:

暂未放链接

DCDC-双向BUCK-BOOST实战链接:

GD32实战篇-双向数控BUCK-BOOST-BUCK降压理论基础-CSDN博客

GD32实战篇-双向数控BUCK-BOOST-BOOST升压理论基础-CSDN博客

 向上代码兼容GD32F303RCT6中使用

本项目配套开发板:

       基于GD32F103RCT6国产GD32平台,以下教程编写基于该开发板

       图片:

36cefffacf6a474fb839d9cc380a4c25.jpeg

       原理图以及例程请联系客服获取!

注意:

       本教程致力于解决所有在调试中出现的所有问题,如有未包含在的问题,请联系QQ:2049363803,有奖更新文档!

目录

串口中断回显实验

串口处理函数:


  本小结为USART外设使用的实验章程,在此小结我们会带大家手把手写几个常见的程序

串口中断回显实验

       在本实验我们将会对串口的使用有一定了解。

需要按步骤进行以下操作:

       1.使能PA9和PA10对应的GPIOA时钟(对应串口的RX,TX)

       2.初始化GPIO,设置RX为下拉输入,TX为推挽输出,并且将PA9,PA10复用为USART0

       3.初始化USART0时钟

       4.配置USART参数

       5.配置中断优先级,使能串口接收中断

       6.使能串口

       7.编写中断服务函数

       在 GPIO 使用之前都需要对其进行初始化,并且进行相应配置,因为大部分的GPIO不单只有一个功能,所以需要对涉及到的引脚进行复用

       我们在本小结把串口的 Tx 引脚配置为复用推挽输出,Rx 引脚为下拉输入,数据完全由外部输入决定,没有信号的时候默认拉低。

/* 初始化GPIO时钟 */

rcu_periph_clock_enable(RCU_GPIOA);

gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); // TX-PA9-复用推挽输出-速度50MHz

gpio_init(GPIOA, GPIO_MODE_IPD, GPIO_OSPEED_50MHZ, GPIO_PIN_10); // RX-PA10-下拉输入-速度50MHz

/* 初始化USART时钟 */

rcu_periph_clock_enable(RCU_USART0); // 使能串口时钟

接下来配置USART的参数:

  • 波特率115200
  • 无校验位
  • 8位数据位
  • 1位停止位

usart_baudrate_set(USART0, 115200); // 波特率115200

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位停止位

/********************************************************************************************/

       在上一小结寄存器和库函数介绍中,我们介绍过硬件流的使用,在这里我们禁止硬件流使用,因为外面工作模式中只需要TX,RX两根线就行

       然而,这两句话,有和没有不会影响正常工作QAQ

usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE); // 硬件流控制RTS

usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE); // 硬件流控制CTS

/******************************************************************************************/

usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); // 使能串口发送

usart_receive_config(USART0, USART_RECEIVE_ENABLE); // 使能串口接收

usart_enable(USART0); // 使能串口

//这里对串口的中断优先级进行初始化,初始化优先级分为抢占优先级和子优先级

含义

抢占优先级

数字越小,优先级越高

子优先级

数字越小,优先级越高

nvic_irq_enable(USART0_IRQn, 0, 0); // 使能USART中断

usart_interrupt_enable(USART0, USART_INT_RBNE); // 使能串口接收中断

串口处理函数:

       我们在第四小结对串口的处理函数以及底层对应以及仔细讲解过,详细可以调回去看看。

       这里我们再贴一下:

       外部中断处理函数名称要与EXTI线相对应,不然就无法在中断发生时,进入到我们编写的处理函数中,具体的表可在 startup_gd32f10x_hd.s 启动文件中查看:

79b0080d78ab441a8e69cd7241012630.png

a8758d76762d48458d94101e69fec1d6.png

9e4b12d8de254fdd942b0d3f60a8c8d9.png

       这里我们使用的是USART0_IRQHandler该中断线

void USART0_IRQHandler(void)

{

       unsigned char receive_data;

    if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE) == SET)

   {

       receive_data = usart_data_receive(USART0);

       usart_data_transmit(USART0, (uint8_t)receive_data);

       while( usart_flag_get(USART0, USART_FLAG_TBE) == RESET );//发送完成判断

   }

}

  • 当我们使能了USART0对应的中断以后,当接收寄存器置位发生中断以后,就会找寻中断线USART0_IRQHandler函数,并且执行其中的中断处理函数内容。
  • 在读取到usart_interrupt_flag_get()函数的返回值后,判断该返回值状态,来查看是否真的产生串口数据接收中断,对应的是读取寄存器中对应的标志位是否置位
  • 如果真的产生了数据接收中断,则使用usart_data_receive();函数去读取接收的函数到我们先前指定的接收区域send_buf[send_data_long],该函数在usart.c中被定义,但是本章教程中以实验串口为主,所以定义了receive_data变量去读取。
  • 最后一步则是把上一步所读取到的数据通过串口发送函数usart_data_transmit();发送回串口调试助手,至此实验结束

        本实验现象:

e884906a22154d39b747b6e857da786c.png

        详细代码请查看源码

f2f529152eab49bf872cc237e7f95510.png

3d394081379a4bce92371263c3cc933f.png

       本实验相关外设代码在

eb3f6b8386d542c6a7bf7bd5492f99fc.png

877d015080d9463baa5b9997faffc44a.png

       在其中可以查看usart.c以及usart.h函数,从第三小结外部中断开始,我们封装外设为一个个函数存放在其对应的.c以及.h文件中。

       本小结也是一样,就不进行过多的封装阐述,详情可以查看前面的教程

       在前面我们已经完成了对USART的实验讲解和编程,在日常的使用中,串口将会作为我们调试和通讯的主要方式之一,所以我们不可避免的要经常去使用该外设,因此,从本节开始,我们将会对常用串口进行一次封装,以后在该封装基础上直接提取串口文件调用即可。

       打开原本的串口通讯实验,在此基础上复制贴贴。

5850f25097c5401fb6f8e2d531314478.png

       在usart.h文件中添加宏定义

1ec03e8f4ec04f9488f447b69fd189cb.png

       替换usart.c文件中原本的参数

fa59ae0ae5c64b3f825b8667e1cd04f4.png

       将该文件从外设文件夹HARDWARE中移出,放置到System系统文件夹中

08622a9ded8544b4a41f69dfd73ccacf.png

       重新打开编译器对文件位置进行同步更改

937e921af06b47e08faac59f51a6c92e.png

       重新包含该文件

89957f3e7426454ba615679560626995.png

       进行测试

1e6fb5e6d30c4852b8b954f2094e9fec.png

       完成!

5a860381ceda437b82ac0fbe2614dc04.png

       在源码中建立常用外设文件,后续方便调用并且不断丰富

群号:621154399

有问题欢迎大家加入我们一起交流,这个群是开源性技术交流群。

  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不及你的温柔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值