当前位置: 首页 > article >正文

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

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

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

概述

本章主要配置printf进行打印。
查阅手册可以得知,PA9、PA10为串口0的输出和输入口。

需要样片的可以加Qun申请:615061293。
在这里插入图片描述

视频教学

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

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

样品申请

https://www.wjx.top/vm/wFGhGPF.aspx#

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);//重置串口0usart_baudrate_set(USART0, 115200U);//设置串口0的波特率为115200usart_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);//关闭发送中断}}
}

测试结果

在这里插入图片描述

最后

以上的代码会在Q_qun里分享。Q_qun:615061293。
或者关注『记帖』,持续更新文章和学习资料!
在这里插入图片描述

中断接收

若要使用串口的中断函数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);//关闭发送中断}}
}

测试结果

在这里插入图片描述

http://www.lryc.cn/news/2417087.html

相关文章:

  • GoldenDict:一款免费的词典工具
  • mysql tdb数据库_MYSQL数据库基础
  • 指针函数的概念
  • 网格组布局管理器(GridBagLayout)网格包布局管理器
  • 什么是串联谐振和并联谐振,有什么作用(硬件每日一题)
  • CSS——FC(BFC/IFC/FFC/GFC)超详细版+原理案例分析
  • Android将library代码发布到jcenter
  • 机器学习——多元线性回归分析(multiple regression)及应用
  • C语言(五)---函数
  • Javascript的调试利器:Firebug使用详解
  • qtp11安装及入门
  • BOSS系统
  • VML概览
  • ironpython是什么意思_意思是“IronPython是Python编程语言的一种实现”
  • 连接池介绍
  • 【SD卡修复】使用SDFormatter工具
  • 莱顿弗罗斯特效应
  • 股指期权是什么?
  • Oracle 数据库新手指南(一) Oracle基础
  • clientHeight、offsetHeight、innerHeight、ouerHeight 区别
  • Python桌面应用开发GTK3 Glade GTK主题
  • 第一篇:nutz初步了解
  • DCOM揭秘
  • Debian安装全攻略
  • 本地安全策略
  • computed侦听的值可以在watch和methods中引用并赋值
  • 关于调试错误 Assertion Failed 问题
  • 彻底弄懂计算机中的大端小端
  • java.分页上一页下一页算法_一个方便的java分页算法
  • 颜色六位码和八位码表示