GD32F303固件库开发(8)----USART收发配置

发布者:RadiantSerenity最新更新时间:2024-11-19 来源: elecfans关键字:GD32F303  固件库开发  USART  收发配置 手机看文章 扫描二维码
随时随地手机看文章

概述

本章主要配置printf进行打印。 查阅手册可以得知,PA9、PA10为串口0的输出和输入口。

在这里插入图片描述

样品申请

https://www.wjx.top/vm/wFGhGPF.aspx#

硬件准备

这里准备了1块开发板进行验证,分别是GD32303C_START开发板。

在这里插入图片描述

keil配置

microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。

在这里插入图片描述

串口初始化

对串口进行配置。 使用串口时候,需要对GPIO进行复用这里把串口的 Tx 引脚配置为复用推挽输出,Rx 引脚为浮空输入。 设置USART0 通信参数为:波特率 115200,字长为 8,1 个停止位,没有校验位,收发一体工作模式,然后调用 USART 初始化函数完成配置。


/* 使能GPI0A,用PA9、PA10为串口 */

    rcu_periph_clock_enable(RCU_GPIOA);


    /*使能串口0的时钟 */

    rcu_periph_clock_enable(RCU_USART0);


    /*配置USARTx_Tx(PA9)为复用推挽输出*/

    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);


    /*配置USARTx_RxPA9)为浮空输入 */

    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);


    /* USART 配置 */

    usart_deinit(USART0);//重置串口0

    usart_baudrate_set(USART0, 115200U);//设置串口0的波特率为115200

    usart_word_length_set(USART0, USART_WL_8BIT);          // 帧数据字长

    usart_stop_bit_set(USART0, USART_STB_1BIT);               // 停止位1位

    usart_parity_config(USART0, USART_PM_NONE);           // 无奇偶校验位

    usart_receive_config(USART0, USART_RECEIVE_ENABLE);//使能接收器

    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);//使能发送器

    usart_enable(USART0);//使能USART

串口重定向

/* 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;

}

串口重定向后就可以使用printf进行打印。


usart_data_transmit()发送

usart_data_transmit()是USART发送数据函数。 定义发送函数。


void uart_data_transmit(uint8_t arr[], uint32_t length) 

{

    uint32_t i;

    for(i=0; iusart_data_transmit(USART0, arr[i]);

        while (usart_flag_get(USART0, USART_FLAG_TBE)== RESET);

    }

}

在主程序中添加代码,打印HELLO!


while (1)

        {

            uint8_t str[] = 'HELLO!\r\n';

            uint32_t len =  sizeof(str) / sizeof(*str);

            uart_data_transmit(str,len-1);

            delay_1ms(1000);

        }

测试结果

在这里插入图片描述

中断发送

若要使用串口的中断函数USART0_IRQHandler(),需要先开启串口中断。

在这里插入图片描述

对于中断发送,需要usart_interrupt_enable()开启发送缓冲区空中断。 抢占优先级,数字越小,优先级越高。 若抢占优先级相同,判断子优先级,同样,数字越小,优先级越高。


/*开启USART0中断 */

    nvic_irq_enable(USART0_IRQn, 0, 0);

    /* 使能串口发送中断 */  

    usart_interrupt_enable(USART0, USART_INT_TBE);

    delay_1ms(1000);    //开启后会进入中断进行发送,故需要进行一个延迟

定义发送变量。


#define ARRAYNUM(arr_nanme)      (uint32_t)(sizeof(arr_nanme) / sizeof(*(arr_nanme)))

#define TRANSMIT_SIZE            (ARRAYNUM(txbuffer) - 1)

uint8_t txbuffer[] = '\n\rUSART interrupt test\n\r';//发送的数据

uint8_t tx_size = TRANSMIT_SIZE;//需要发送数据长度

__IO uint8_t txcount = 0; //发送数据长度

串口中断定义。


void USART0_IRQHandler(void)

{


    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE))//发送

        {

        /* transmit data */

        usart_data_transmit(USART0, txbuffer[txcount++]);//发送一个八位数据

        if(txcount == tx_size)//发送完毕

                {

            usart_interrupt_disable(USART0, USART_INT_TBE);//关闭发送中断

        }

    }

}


测试结果

在这里插入图片描述

中断接收

若要使用串口的中断函数USART0_IRQHandler(),需要先开启串口中断。

在这里插入图片描述

对于中断接收,需要usart_interrupt_enable()开启接收中断。 抢占优先级,数字越小,优先级越高。 若抢占优先级相同,判断子优先级,同样,数字越小,优先级越高。


/*开启USART0中断 */

    nvic_irq_enable(USART0_IRQn, 0, 0);

    /* 使能串口发送中断 */  

    usart_interrupt_enable(USART0, USART_INT_TBE);

        delay_1ms(1000);    //开启后会进入中断进行发送,故需要进行一个延迟            


    while(RESET == usart_flag_get(USART0, USART_FLAG_TC));//USART_FLAG_TC发送完成中断

     /* 使能串口接收中断*/  

    usart_interrupt_enable(USART0, USART_INT_RBNE);  


    /* 等待接收完毕 */

    while(rxcount < rx_size);

    if(rxcount == rx_size)

        printf('\n\r接收完毕,接收数据是:');

        uart_data_transmit(rxbuffer,rx_size);//发送接收数据

        printf('\n\r');

定义发送变量。


uint8_t rxbuffer[10];//接收数组

uint8_t rx_size = 10;//需要接收长度

__IO uint16_t rxcount = 0; //实际接收长度

串口中断定义。


/*!

    \brief      this function handles USART RBNE interrupt request and TBE interrupt request

    \param[in]  none

    \param[out] none

    \retval     none

*/

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

        }

    }

    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE))//发送

        {

        /* transmit data */

        usart_data_transmit(USART0, txbuffer[txcount++]);//发送一个八位数据

        if(txcount == tx_size)//发送完毕

                {

            usart_interrupt_disable(USART0, USART_INT_TBE);//关闭发送中断

        }

    }

}

测试结果

在这里插入图片描述


关键字:GD32F303  固件库开发  USART  收发配置 引用地址:GD32F303固件库开发(8)----USART收发配置

上一篇:GD32F303固件库开发(6)----GPIO输入函数说明
下一篇:【GD32F470紫藤派开发板使用手册】第十三讲 USB_虚拟键盘实验

推荐阅读最新更新时间:2026-03-24 10:59

GD32F303固件库开发(8)----USART收发配置
概述 本章主要配置printf进行打印。 查阅手册可以得知,PA9、PA10为串口0的输出和输入口。 样品申请 https://www.wjx.top/vm/wFGhGPF.aspx# 硬件准备 这里准备了1块开发板进行验证,分别是GD32303C_START开发板。 keil配置 microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。 串口初始化 对串口进行配置。 使用串口时候,需要对GPIO进行复用这里把串口的 Tx 引脚配置为复用推挽输出,Rx 引脚为浮空输入。 设置USART0 通
[单片机]
<font color='red'>GD32F303</font><font color='red'>固件库</font><font color='red'>开发</font>(8)----<font color='red'>USART</font><font color='red'>收发</font><font color='red'>配置</font>
STM8L USART+DMA配置,使用DMA完成串口收发
USART配置 /*----------------------------------------------------------------------------- * 函 数 名 : USART1_Config() * 函数功能 : USART1初始化配置 * 输 入 : 无 * 输 出 : 无 -----------------------------------------------------------------------------*/ void USART1_Config(void) { USART_Init(USART1, (uint32_t)
[单片机]
STM32F0xx_USART收发配置详细过程
前言 串口对于处理器来说算是一种标配,也是在软件开发中必不可少的,那就是使用串口来调试信息(打印出相应的信息)。STM32F0系列的芯片,串口根据型号不同,数量也不同,从1个到8个不等。 今天主要总结串口简单且常用的功能,发送字符和中断接收字符。今天提供的串口发送功能将在后面的各个模块总结中都需要使用到,主要用于验证和测试各项功能的正确性。 下载 ST标准外设库和参考手册、数据手册等都可以在ST官网下载,你也可以到我的360云盘下载。关于F0系列芯片的参考手册有多个版本(针对F0不同芯片),但有一个通用版本,就是“STM32F0x128参考手册V8(英文)2015-07”建议参考该手册,以后如果你换用一种型号芯片也方便了解
[单片机]
STM32F0xx_<font color='red'>USART</font><font color='red'>收发</font><font color='red'>配置</font>详细过程
STM32红牛开发板非固件库控制LED
摘要 STM32红牛开发板上的5个LED,接在GPIOF6~10脚,输出低电平时,LED亮。这样我们设置GPIOF的相关寄存器,让其输出低电平就可以让LED亮。因为没有用到ST提供的固件库,所以是直接对寄存器的内存地址读写,即对一个指向该地址的指针变量进行读写。并且该变量必须为易变型的,即用volatile定义,这样是为了告诉编译器不要去优化这个变量,导致其它一些寄存器的数据变化。GPIOx是挂载在APB2高速外设总线上的,最大频率是72MHZ,所以我们除了了打开HSE(外部高速时钟)并关闭内部高速时钟(开机默认选择了HSI)外,还要打开APB2总线的时钟。 一、寄存器地址映射 外设的基址PERI
[单片机]
STM32的三种开发方式 HAL库固件库安装与用户手册
  相比较早几年使用标准库开发来讲,最近几年HAL库的使用是越来越多,那么我们开发应当使用哪一种呢,本文着重介绍常用的几种开发方式及相互之间的区别,白猫也好、黑猫也好,抓到耗子就是好猫。 STM32的三种开发方式   通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的。一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配置寄存器进行开发。   网上关于标准库、HAL库的描述相信是数不胜数。可是一个对于很多刚入门的朋友还是没法很直观的去真正了解这些不同开发发方式彼此之间的区别,所以笔者想以一种非常直白的方式,用自己的理解去将这些东西表述出来,如果有描述的不对的
[单片机]
STM32的三种<font color='red'>开发</font>方式 HAL库<font color='red'>固件库</font>安装与用户手册
N76E003配置串口异步双工收发
串口收发 官方例程没有发现串口异步双工通信的例程,这里分享下异步双工通信(模式1,10位数据发送)的例程。 基本上不算全双工工作方式,因为发送时要禁用串口0中断(set_ES),会同时禁用收和发,也就是发送到发送完成这段时间没有串口接收中断。 初始化uart0时,TI(串口0发送中断标志位)必须要set,因为printf内部实现靠TI判断上一个字符发送完成。 #include string.h void usr_InitialUART0_Timer1_Mode1(UINT32 u32Baudrate) //T1M = 1, SMOD = 1 { P06_Quasi_Mode; //Setting UART
[单片机]
STM32CubeMX生成基于HAL库的Can收发配置
HAL库 的应该用比较新潮,经常找不到资料。今天说说,在CAN开发中的应用。 一,发送。 static HAL_StatusTypeDef Can_MsgSend(uint32_t ID,uint8_t * pData,uint8_t len) { HAL_StatusTypeDef retSTD; canTxMsg.StdId=ID;//0x500|(GetLocalID()&0xFF); canTxMsg.IDE=CAN_ID_STD; canTxMsg.RTR=CAN_RTR_DATA; canTxMsg.DLC=len; memcpy(canTxMsg.Data,pData,len); SendErrorCount
[单片机]
GD32F303红枫派开发板使用手册】第二十四讲 DHT11温湿度传感器检测实验
24.1实验内容 通过本实验主要学习以下内容: DHT11操作原理 单总线GPIO模拟操作原理 24.2实验原理 HT11是一款已校准数字信号输出的温湿度一体化数字传感器。该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点信号,传输距离可达20米以上。 其具体参数如下: 工作电压:3.3V-5.5V 工作电流:0.5mA 控制方式:单总线 输出方式:数字量 湿度精度:±5% 温度精度:±2℃ 湿度量程:5%~95% 温度量程:-20℃~+60℃ DHT11引脚定义和封装如下图所示 DHT11采用单总线的方式进行数据传输,下面对其通信时序以及传输数据构成进行介绍。 DHT11通信时序可分为:建立
[单片机]
【<font color='red'>GD32F303</font>红枫派<font color='red'>开发</font>板使用手册】第二十四讲 DHT11温湿度传感器检测实验
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved