资讯详情

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

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

  • 概述
  • 视频教学
  • csdn课程
  • 硬件准备
  • keil配置
  • 串口初始化
  • 串口重定向
  • usart_data_transmit()发送
  • 测试结果
  • 中断发送
  • 测试结果
  • 中断接收
  • 测试结果
  • 最后

概述

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

视频教学

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

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

csdn课程

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

硬件准备

这里准备了一块开发板验证,分别是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; i<length; i++) 
	{ 
        
		usart_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);//关闭发送中断
        }
    }
}

测试结果

最后

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

标签: ja9774u3电阻器定时器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台