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

概述本章主要配置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; iwhile (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);//关闭发送中断 } }}测试结果


基于以太网的嵌入式开发环境的研究与实现
基于微控制器板和附加板的自动温室控制系统设计
企业和家用这两种Wi-Fi,二者之间到底有何不同?
VLSI电路中电迁移(EM)和IR下降分析
华为畅享6和荣耀6X两兄弟携手,共战千元手机市场
GD32F303固件库开发(8)----USART收发配置
Fairchild推出业内首款LLC控制器
5G首个演进版本标准正式完成,加快全球5G网络部署进程
采用PROFIBUS协议的智能MCC的特点及应用实现介绍
基于LTC6804的电池管理系统设计
示波器无源探头的阻抗匹配问题
php运行环境的配置步骤
天拓分享:西门子SINAMICS G120X/G120XA系列变频器特性优势
为什么iPhone8值得买?iPhone未来的发展方向
mos管导通后电流方向
过电压保护器有什么用途
Vishay新款集成式UVA和UVB光传感器凭借Filtron™技术实现高灵敏度
新能源汽车的电驱系统中的IGBT模块技术解读
为什么MOSFET是自动平衡超级电容器泄漏的最佳选择
市场动态:ROM需求减少 NOR跌价压力