【GD32F303红枫派使用手册】第十五节 USART-printf打印实验

2024-06-14 10:44

本文主要是介绍【GD32F303红枫派使用手册】第十五节 USART-printf打印实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

15.1 实验内容

通过本实验主要学习以下内容:

  • 串口简介
  • GD32F303串口工作原理
  • 使用printf打印信息

15.2 实验原理

15.2.1 串口简介

串口,从广义上看,指所有串行通信接口,比如RS232、RS422、RS485、SPI、IIC等。串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的通讯方式。和串行通讯相对应的是并行通讯,并行通信指一个传输接口可以传输8个bit即一个byte(有时甚至更多),虽然串行通信比并行通信慢,但是串口可以在仅仅使用两根线的情况下就能实现数据的传输。

对于GD32F303来说,串口一般特指USART(通用同步异步收发器  )和UART(通用异步收发器  )。USART/UART提供了一个灵活方便的串行数据交换接口,数据帧可以通过全双工或半双工,同步或异步的方式进行传输。红枫派开发板搭载的GD32F303ZET6总共拥有5个串口,(USART+UART) 对于一般应用来说足够使用了。

15.2.2 串口通信帧介绍

GD32F303的串口通信只需要3条线组成,分别为TX(发送线)、RX(接收线)和GND,对于两个通信结点,TX和RX需要交叉连接,如下示例:、

下面来介绍下串口数据帧组成。

以下为一个标准的串口通信帧:

一个串口帧由空闲、起始位、数据位、校验位以及停止位组成,传输的数据地位在前,高位再后。

空闲:串口TX或RX数据线上没有传输任何数据时,则该线处于为空闲状态。空闲是TX和RX都是处于高电平。

 起始位:占一个bit时间,标志数据起始,由一个逻辑0(低电平)的数据位表示。当发送方开始发送一帧数据时,起始位会最先发送,而对于接收方来说,检测到起始位后,即使自己的接收时钟与发送方的数据同步。

数据位:数据位紧跟在起始位之后,是通信中的真正有效信息。数据位的位数可以由通信双方共同约定,对于GD32F303来说,数据位一般只有8位。

校验位:校验位占一bit时间,GD32F303可以设置校验位为:奇校验、偶校验或无校验。校验位是为了保证通信的可靠性,如果是奇校验,需要保证传输的数据总共有奇数个逻辑高位,如果是偶校验,需要保证传输的数据总共有偶数个逻辑高位。以传输传输数据A:0x01000001为例,如果设置了奇校验,则需要在校验位传输“1”,如果是偶检验,则传输“0”。奇偶校验是由硬件处理的,当设置好校验位后,硬件会自动根据需要传输的数据自动插入校验位。

注意:GD32F303的数据位可设置为8bit和9bit两种方式,当设置了奇校验或偶校验,一定要将数据位设置为9bit;而设置了无校验时,需要将数据位设置为8bit。

停止位:它是一帧数据的结束标志,可以是1bit、1.5bit、2bit个逻辑“1”。

15.2.3 串口波特率

波特率是串口通信中一个非常重要的参数,串口通信传输双方必须要设置一样的串口波特率,否则通讯就会出错。波特率可以认为是比特率,即每秒传输的位数。一般波特率可以是9600、19200、115200等等,如果设置波特率为9600,设置通信帧为1bit起始位+8bit数据帧+无校验+1bit停止位,那么每秒钟最多可以传输9600bit/10bit = 960个字节。

现在重点介绍下GD32F303串口接收器的工作原理。GD32F303串口接收器采用的是16倍过采样,即发送方发送数据后,GD32F303串口接受器都会将每个bit采样16次:

在默认情况下,接收器通过获取三个采样点的值来估计该位的值。如果在3个采样点中有2个或3个为0,该数据位被视为0,否则为1。如果3个采样点中有一个采样点的值与其他两个不同,不管是起始位,数据位,奇偶校验位或者停止位,都将产生噪声错误(NERR)。

15.2.4 GD32F303串口设置步骤

串口设置的一般步骤为:

  1. GPIO时钟开启、串口时钟开启
  1. GPIO设置,一般发送IO需要设置为AF模式,接受IO设置为in-floating模式
  1. 串口复位
  1. 串口参数配置,主要为波特率、数据位长度、校验位设置、停止位长度
  1. 依据是否需要使用中断或DMA进行中断配置或DMA配置
  1. 使能串口
  1. 编写中断处理函数

15.3 硬件设计

红枫派开发板设计了一个USB转UART功能,通过USB TypeC线将电脑和开发板连接起来,就可以进行电脑和开发板之间的串口通讯了。

15.4 代码解析

15.4.1 在driver_uart.c中定义了串口初始化函数driver_uart_init。

C
void driver_uart_init(typdef_uart_struct *uartx)
{rcu_periph_clock_enable(uartx->rcu_uart_x);usart_deinit(uartx->uart_x);driver_gpio_general_init(uartx->uart_rx_gpio);driver_gpio_general_init(uartx->uart_tx_gpio);        if(uartx->uart_mode_rx==MODE_DMA){if(uartx->uart_rx_dma!=NULL){driver_dma_com_init(uartx->uart_rx_dma,(uint32_t)&USART_DATA(uartx->uart_x),NULL,DMA_Width_8BIT,DMA_PERIPHERAL_TO_MEMORY);usart_interrupt_enable(uartx->uart_x,USART_INT_IDLE);}}if(uartx->uart_mode_tx==MODE_DMA){    if(uartx->uart_tx_dma!=NULL){driver_dma_com_init(uartx->uart_tx_dma,(uint32_t)&USART_DATA(uartx->uart_x),NULL,DMA_Width_8BIT,DMA_MEMORY_TO_PERIPHERAL);}}usart_baudrate_set(uartx->uart_x, uartx->baudrate);usart_receive_config(uartx->uart_x, USART_RECEIVE_ENABLE);usart_transmit_config(uartx->uart_x, USART_TRANSMIT_ENABLE);usart_word_length_set(uartx->uart_x, uartx->data_length);usart_parity_config(uartx->uart_x, uartx->parity);usart_enable(uartx->uart_x);        
}

15.4.2 重定向函数int fputc(int ch, FILE *f)

要使用Printf,重定向函数fputc 是必须的。在C 语言标准库中,fputc 函数是printf 函数内部的一个函数,功能是将字符ch 写入到文件指针file所指向文件的当前写指针位置,简单理解就是把字符写入到特定文件中。我们使用USART 函数重新修改fputc 函数内容,达到类似“写入”的功能。

fputc定义在bsp_uart.c中

C
int fputc(int ch, FILE *f)
{   driver_uart_transmit_byte(&BOARD_UART,(uint8_t)ch);    return ch;
}

 这个函数比较简单,就是调用了接口driver_uart_transmit_byte,该接口定义在driver_uart.c中:

C
Drv_Err driver_uart_transmit_byte(typdef_uart_struct *uartx,uint8_t data)
{uint32_t timeout = driver_tick;    while(uartx->uart_control.Com_Flag.Bits.SendState==1){if((timeout+UART_TIMEOUT_MS) <= driver_tick) {              uartx->uart_control.Com_Flag.Bits.SendState=0;return DRV_ERROR;        } }Drv_Err uart_state=DRV_SUCCESS;    uartx->uart_control.Com_Flag.Bits.SendSucess=0;uartx->uart_control.Com_Flag.Bits.SendState=1;        uart_state=driver_uart_flag_wait_timeout(uartx,USART_FLAG_TBE,SET);usart_data_transmit(uartx->uart_x,data);    uartx->uart_control.Com_Flag.Bits.SendSucess=1;uartx->uart_control.Com_Flag.Bits.SendState=0;     return uart_state;          
}

 这段代码作用是,循环去读串口的TBE标志位,并且将待发送的数据写到串口寄存器中。

15.4.3 main函数实现

串口初始化完成并定义好fputc重定向函数后,就可以通过printf函数往电脑上打印数据了。以下main函数:

C
int main(void)
{delay_init();  bsp_uart_init(&BOARD_UART);bsp_led_init(&LED0);       while(1){delay_ms(1000);bsp_led_toggle(&LED0);      printf("printf:system driver_tick is %lld \r\n",driver_tick);}
}

本例程main函数首先进行了延时函数初始化,再配置开发板上的USB串口,并设置了一个LED灯用来提示代码运行。while(1)循环中先延时1s,再翻转一次LED状态,接着使用printf函数打印系统运行tick时间。

15.5 实验结果

使用USB-TypeC线,连接电脑和板上USB to UART口后,配置好串口调试助手,即可看到每秒钟串口打印的数据了。

由聚沃科技原创,来源于【红枫派开发板】第十五讲 USART-printf打印实验 - 苏州聚沃电子科技有限公司 (gd32bbs.com)

这篇关于【GD32F303红枫派使用手册】第十五节 USART-printf打印实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1060180

相关文章

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

多数据源的事务处理总是打印很多无用的log日志

之前做了一个项目,需要用到多数据源以及事务处理,在使用事务处理,服务器总是打印很多关于事务处理的log日志(com.atomikos.logging.Slf4jLogger),但是我们根本不会用到这些log日志,反而使得查询一些有用的log日志变得困难。那要如何屏蔽这些log日志呢? 之前的项目是提高项目打印log日志的级别,后来觉得这样治标不治本。 现在有一个更好的方法: 我使用的是log

Docker Compose使用手册

Docker Compose是一个比较简单的docker容器的编配工具,以前的名称叫Fig,由Orchard团队开发的开源Docker编配工具,在2014年被Docker公司收购,Docker Compose是使用Python语言开发的一款docker编配工具。使用Docker Compose,可以用一个yml文件定义一组要启动的容器,以及容器运行时的属性。Docker Compose称这些容器为

fastreport打印trichedit分页问题的解决

用fastreport来打印richedit里面的内容。刚开始放一个frxrichview组件到报表上,然后在 var str: TMemoryStream; begin    begin      str:= TMemoryStream.Create;      CurrRichRecord.richedit.Lines.SaveToStream(str);      str.Posit

模具要不要建设3D打印中心

随着3D打印技术的日益成熟与广泛应用,模具企业迎来了自建3D打印中心的热潮。这一举措不仅为企业带来了前所未有的发展机遇,同时也伴随着一系列需要克服的挑战,如何看待企业引进增材制造,小编为您全面分析。 机遇篇: 加速产品创新:3D打印技术如同一把钥匙,为模具企业解锁了快速迭代产品设计的可能。企业能够迅速将创意转化为实体模型,缩短产品从设计到市场的周期,抢占市场先机。 强化定制化服务:面

61.以太网数据回环实验(4)以太网数据收发器发送模块

(1)状态转移图: (2)IP数据包格式: (3)UDP数据包格式: (4)以太网发送模块代码: module udp_tx(input wire gmii_txc ,input wire reset_n ,input wire tx_start_en , //以太网开始发送信

Java项目中,配置打印 JDBC 日志的几种方法

在 IDEA 项目中,如果你想打印 JDBC 日志,可以通过配置日志框架(如 Logback 或 Log4j)来实现。Spring Boot 使用的默认日志框架是 Logback,你可以通过在 application.yml 文件中配置日志级别来打印 JDBC 日志。 方法 1: 使用 application.yml 配置 JDBC 日志 logging:level:# 显示 SQL 语句co

LTspice模拟CCM和DCM模式的BUCK电路实验及参数计算

关于BUCK电路的原理可以参考硬件工程师炼成之路写的《 手撕Buck!Buck公式推导过程》.实验内容是将12V~5V的Buck电路仿真,要求纹波电压小于15mv. CCM和DCM的区别: CCM:在一个开关周期内,电感电流从不会到0. DCM:在开关周期内,电感电流总会到0. CCM模式Buck电路仿真: 在用LTspice模拟CCM电路时,MOS管驱动信号频率为100Khz,负载为10R(可自