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


    概述

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

    视频教学

    https://www.bilibili.com/video/BV1ja411j76K/

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

    csdn课程

    课程更加详细。
    https://download.csdn.net/course/detail/37144

    硬件准备

    这里准备了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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    串口重定向

    /* 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    usart_data_transmit()发送

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

    void uart_data_transmit(uint8_t arr[], uint32_t length) 
    {
    	uint32_t i;
    	for(i=0; i<length; i++) 
    	{
    		usart_data_transmit(USART0, arr[i]);
    		while (usart_flag_get(USART0, USART_FLAG_TBE)== RESET);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在主程序中添加代码,打印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);
    		}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    测试结果

    在这里插入图片描述

    中断发送

    若要使用串口的中断函数USART0_IRQHandler(),需要先开启串口中断。
    在这里插入图片描述
    对于中断发送,需要usart_interrupt_enable()开启发送缓冲区空中断。
    抢占优先级,数字越小,优先级越高。
    若抢占优先级相同,判断子优先级,同样,数字越小,优先级越高。

        /*开启USART0中断 */
        nvic_irq_enable(USART0_IRQn, 0, 0);
        /* 使能串口发送中断 */  
        usart_interrupt_enable(USART0, USART_INT_TBE);
        delay_1ms(1000);	//开启后会进入中断进行发送,故需要进行一个延迟
    
    • 1
    • 2
    • 3
    • 4
    • 5

    定义发送变量。

    #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; //发送数据长度
    
    • 1
    • 2
    • 3
    • 4
    • 5

    串口中断定义。

    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);//关闭发送中断
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    测试结果

    在这里插入图片描述

    中断接收

    若要使用串口的中断函数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");
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    定义发送变量。

    uint8_t rxbuffer[10];//接收数组
    uint8_t rx_size = 10;//需要接收长度
    __IO uint16_t rxcount = 0; //实际接收长度
    
    • 1
    • 2
    • 3

    串口中断定义。

    /*!
        \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);//关闭发送中断
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    测试结果

    在这里插入图片描述

    最后

    以上的代码会在Q群里分享。QQ群:615061293。
    或者关注微信公众号『记帖』,持续更新文章和学习资料,可加作者的微信交流学习!
    在这里插入图片描述

  • 相关阅读:
    Linux安装mysql客户端
    TinyWebServer学习笔记-threadpool
    kubernetes组件 Controller manager深刻认知
    Android Studio实现记单词App,背完四六级一次过~
    【附源码】计算机毕业设计java缘来有交友平台系统设计与实现
    使用JacORB编译idl文件生成依赖的开发jar---Corba北向接口开发001
    什么是Docker CLI
    c++运算符重载
    「网页开发|前端开发|Vue」05 Vue实战:从零到一实现一个网站导航栏
    HIve数仓新零售项目ODS层的构建
  • 原文地址:https://blog.csdn.net/qq_24312945/article/details/124949414