本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发
向上代码兼容GD32F450ZGT6中使用
后续项目主要在下面该专栏中发布:
https://blog.youkuaiyun.com/qq_62316532/category_12608431.html?spm=1001.2014.3001.5482
感兴趣的点个关注收藏一下吧!
电机驱动开发可以跳转:
GD32F103RCT6/GD32F303RCT6-实战项目-无刷电机驱动(1)_gd32f103rct6例程-优快云博客
BMS电源系统开发可以跳转:
暂未放链接
DCDC-双向BUCK-BOOST实战链接:
向上代码兼容GD32F303RCT6中使用
本项目配套开发板:
基于GD32F103RCT6国产GD32平台,以下教程编写基于该开发板
图片:
原理图以及例程请联系客服获取!
注意:
本教程致力于解决所有在调试中出现的所有问题,如有未包含在的问题,请联系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 启动文件中查看:
这里我们使用的是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();发送回串口调试助手,至此实验结束
本实验现象:
详细代码请查看源码
本实验相关外设代码在
在其中可以查看usart.c以及usart.h函数,从第三小结外部中断开始,我们封装外设为一个个函数存放在其对应的.c以及.h文件中。
本小结也是一样,就不进行过多的封装阐述,详情可以查看前面的教程
在前面我们已经完成了对USART的实验讲解和编程,在日常的使用中,串口将会作为我们调试和通讯的主要方式之一,所以我们不可避免的要经常去使用该外设,因此,从本节开始,我们将会对常用串口进行一次封装,以后在该封装基础上直接提取串口文件调用即可。
打开原本的串口通讯实验,在此基础上复制贴贴。
在usart.h文件中添加宏定义
替换usart.c文件中原本的参数
将该文件从外设文件夹HARDWARE中移出,放置到System系统文件夹中
重新打开编译器对文件位置进行同步更改
重新包含该文件
进行测试
完成!
在源码中建立常用外设文件,后续方便调用并且不断丰富
群号:621154399
有问题欢迎大家加入我们一起交流,这个群是开源性技术交流群。