四、GD32 MCU 常见外设介绍(10)USART 模块介绍

  1. 通用同步异步收发器(USART) 提供了一个灵活方便的串行数据交换接口,数据帧可以通过全双工或半双工,同步或异步的方式进行传输。 USART提供了可编程的波特率发生器,能对UCLK(PCLK1或PCLK2) 进行分频产生USART发送和接收所需的特定频率。

  2. USART不仅支持标准的异步收发模式,还实现了一些其他类型的串行数据交换模式,如红外编码规范, SIR,智能卡协议, LIN, 半双工以及同步模式。它还支持多处理器通信和Modem流控操作(CTS/RTS)。数据帧支持从LSB或者MSB开始传输。数据位的极性和TX/RX引脚都可以灵活配置。部分USART支持DMA功能,以实现高速率的数据通信,支持情况根据不同芯片型号而定。

10.1.USART 基础知识

通信方式的分类:并行通信、串行通信

  1. 并行通信:是指数据的各位同时在多根数据线上发送或接收,如图所示。

并行通信的特点:控制简单,传输速度快;由于传输线多,适用于距离近传输。

  1. 串行通信:是数据的各位在同一根数据线上依次逐位发送或接收,如图所示

 

串行通信的特点:控制复杂,传输速度较慢;只需要一根线,适用于远距离传输。

串行通信方式的分类

在串行通信中,根据对数据流的分界、定时及同步方法不同,可以分为同步串行通信方式和异步串行通信方式。

  1. 同步串行通信方式:把许多字符组成一个信息组,或称为信息帧,每帧的开始用同步字符来指示。并且发送和接收的双方必须采用同一时钟,这样接收方就可以用时钟信号来确定每个信号 位。同步通信如图所示:

同步通信:发送端和接收端必须使用统一时钟,它是一种连续传送数据的通信方式,一次通信传送多个字符数据,称为一帧信息。帧格式如图所示:

同步串行通信帧:是将许多字符组成一个信息帧,这样字符可以一个接一个的传输,但是,在每帧信息的开始要加上同步字符,在没有信息要传输时,要填上空字符,因为同步传输不允许有间 隙。

同步串行通信特点:必须有同步时钟,传输信息量大,传输速率高,但是传输设备复杂,技术要求高。

  1. 异步串行通讯方式:是指通讯双方以一个字符(包括特定附加位)作为数据传输单位且发送方传送字符的间隔时间不一定,具有不规则数据段传送特性的串行数据传输。异步串行通信如图所示:

异步通信:是指发送和接收端使用各自的时钟,并且它是一种不连续传输的通信方式,一次通信只传一个字符数据,称为字符帧。字符帧之间的间隙可以是任意间隙。它的帧格式如图所示: 

异步串行通信帧:是将一个字节数据加上起始位、校验位、停止位,构成的字符帧。由于异步通信没有同步时钟,所以接收端要时刻处于接收状态。

起始位:在没有数据传送时即空闲状态,此时通信线上为逻辑“1”状态。当发送端要发送1个字符数据时,首先发送一个逻辑“0”信号,这个低电平就是帧格式的起始位。其作用就是告诉接收端开始发送一帧数据。接收端检测到这个低电平后,就准备接收数据信号。

数据位:在起始位之后,发送端发出的就是数据位,数据位的位数没有严格限制5~9位都行。低位在前,高位在后,由低位到高位逐位传送。USART一般是8位。

校验位:数据位发送完成之后,可发送一位用来检验数据在传送过程中是否出错的奇偶校验位。奇偶校验是收发双方预先约定好的有限差错检验方式之一。有时也可以无校验。

停止位:字符帧格式的最后部分是停止位,逻辑“1”电平有效,它可占1/2位、1位、1.5位或2位。停止位表示传送一帧信息的结束,也为发送下一帧信息做好准备。

异步串行通信特点:不需要时钟同步,通信实现简单,设备开销小。但是传输速率不高。

串行通信数据传送方向

根据串行数据的传输方向,我们可以将通信分为单工、半双工、全双工。

  1. 单工:是指数据传输仅能沿一个方向,不能实现反向传输。

  2. 半双工:是指数据传输可以沿两个方向,但需要分时进行传输。

  3. 全双工:是指数据可以同时进行双向传输。

串行通信数据的传输方向

10.2.GD32 USART 外设原理简介

GD32芯片具有多个USART外设用于串口通讯,它是 Universal Synchronous Asynchronous Receiver and Transmitter的缩写,即通用同步异步收发器可以灵活地与外部设备进行全双工数据 交换。有别于USART,它还有具有UART外设(Universal Asynchronous Receiver and Transmitter),它是在USART基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出。

因篇幅有限,本文无法详细介绍GD32所有系列USART外设接口,下面以GD32F30x为列,着重介绍下GD32F30x的USART外设简介和结构框图,后介绍下各个系列的差异。

GD32 USART 主要特性

◼ NRZ标准格式(Mark/Space)。

◼ 全双工异步通信。

◼ 可编程的波特率产生器:

– 由外设时钟分频产生,其中USART0由PCLK2分频得到,USART1/2和UART3/4由PCLK1分频得到;

– 16倍过采样;

– 当时钟频率为120M,过采样为16,最高速度可到7.5MBits/s。

◼ 完全可编程的串口特性:

– 偶校验位,奇校验位,无校验位的生成/检测;

– 数据位(8或9位);

– 产生0.5,1,1.5或者2个停止位。

◼ 发送器和接收器可分别使能。

◼ 支持硬件Modem流控操作(CTS/RTS)。

◼ DMA访问数据缓冲区。

◼ LIN断开帧的产生和检测。

◼ 支持红外数据协议(IrDA)。

◼ 同步传输模式以及为同步传输输出发送时钟。

◼ 支持兼容ISO7816-3的智能卡接口:

– 字节模式(T=0);

– 块模式(T=1);

– 直接和反向转换。

◼ 多处理器通信:

– 如果地址不匹配,则进入静默模式;

– 通过线路空闲检测或者地址掩码检测从静默模式唤醒。

◼ 多种状态标志:

– 传输检测标志:接收缓冲区不为空(RBNE),发送缓冲区为空(TBE),传输完成(TC),忙(BSY);

– 错误检测标志:过载错误(ORERR),噪声错误(NERR),帧格式错误(FERR),奇偶校验错误(PERR);

– 硬件流控操作标志:CTS变化(CTSF);

– LIN模式标志:LIN断开检测(LBDF);

– 多处理器通信模式标志:IDLE帧检测(IDLEF);

– 智能卡模式标志:块结束(EBF)和接收超时(RTF);

– 若相应的中断使能,这些事件发生将会触发中断。

USART0/1/2完全实现上述功能,但是UART3/4只实现了上面所介绍的部分功能,下面这些功能在UART3/4中没有实现:

◼ 智能卡模式;

◼ 同步模式;

◼ 硬件流操作(CTS/RTS);

◼ 设置数据极性。

USART 结构框图

 USART 功能引脚:

TX:发送数据输出引脚

SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部脚,没有具体的外部引脚。

RX:接收数据输入引脚

nRTS:请求以发送(Request To Send),n表示低电平有效。如果使能RTS流控制,当USART接收器准备好接收新数据时就会将nRTS变成低电平;当接收寄存器已满时,nRTS将被设置为高电平。该引脚只适用于硬件流控制。

nCTS:清除以发送(Clear To Send),n表示低电平有效。如果使能CTS流控制,发送器在发送下一帧数据之前会检测nCTS引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。

CK:发送器时钟输出引脚。这个引脚仅适用于同步模式。具体各系列USART引脚对应,可见相应的Datasheet。

波特率发生器:如图 0-36 USART结构框图的②所示,波特率分频系数是一个16位的数字,包含12位整数部分和4位小数部分。波特率发生器使用这两部分组合所得的数值来确定波特率。由于具有小数部分的波特率分频系数,将使USART能够产生所有标准波特率。

波特率分频系数(USARTDIV) 与系统时钟具有如下关系:

USART0的系统时钟为PCLK2,USART1/2和UART3/4的系统时钟为PCLK1。在使能USART之前,必须在时钟控制单元使能系统时钟。

控制器:如USART结构框图所示,USART有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。使用USART之前需要向USART_CTL0寄存器的UEN位置1使能USART。发送或者接收数据字长可选8位或9位,由USART_CTL0的WL位控制。

数据寄存器:如USART结构框图所示,USART数据寄存器(USART_DATA)只有低9位有效,并且第9位数据是否有效要取决于USART控制寄存器1(USART_CTL0)的WL位设置,当WL位为0时表示8位数据字长,当WL位为1表示9位数据字长,我们一般使用8位数据字长。USART_DATA包含了已发送的数据或者接收到的数据。USART_DATA实际是包含了两个寄存器,一个专门用于发送的可写TDATA,一个专门用于接收的可读RDATA。当进行发送操作时,往USART_DATA写入数据会自动存储在TDATA内;当进行读取操作时,向USART_DATA读取数据会自动提取RDATA数据。

TDATA和RDATA都是介于系统总线和移位寄存器之间。串行通信是一个位一个位传输的,发送时把TDATA内容转移到发送移位寄存器,然后把移位寄存器数据每一位发送出去,接收时把接收到的每一位顺序保存在接收移位寄存器内然后才转移到RDATA。

USART支持DMA传输,可以实现高速数据传输。

校验控制:GD32系列控制器USART支持奇偶校验。当使用校验位时,串口传输的长度将是8位的数据帧加上1位的校验位总共9位,此时USART_CTL0寄存器的WL位需要设置为1,即9数据位。将USART_CTL0寄存器的PCEN位置1就可以启动奇偶校验控制,奇偶校验由硬件自动完成。启动了奇偶校验控制之后,在发送数据帧时会自动添加校验位,接收数据时自动验证校验位。接收数据时如果出现奇偶校验位验证失败,会见USART_STAT0寄存器的PERR位置1,并可以产生奇偶校验中断。

使能了奇偶校验控制后,每个字符帧的格式将变成:起始位+数据帧+校验位+停止位。

中断控制:USART有多个中断请求事件,具体可见所示。

各系列 USART 功能差异 GD32系列MCU有关USART外设各系列功能差异如GD32各系列MCU USART外设功能差异表所示。

GD32 各系列 MCU USART 外设功能差异表

10.3.硬件连接说明

为利用USART实现开发板与电脑通信,需要用到一个USB转USART的IC,我们选择CH340G芯片来实现这个功能,CH340G是一个USB总线的转接芯片,实现USB转USART、USB转IrDA红外或者USB转打印机接口,我们使用其USB转USART功能。具体电路设计见下图USB转串口硬件设计。

我们将CH340G的TXD引脚与USART的RX引脚连接,CH340G的RXD引脚与USART的TX引脚连接。

5.10.4.软件配置说明

本小节讲解USART_Example历程中USART模块的配置说明,主要包括外设时钟配置、GPIO引脚 配置、USART外设配置、主函数介绍以及运行结果。本例程主要介绍GD32 MCU各系列USART 模块的轮询发送中断接收,有关USART其他功能例程可参考各系列固件库历程。 USART 外设配置

USART外设配置如代码清单USART例程USART外设配置所示。首先是对各项外设时钟初始化,接着初始化GPIO:GD32F10X、GD32F30X、GD32F20X、GD32E10X系列GPIO配置相同,PA9配置为复用推挽输出;PA10需配置为浮空输入。GD32F1X0、GD32F4XX、GD32F3X0、GD32E23X系列GPIO配置基本相同,不同在于PA9/PA10引脚的AF复用功能配置不同,在GD32F1X0、GD32F3X0和GD32E23X上,需要配置为AF1模式,在GD32F4XX上需要配置为AF7模式。然后配置USART接收中断优先级分组。最后配置USART初始化:GD32全系列MCU中USART外设配置基本相同,在本例程中,USART既可以发送可以接收,GD32标准库提供了USART各项初始化的函数接口,其初始化函数接口说明如USART函数说明列表所示。因USART使用了C函数的printf函数,所以重定向了printf到USART,还得在KEIL的魔术棒Target配置下打开” Use MicroLIB”。

代码清单 USART 例程 USART 外设配置

void usart_init(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_USART0);
#if defined GD32F10X_HD || GD32F30X_HD || GD32F20X_CL || GD32E10X
rcu_periph_clock_enable(RCU_AF);
/* connect port to USARTx_Tx */
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
/* connect port to USARTx_Rx */
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
nvic_irq_enable(USART0_IRQn, 2U, 0U);
#elif defined GD32F1X0 || GD32F4XX || GD32F3X0 || GD32E230
#if defined GD32F1X0 || GD32F3X0 || GD32E230
/* connect port to USARTx_Tx USARTx_Rx*/
gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9 | GPIO_PIN_10 );
#elif defined GD32F4XX
gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_9 | GPIO_PIN_10 );
#endif
#if defined GD32F1X0 || GD32F3X0 || GD32F4XX
nvic_irq_enable(USART0_IRQn, 2U, 0U);
#elif defined GD32E230
nvic_irq_enable(USART0_IRQn, 2U);
#endif
/* configure USART Tx as alternate function push-pull */
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_9);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
/* configure USART Rx as alternate function push-pull */
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
#endif
/* USART configure */
usart_deinit(USART0);
usart_baudrate_set(USART0, 115200U);
usart_word_length_set(USART0, USART_WL_8BIT);
usart_stop_bit_set(USART0, USART_STB_1BIT);
usart_parity_config(USART0, USART_PM_NONE);
usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);
usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);
usart_receive_config(USART0, USART_RECEIVE_ENABLE);
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
usart_enable(USART0);
}
/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{
 usart_data_transmit(USART0, (uint8_t)ch);
 while (RESET == usart_flag_get(USART0, USART_FLAG_TBE));
 return ch;
}

USART 函数说明列表

中断函数

中断函数如代码清单 USART 中断函数所示,GD32 所有函数中断接收函数相同:先检测 USART_INT_FLAG_RBNE 置 1 时,执行数据接收,当数据接收到设定的位数后,关闭 USART 接收中断。

void USART0_IRQHandler(void)
{
 if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){
 /* receive data */
 rxbuffer[rxcount++] = usart_data_receive(USART0);
 if(rxcount == rx_size){
 usart_interrupt_disable(USART0, USART_INT_RBNE);
 }
 }
}

主函数说明 主函数如代码清单USART例程主函数所示,该主函数主要分成三个部分,USART初始化、USART 轮询发送 buffer 、 开启中断接收 buffer 当 数 据 接 收 完 成 时 执 行 printf 打 印函数:printf("\n\rUSART receive successfully!\n\r");。

int main(void)
{
 usart_init();
printf("GD32 WELCOME");
while(txcount<tx_size)
{
while(RESET!=usart_flag_get(USART0,USART_FLAG_TBE)){
usart_data_transmit(USART0,txbuffer[txcount++]);
}
while(RESET==usart_flag_get(USART0,USART_FLAG_TC));
}
usart_interrupt_enable(USART0, USART_INT_RBNE);
/* wait until USART receive the receiver_buffer */
 while(rxcount < rx_size);
 if(rxcount == rx_size)
 printf("\n\rUSART receive successfully!\n\r");
 while(1)
{
}
}

运行结果 将USART_Example例程按照对应的芯片工程编译完成后,下载到对应芯片中,采用USB转USART连接电脑,使用串口助手,可查看MCU发送的结果,电脑发送数据MCU返回的结果。

具体可如下图USART运行结果所示。

10.5.USART 使用注意事项

(1) 使用 USART,收发都是 DMA 方式,由于接受数据帧长度不固定,可以采用 USART Receive timeout 标志作为 USART DMA 接收完成标志,采用 TC 作为 USART DMA 发送完成标志。

(2) USART 只要发送寄存器为空,就会一直有中断,因此,要是不发送数据时,在 USART中断处理函数中把发送中断关闭,只在开始发送时才打开;接收同理

更多GD32 MCU相关咨询:https://www.gd32bbs.com/ 

 

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值