本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发
后续项目主要在下面该专栏中发布:
感兴趣的点个关注收藏一下吧!
电机驱动开发可以跳转:
手把手教你嵌入式国产化-实战项目-无刷电机驱动(1)-CSDN博客
BMS电源系统开发可以跳转:暂未放链接
向上代码兼容GD32F303RCT6中使用
本项目配套开发板:
基于GD32F103RCT6国产GD32平台,以下教程编写基于该开发板
图片:
原理图以及例程请联系客服获取!
注意:
本教程致力于解决所有在调试中出现的所有问题,如有未包含在的问题,请联系QQ:2049363803,有奖更新文档!
USART介绍
USART是通用异步收发传输器(UniversalAsynchronousReceiver/Transmitter),通常称作UART,是一种异步收发传输器,是设备间进行异步通信的关键模块。UART负责处理数据总线和串行口之间的串/并、并/串转换,并规定了帧格式;通信双方只要采用相同的帧格式和波特率,就能在未共享时钟信号的情况下,仅用两根信号线(Rx和Tx)就可以完成通信过程,因此也称为异步串行通信。
- 全双工异步通信。
- 小数波特率发生器系统,提供精确的波特率。
- 可配置的16倍过采样或8倍过采样,因而为速度容差与时钟容差的灵活配置提供了可能。
- 可编程的数据字长度(8位或者9位);
- 可配置的停止位(支持1或者2位停止位);
- 可配置的使用DMA多缓冲器通信。
- 单独的发送器和接收器使能位。
- 检测标志:① 接受缓冲器 ②发送缓冲器空 ③传输结束标志
- 多个带标志的中断源。触发中断。
- 其他:校验控制,四个错误检测标志。
引脚分布
其中USART0由PCLK2分频得到,USART1/2和UART3/4由PCLK1分频得到;
总线 | APB2总线 | APB1总线 | APB1总线 | APB1总线 | APB1总线 |
引脚 | USART0 | USART1 | USART2 | USART3 | USART4 |
TX | PA9(重映射PB6) | PA2(重映射PD5) | PB10(重映射PC10) | PC10 | PC12 |
RX | PA10(重映射PB7) | PA3(重映射PD6) | PB11(重映射PC11) | PC11 | PD2 |
SCLK | PA8 | PA4(重映射PD7) | PB12(重映射PC12) | 无 | 无 |
CTS | PA11 | PA0(重映射PD3) | PB13 | 无 | 无 |
RTS | PA12 | PA1(重映射PD4) | PB14 | 无 | 无 |
USART不仅支持标准的异步收发模式,还实现了一些其他类型的串行数据交换模式,如红外编
码规范,SIR,智能卡协议,LIN,半双工以及同步模式。它还支持多处理器通信和Modem流控
操作(CTS/RTS)。
USART支持DMA功能,以实现高速率的数据通信,除了UART4。
我们平常大部分时候只会用到全双工异步通信,所以后文的介绍主要以该模式为主。
USART0/1/2完全实现上述功能,但是UART3/4只实现了上面所介绍功能的部分,下面这些功
能在UART3/4中没有实现,所以没有 SCLK、CTS 和 RTS 功能引脚:
智能卡模式;
同步模式;
硬件流操作(CTS/RTS)。
USART传输模型
帧结构
串口异步通信需要定义的参数
① 起始位
② 数据位(8位或者9位)
③ 奇偶校验位(第9位)
④ 停止位(1,15,2位)
⑤ 波特率设置
带奇偶校验的数据为就是9位
波特率
由于异步通信中没有时钟信号,所以接收双方要约定好波特率,即每秒传输的码元个数,以便对信号进行解码,常见的波特率有4800、9600、115200等。GD32中波特率的设置通过串口初始化结构体来实现。
全双工异步通信
通用同步异步收发器(USART)提供了一个灵活方便的串行数据交换接口,数据帧可以通过全
双工或半双工,同步或异步的方式进行传输。USART提供了可编程的波特率发生器,能对UCLK
进行分频产生USART发送和接收所需的特定频率。
USART接口对外引出了五个引脚,但是对于全双工异步通信来说,使用到的引脚主要是RX以及TX。
为了方便理解工作模式,这里放出手册中的模块内部框图:
看起来很复杂?但是其实我们在该工作模式下,以串口接收线和串口发送线为主。
串口发送
- 1. 在USART_CTL0寄存器中置位UEN位,使能USART;
- 2. 通过USART_CTL0寄存器的WL设置字长;
- 3. 在USART_CTL1寄存器中写STB[1:0]位来设置停止位的长度;
- 4. 如果选择了多级缓存通信方式,应该在USART_CTL2寄存器中使能DMA(DENT位);
- 5. 在USART_BAUD寄存器中设置波特率;
- 6. 在USART_CTL0寄存器中设置TEN位;
- 7. 等待TBE置位;
- 8. 向USART_DATA寄存器写数据;
- 9. 若DMA未使能,每发送一个字节都需重复步骤7-8;
- 10. 等待TC=1,发送完成。
这里详细请参考gd32的用户使用手册有详细的使用介绍
手册P413页
串口接收
上电后,USART接收器使能按以下步骤进行:
- 1. 在USART_CTL0寄存器中置位UEN位,使能USART;
- 2. 写USART_CTL0寄存器的WL去设置字长;
- 3. 在USART_CTL1寄存器中写STB[1:0]位来设置停止位的长度;
- 4. 如果选择了多级缓存通信方式,应该在USART_CTL2寄存器中使能DMA(DENR位);
- 5. 在USART_BAUD寄存器中设置波特率;
- 6. 在USART_CTL0中设置REN位。
这里详细请参考gd32的用户使用手册有详细的使用介绍
手册P414页
DMA 方式访问数据缓冲区
为减轻处理器的负担,可以采用DMA访问发送缓冲区或者接收缓冲区。置位USART_CTL2寄
存器中DENT位可以使能DMA发送,置位USART_CTL2寄存器中DENR位可以使能DMA接收。
DMA数据发送:
DMA数据接收:
当USART接收到的数据数量达到了DMA传输数据数量,DMA模块将产生传输完成中断。
手册P416页
寄存器讲解:
接下来对串口使用到的寄存器进行介绍
寄存器基地址:
USART0 基地址:0x4001 3800
USART1 基地址:0x4000 4400
USART2 基地址:0x4000 4800
UART3 基地址:0x4000 4C00
UART4 基地址:0x4000 5000
状态寄存器(USART_STAT)
地址偏移:0x00
复位值:0x0000 00C0
该寄存器只能按字(32位)访问。
数据寄存器(USART_DATA)
地址偏移:0x04
复位值:未定义
该寄存器只能按字(32位)访问。
波特率寄存器(USART_BAUD)
地址偏移:0x08
复位值:0x0000 0000
使能USART(UEN=1)时,不能写该寄存器。
该寄存器只能按字(32位)访问。
接下来三个控制寄存器涉及内容较多,将会贴出常用部分,不常用部分请自行查阅手册!
控制寄存器 0(USART_CTL0)
地址偏移:0x0C
复位值:0x0000 0000
该寄存器只能按字(32位)访问。
控制寄存器 1(USART_CTL1)
地址偏移:0x10
复位值:0x0000 0000
该寄存器只能按字(32位)访问。
控制寄存器 2(USART_CTL2)
地址偏移:0x14
复位值:0x0000 0000
该寄存器只能按字(32位)访问。
群号:621154399
有问题欢迎大家加入我们一起交流,这个群是开源性技术交流群。