0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【GD32F470紫藤派开发板使用手册】第九讲 USART-printf打印实验

聚沃科技 2024-05-13 10:14 次阅读
wKgaomYwSqiAY_PQAAnl063z3JE116.png

9.1实验内容

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

9.2实验原理

9.2.1串口简介

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

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

9.2.2串口通信帧介绍

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

wKgZomZBdHiABIwiAAHgknaaCew303.png

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

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

wKgZomZBdIWACJN4AAGZCDszKEQ933.png

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

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

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

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

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

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

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

9.2.3串口波特率

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

现在重点介绍下GD32F470串口接收器的工作原理。GD32F470串口接收器支持16倍(默认)过采样和8倍过采样,16位过采样即发送方发送数据后,GD32470串口接受器会将每个bit采样16次,如果是8倍过采样,则采用8次。下图为16位过采样的示意图:

wKgZomZBdKmABArKAACktSKe6l0039.png

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

9.2.4GD32F470串口设置步骤

串口设置的一般步骤为:

  1. GPIO时钟开启、串口时钟开启
  2. GPIO设置,发送和接受都要设置为AF模式,且需要设置为正确的AF号
  3. 串口复位
  4. 串口参数配置,主要为波特率、数据位长度、校验位设置、停止位长度
  5. 依据是否需要使用中断或DMA进行中断配置或DMA配置
  6. 使能串口
  7. 编写中断处理函数

9.3硬件设计

紫藤派开发板的P1接口将USART0——PA9、PA10引出,读者可以通过P1口使用USART0:

wKgZomZBdSWAAhvxAADKvexuyl4120.png

9.4代码解析

9.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 configure */
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_PERIPH_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_PERIPH);
}
}

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);
}

9.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)
{
uint64_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标志位,并且将待发送的数据写到串口寄存器中。

9.4.3main函数实现

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

C
int main(void)
{
//延时和公共驱动部分初始化
driver_init();
//串口初始化,DMA模式开启
BOARD_UART.uart_mode_tx=MODE_DMA;
bsp_uart_init(&BOARD_UART);
bsp_led_init(&LED2);
//打开对应串口的中断
nvic_irq_enable(USART0_IRQn,2,0);
while(1)
{
//printg标准打印(轮训)
printf_log("\r\ndelay 1s \r\n");
delay_ms(1000);
bsp_led_toggle(&LED2);
printf_log("printf:system driver_tick is %lld \r\n",driver_tick);

//轮训方式打印
memset(uart_poll_buff,0,50);//清零buff
sprintf((char*)uart_poll_buff,"poll transmit:system driver_tick is %lld \r\n",driver_tick);//格式化字符串
driver_uart_poll_transmit(&BOARD_UART,uart_poll_buff,strlen((const char*)uart_poll_buff));
bsp_lcd_printf("%s",uart_poll_buff);


//中断方式打印
memset(uart_int_buff,0,50);
sprintf((char*)uart_int_buff,"int transmit:system driver_tick is %lld \r\n",driver_tick);
driver_uart_int_transmit(&BOARD_UART,uart_int_buff,strlen((const char*)uart_int_buff));
bsp_lcd_printf("%s",uart_poll_buff);


//DMA方式打印
memset(uart_dma_buff,0,50);
sprintf((char*)uart_dma_buff,"dma transmit:system driver_tick is %lld \r\n",driver_tick);
driver_uart_dma_transmit(&BOARD_UART,uart_dma_buff,strlen((const char*)uart_dma_buff));
bsp_lcd_printf("%s",uart_poll_buff);

}
}

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

本例程也同步做了printf打印在LCD屏幕的功能,将LCD屏接在紫藤派开发板上后,打印信息将同步在显示屏上显示。

9.5实验结果

使用USB转TTL串口的连接线后,配置好串口调试助手,即可看到每秒钟串口打印的数据了。

教程GD32 MCU方案商聚沃科技原创发布,了解更多GD32 MCU教程,关注聚沃科技官网

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6036

    文章

    44555

    浏览量

    635056
  • 开发板
    +关注

    关注

    25

    文章

    5046

    浏览量

    97426
  • USART
    +关注

    关注

    1

    文章

    195

    浏览量

    30849
  • GD32
    +关注

    关注

    7

    文章

    403

    浏览量

    24346
收藏 人收藏

    评论

    相关推荐

    GD32F470紫藤开发板使用手册】第十一讲 SPI-SPI NOR FLASH读写实验

    通过本实验主要学习以下内容: •SPI简介 •GD32F470 SPI简介 •SPI NOR FLASH——GD25Q32ESIGR简介 •使用GD32F470 SPI接口实现对
    的头像 发表于 05-17 09:57 1789次阅读
    【<b class='flag-5'>GD32F470</b><b class='flag-5'>紫藤</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第十一讲 SPI-SPI NOR FLASH读写<b class='flag-5'>实验</b>

    【星空GD32F303开发板试用体验】开箱+环境搭建

    完全,APM32F0xx_SDK解包,到星空GD32F303开发板\03 例程\Project\04_USART_printf\MDK-A
    发表于 11-02 15:36

    GD32-Colibri-F207实验printf

    GD32-Colibri-F207实验printf,很好的GD32资料,快来学习吧。
    发表于 04-21 17:55 15次下载

    YL-51开发板使用手册

    YL-51开发板使用手册,YL-51开发板使用手册YL-51开发板使用手册YL-51
    发表于 05-10 16:31 21次下载

    开发板烧写测试使用手册

    开发板烧写测试使用手册,有需要的下来看看
    发表于 06-03 14:30 0次下载

    51开发板使用手册

    51开发板使用手册,感兴趣的小伙伴们可以瞧一瞧。
    发表于 11-23 15:45 11次下载

    KC705开发板英文使用手册

    KC705开发板英文使用手册
    发表于 11-01 10:19 5次下载

    iTOP-3399开发板使用手册大更新

    iTOP-3399开发板使用手册大更新
    的头像 发表于 12-10 15:46 1367次阅读
    iTOP-3399<b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>大更新

    APT32F102 开发板使用手册

    电子发烧友网站提供《APT32F102 开发板使用手册.pdf》资料免费下载
    发表于 04-16 09:07 0次下载

    GD32F470紫藤开发板使用手册】第二 GPIO-按键查询实验

    通过本实验主要学习以下内容: GPIO输入功能原理; 按键查询输入检测原理;
    的头像 发表于 04-30 11:39 709次阅读
    【<b class='flag-5'>GD32F470</b><b class='flag-5'>紫藤</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第二<b class='flag-5'>讲</b> GPIO-按键查询<b class='flag-5'>实验</b>

    GD32F470紫藤开发板使用手册】第五 PMU-低功耗实验

    通过本实验主要学习以下内容: PMU原理; 低功耗的进入以及退出操作
    的头像 发表于 05-07 09:29 681次阅读
    【<b class='flag-5'>GD32F470</b><b class='flag-5'>紫藤</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第五<b class='flag-5'>讲</b>  PMU-低功耗<b class='flag-5'>实验</b>

    GD32F470紫藤开发板使用手册】第八 ADC-规则组多通道采样实验

    通过本实验主要学习以下内容: •ADC的简介 •GD32F470 ADC工作原理 •DMA原理 •规则组多通道循环采样
    的头像 发表于 05-12 10:00 767次阅读
    【<b class='flag-5'>GD32F470</b><b class='flag-5'>紫藤</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第八<b class='flag-5'>讲</b> ADC-规则组多通道采样<b class='flag-5'>实验</b>

    GD32H757Z海棠开发板使用手册第九 USART-printf打印实验

    通过本实验主要学习以下内容: •串口简介 •GD32H757串口工作原理 •使用printf打印信息
    的头像 发表于 05-15 11:39 720次阅读
    【<b class='flag-5'>GD</b>32H757Z海棠<b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】<b class='flag-5'>第九</b><b class='flag-5'>讲</b> <b class='flag-5'>USART-printf</b><b class='flag-5'>打印</b><b class='flag-5'>实验</b>

    GD32F470紫藤开发板使用手册】第十三讲 USB_虚拟键盘实验

    通过本实验主要学习以下内容: •USB协议基本原理 •GD32F4xx USBFS的使用 •虚拟键盘的协议原理及使用
    的头像 发表于 05-19 09:59 1137次阅读
    【<b class='flag-5'>GD32F470</b><b class='flag-5'>紫藤</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第十三讲 USB_虚拟键盘<b class='flag-5'>实验</b>

    GD32F303红枫开发板使用手册】第二十 SPI-SPI NAND FLASH读写实验

    通过本实验主要学习以下内容: •SPI通信协议,参考19.2.1东方红开发板使用手册GD32F303 SPI操作方式,参考19.2.2东方红
    的头像 发表于 06-20 09:50 901次阅读
    【<b class='flag-5'>GD32F</b>303红枫<b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第二十<b class='flag-5'>讲</b> SPI-SPI NAND FLASH读写<b class='flag-5'>实验</b>