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

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

3天内不再提示

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

嵌入式单片机MCU开发 来源: 嵌入式单片机MCU开发 作者: 嵌入式单片机MC 2022-11-28 17:28 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

概述

本章主要配置printf进行打印。 查阅手册可以得知,PA9、PA10为串口0的输出和输入口。需要GD样片的可以加群申请:615061293。

在这里插入图片描述

样品申请

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);//关闭发送中断
        }
    }
}

测试结果

在这里插入图片描述

审核编辑 黄昊宇

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

    关注

    2

    文章

    98

    浏览量

    15664
  • gd32f303
    +关注

    关注

    4

    文章

    38

    浏览量

    4253
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于RT-Thread与兆易创新GD32F527的工业级网络-CAN透传网关设计与实现 | 技术集结

    目录系统概述RT-Thread使用情况硬件框架软件架构软件模块详解功能展示链接地址1系统概述本系统是一个基于GD32F527I_EVAL和RT-Thread实时操作系统开发的工业级网络-CAN总线透
    的头像 发表于 02-10 16:05 1.7w次阅读
    基于RT-Thread与兆易创新<b class='flag-5'>GD32F</b>527的工业级网络-CAN透传网关设计与实现 | 技术集结

    LAT1171+STM32F745 USART1 Bootloader 失败原因分析与解决

    使用 STM32F745 进行产品开发的时候,出现了使用 STM32CubeProgramer 无法通过 USART1 Bootloader 进行程序升级的问题。为了解决客户的问题,我在 NUCLEO-
    发表于 01-11 17:33 0次下载

    基于RT-Thread与GD32F527I-EVAL的多媒体门禁系统 | 技术集结

    阵容,为GD32MCU高性能产品线再添新锐。该系列基于Armv8-M架构,主频高达280MHz,具备灵活的存储配置、高集成度、内置多种安全功能,为高性能计算提供坚实
    的头像 发表于 11-25 18:31 1270次阅读
    基于RT-Thread与<b class='flag-5'>GD32F</b>527I-EVAL的多媒体门禁系统 | 技术集结

    USART1、USART2、UART3的串口使用

    本人用蓝牙测试通过了三个串口模块,其中USART1需要重映射配置USART0我暂时没有启用! 下图是USART1的使用,相关接口映射可以查找“用户指南”,代码在文末(重映射需要开启A
    发表于 10-31 09:05

    兆易创新GD32F5xx与GD32G5xx STL软件测试获颁IEC61508功能安全认证

    业界领先的半导体器件供应商 兆易创新GigaDevice 宣布,其GD32F5xx与GD32G5xx系列MCU配套的STL(Software Test Library)软件测试获得德国莱茵TÜV
    的头像 发表于 10-24 12:55 543次阅读

    MCU无法检测到W5500是怎么回事?

    在兆易创新 GD32F303,国民技术 N32G457和ST STM32F103上试用了W5500以太网模块(RT-Thread版本是rt-thread-4.1.1), 只有STM32F103上可以
    发表于 10-14 07:38

    在标准配置的stm32f103x的spi在引入rtthread后收发的消息就错了,为什么?

    我在标准配置的stm32f103x的spi在引入rtthread后收发的消息就错了,引入之前没问题,请问这是啥情况
    发表于 10-13 08:07

    NVIC中断配置固件详解

    固件文件core_cm33.h的最后,还提供了NVIC的一些函数,这些函数遵循CMSIS规则,只要是Cortex-M33的处理器都可以使用。
    的头像 发表于 09-23 09:34 1930次阅读
    NVIC中断<b class='flag-5'>配置</b><b class='flag-5'>固件</b><b class='flag-5'>库</b>详解

    backtrace命令无法使用?为什么?

    GD32F303,之前一直用nano,最近使用5.2.0标准版,工程使用最新版本bsp中的,直接下载,发现有backtrace命令,根据提示使用,一直提示无效输入?是M核不支持吗?还是我哪里没有开启,虽然暂时没用到,还是想多了解一下?
    发表于 09-22 08:13

    GD32F103RCT6 rt_kprintf无法打印怎么解决?

    使用的芯片为GD32F103RCT6,文件夹board路径里有一个不使用rt操作系统的串口打印配置,映射到printf,使用这个代码配置的printf可以正常打印。我使用的串口为uart1,引脚为
    发表于 09-19 07:42

    GD32F103RCT6移植qboot,烧录之后系统卡死怎么解决?

    如题,我使用的是stm32的hal对STM32F103RCT6芯片进行配置的代码烧录到GD32F103RCT6中,串口和PWM都调试成功,没有问题,所以开始移植qboot。使用env
    发表于 09-19 06:41

    GD32的串口DMA收发数据失败怎么解决?

    我在使用RTT的GD32F303的BSP时,配置使用串口DMA收发(rt_device_open),发现错误,最终无法收发数据,对比了STM32的BSP发现在drv_
    发表于 09-17 06:04

    GD32F437开发板添加lwip支持后ping不通电脑怎么解决?

    使用GD32F437的开发板,在studio中添加lwip的支持后,将开板板设置和电脑相同的网段,并用网线连接开发板和电脑,开发板启动后ping不通电脑,如下:
    发表于 09-09 07:43

    高新兴瑞联推出新款LTE Cat.1高性能OBD产品GD303

    2025年8月,高新兴瑞联新款LTE Cat.1高性能OBD产品——GD303正式上市!凭借卓越的性能、丰富的功能和广泛的应用场景适用性和易用性,GD303将丰富高新兴瑞联的OBD Tracker产品家族,满足更多客户在数字化车
    的头像 发表于 08-15 11:02 2387次阅读

    GD32F4xx系列MCU基础工程资料

    GD32F4xx系列MCU基础工程创建.
    发表于 08-04 14:53 2次下载