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

    文章

    97

    浏览量

    14924
  • gd32f303
    +关注

    关注

    4

    文章

    38

    浏览量

    3674
收藏 人收藏

    评论

    相关推荐

    GD32 MCU 移植教程】2、从 GD32F303 移植到 GD32F503

    GD32E503 系列是 GD 推出的 Cortex_M33 系列产品,该系列资源上与 GD32F303 兼容度非常高,本应用笔记旨在帮助您快速将应用程序从 GD32F303 系列微控
    的头像 发表于 08-31 09:36 1346次阅读
    【<b class='flag-5'>GD</b>32 MCU 移植教程】2、从 <b class='flag-5'>GD32F303</b> 移植到 <b class='flag-5'>GD32F</b>503

    GD32F303使用KEIL仿真,JLINK连不上什么原因?需要怎么设置?

    GD32F303使用KEIL仿真,JLINK连不上什么原因?需要怎么设置?
    发表于 07-26 06:34

    GD32F303红枫派开发板使用手册】第二十七讲 USB-虚拟键盘实验

    ,传输速度也很快,这些特性使支持USB接口的电子设备更易用、更大众化。GD32F303系列MCU集成了USB2.0全速设备USBD模块,可以满足作为USB设备与主机
    的头像 发表于 06-27 09:42 716次阅读
    【<b class='flag-5'>GD32F303</b>红枫派<b class='flag-5'>开发</b>板使用手册】第二十七讲  USB-虚拟键盘实验

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

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

    GD32F303红枫派开发板使用手册】第十六讲 USART-DMA串口收发实验

    在前面ADC章节中,我们介绍了DMA的工作原理,这里就不多做介绍。从GD32F303用户手册中可以查到,各串口的TX和RX分别对应DMA的不同通道,比如USART0的TX对应DMA0的通道3,而RX对应DMA0的通道4。
    的头像 发表于 06-15 09:54 979次阅读
    【<b class='flag-5'>GD32F303</b>红枫派<b class='flag-5'>开发</b>板使用手册】第十六讲 <b class='flag-5'>USART</b>-DMA串口<b class='flag-5'>收发</b>实验

    GD32F303红枫派开发板使用手册】第五讲 FMC-片内Flash擦写读实验

    MC即Flash控制器,其提供了片上Flash操作所需要的所有功能,在GD32F303系列MCU中,Flash前256K字节空间内, CPU执行指令零等待,具有相同主频下最快的代码执行效率。FMC也
    的头像 发表于 06-02 10:05 717次阅读
    【<b class='flag-5'>GD32F303</b>红枫派<b class='flag-5'>开发</b>板使用手册】第五讲 FMC-片内Flash擦写读实验

    GD32F303红枫派开发板使用手册】第三讲 GPIO-按键查询检测实验

    GD32F303系列MCU GPIO输入配置结构如下图所示,输入可配置上下拉电阻,通过施密特触发器后可通过备用功能输入或者通过输入状态寄存器进行读取。
    的头像 发表于 05-30 10:02 791次阅读
    【<b class='flag-5'>GD32F303</b>红枫派<b class='flag-5'>开发</b>板使用手册】第三讲 GPIO-按键查询检测实验

    GD32F303红枫派开发板使用手册】第二讲 GPIO-流水灯实验

    GD32F303系列MCU最多可支持 112 个通用I/O 引脚(GPIO),分别为 PA0 ~ PA15, PB0 ~ PB15, PC0 ~ PC15,PD0 ~ PD15, PE0
    的头像 发表于 05-29 10:02 1518次阅读
    【<b class='flag-5'>GD32F303</b>红枫派<b class='flag-5'>开发</b>板使用手册】第二讲 GPIO-流水灯实验

    GD32F10x 固件使用指南

    电子发烧友网站提供《GD32F10x 固件使用指南.pdf》资料免费下载
    发表于 05-22 14:15 27次下载

    GD32F303为什么启动慢?

    在MCU开发中,有一项非常重要的参数——MCU启动时间,即MCU上电后到程序开始运行这段时间。我们来看下GD32F303的datasheet中对启动时间的描述:
    的头像 发表于 02-22 11:11 1252次阅读
    <b class='flag-5'>GD32F303</b>为什么启动慢?

    GD32固件库里时钟配置时的神秘代码?高频切低频时芯片会发生什么

    GD固件的时钟配置函数里看到这样一段神秘代码,研究分析后不得不佩服原厂固件库里的细节处理
    的头像 发表于 02-19 09:44 635次阅读
    <b class='flag-5'>GD</b>32<b class='flag-5'>固件</b>库里时钟<b class='flag-5'>配置</b>时的神秘代码?高频切低频时芯片会发生什么

    GD32F303想控制PA13~15、PB3和PB4不成功?

    有没有小伙伴遇到这种情况:在使用GD32F303的时候,想要将PA13~15以及PB3和PB4作为IO口来使用,却怎么也不成功呢?下面小编就来告诉大家原因。
    的头像 发表于 02-01 09:49 2444次阅读
    <b class='flag-5'>GD32F303</b>想控制PA13~15、PB3和PB4不成功?

    GD32F303 使用PA8输出内部时钟频率#GD32 #时钟技术 #MCU #单片机

    单片机mcugd32f303
    聚沃科技
    发布于 :2024年01月22日 09:59:40

    GD32F303 低功耗模式要点

    我们都知道,MCU有低功耗模式,比如GD32F303芯片,就有Sleep、Deepsleep和Standby三种模式。关于这三种模式的具体使用方法,小伙伴们可以参考《GD32F30x系列用户手册》。
    的头像 发表于 01-17 09:40 2427次阅读
    <b class='flag-5'>GD32F303</b> 低功耗模式要点

    GD32F系列MCU片上Flash中Code区和Data区使用解密

    GD32F系列MCU产品片上Flash分Code区和Data区,以GD32F303系列为例,从GD32F303xx Datasheet中可以获取code区和data区大小,那Code区和Data区在代码执行上有什么差别呢?
    的头像 发表于 01-09 10:07 2618次阅读
    <b class='flag-5'>GD32F</b>系列MCU片上Flash中Code区和Data区使用解密