串口通信经常作为开发调试的工具,所以先介绍下串口通信。
串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。目前STM32一般只使用 RXD、TXD 以及 GND 三条信号线,直接传输数据信号。
STM32的串口通信外设有USART和UART。USART是Universal Synchronous Asynchronous Receiver and Transmitter的缩写,即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。UART(Universal Asynchronous Receiver and Transmitter)在USART基础上裁减了同步通信功能,只有异步通信。
接口通过三个引脚从外部连接到其它设备(如以下USART框图所示)。任何 USART 双向通信均需要至少两个引脚:接收数据输入引脚 (RX) 和发送数据引脚输出 (TX)。
RX :接收数据输入引脚就是串行数据输入引脚。过采样技术可区分有效输入数据和噪声,从而用于恢复数据。
TX :发送数据输出引脚。如果关闭发送器,该输出引脚模式由其 I/O 端口配置决定。如果使能了发送器但没有待发送的数据,则 TX 引脚处于高电平。在单线和智能卡模式下,该 I/O用于发送和接收数据(USART 电平下,随后在 SW_RX 上接收数据)。
TX和RX分别用PA9和PA10。即使用USART1。
配置串口时,首先要对相应的GPIO口进行初始化,初始化方式和LED灯初始化类似。开启外设时钟,设置端口模式,端口输出类型、输出速度、上下拉、初始输入输出状态。由于USART属于可选功能项,所以两个端口工作模式都为复用功能模式。
![](http://mmbiz-qpic-cn.weituibao.com/mmbiz_png/1P0M6KK3Ug9NH1ZAjQjbJLkiaiaOTgA54ZXvF648t0XjZdJsooN60jDd2ofe67j5VZ7MQgSpRuLRjypehwzpP4xg/640.png)
GPIO口配置好后,需要选用复用的功能USART1。
![](http://mmbiz-qpic-cn.weituibao.com/mmbiz_png/1P0M6KK3Ug9NH1ZAjQjbJLkiaiaOTgA54ZTqCAX65XjuEC0ggxffzoJQm9uoLMBVnYNgwMqMErcptiaEKZic8ic12sA/640.png)
从图中可以知道USART1属于寄存器GPIOx_AFRH中的AF7。需要在相应GPIO口写入0111。
![](http://mmbiz-qpic-cn.weituibao.com/mmbiz_png/1P0M6KK3Ug9NH1ZAjQjbJLkiaiaOTgA54Z4gp0qYuUzhHcNfb9hJYibiaF8iaBzecrwbhV2AzWl0uaM08PAcxKkT0yg/640.png)
接着,设置USART1模式。
![](http://mmbiz-qpic-cn.weituibao.com/mmbiz_png/1P0M6KK3Ug9NH1ZAjQjbJLkiaiaOTgA54ZjYEfLzicEE8Cib1ko1o44Pjibl5nxTyaGYrXSgT3tEMFRmg05DsibjAdlg/640.png)
![](http://mmbiz-qpic-cn.weituibao.com/mmbiz_png/1P0M6KK3Ug9NH1ZAjQjbJLkiaiaOTgA54ZSJG83kHM3m68Yl3ObOfYKWzO3PEx1SkR0Gia0ltbZzGSyeD0c4lB5JA/640.png)
![](http://mmbiz-qpic-cn.weituibao.com/mmbiz_png/1P0M6KK3Ug9NH1ZAjQjbJLkiaiaOTgA54ZrJELxj8rZGBSFWDdok8ibaW32zrEJiamygENPS6CwBVXvMotSkXP7XJw/640.png)
![](http://mmbiz-qpic-cn.weituibao.com/mmbiz_png/1P0M6KK3Ug9NH1ZAjQjbJLkiaiaOTgA54ZiaSgOSVfJdjOk0koJmbv2hpnTs3EKz9eChG94VtHibt4sjwUUJfFdSBQ/640.png)
![](http://mmbiz-qpic-cn.weituibao.com/mmbiz_png/1P0M6KK3Ug9NH1ZAjQjbJLkiaiaOTgA54ZhJaXNWNoL9I7AmXm68ic0ynLaEocbtegApZpPIkWmxQKL4ds2Za2Bww/640.png)
根据寄存器说明,配置为过采样16倍、字长8位、不校验,设置一个停止位,设置波特率,使能发送器和接收器。最后使能USART。
波特率指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示,单位为波特。比特率指单位时间内传输的比特数,单位 bit/s(bps)。对于 USART 波特率与比特率相等。波特率越大,传输速率越快。USART 的发送器和接收器使用相同的波特率。
![](http://mmbiz-qpic-cn.weituibao.com/mmbiz_png/1P0M6KK3Ug9NH1ZAjQjbJLkiaiaOTgA54Zn5PL3RgSAHPcwxXpfQPDWtCXnkzXYUftPhMguKzmpZFtxMibTS06rnA/640.png)
![](http://mmbiz-qpic-cn.weituibao.com/mmbiz_png/1P0M6KK3Ug9NH1ZAjQjbJLkiaiaOTgA54ZwP376vYgt5c1fXcpGwRdVEicM5hmtuDlOrajJUsxGQrwXV5Y26OiamkA/640.png)
波特率计算公式
![](http://mmbiz-qpic-cn.weituibao.com/mmbiz_png/1P0M6KK3Ug9NH1ZAjQjbJLkiaiaOTgA54ZFElrN2x97GKuYictV4OuhiawhC585Fa8tIlTQOTCibhkiaf3pkCjkqWTBg/640.png)
其中,f PLCK 为 USART 时钟,OVER8 为 USART_CR1 寄存器的 OVER8位对应的值,USARTDIV 是一个存放在波特率寄存器(USART_BRR)的一个无符号定点数。其中 DIV_Mantissa[11:0]位定义 USARTDIV 的整数部分,DIV_Fraction[3:0]位定义USARTDIV 的小数部分,DIV_Fraction[3]位只有在 OVER8 位为 0 时有效,否则必须清零。
![](http://mmbiz-qpic-cn.weituibao.com/mmbiz_png/1P0M6KK3Ug9NH1ZAjQjbJLkiaiaOTgA54ZEKiawZlyDjdTXRR7pnQo8rlYmWOibhsmf7QFx3RYflFHzuWU0mrgia4oA/640.png)
![](http://mmbiz-qpic-cn.weituibao.com/mmbiz_png/1P0M6KK3Ug9NH1ZAjQjbJLkiaiaOTgA54ZyRoJRFDzx3ywIreKhFFlWEN4pZLXPRCmE8tFThEcNNpwbHdia635jjQ/640.png)
可通过状态寄存器USART_SR的第七位判断发送数据寄存器是否为空,进行下一步的发送数据。
![](http://mmbiz-qpic-cn.weituibao.com/mmbiz_png/1P0M6KK3Ug9NH1ZAjQjbJLkiaiaOTgA54ZJCSKU2vVfXYxHRMyO4ibwQlkYic0GtZjK2lgQDH5tU8sTv0bEbGJicSfQ/640.png)
这个函数虽然可以发送数据,但只能单个发送,如果想发送一个字符串就要多次调用这个函数,所以把这个函数再进行封装。判断要输出的数是否为‘\0’,如果是,则这个数发送结束,不再进行发送数据。这样就可以一次发送一个完整的字符串了。
![](http://mmbiz-qpic-cn.weituibao.com/mmbiz_png/1P0M6KK3Ug9NH1ZAjQjbJLkiaiaOTgA54ZgGI1HuQBvA2VvYEceCGtrOKicBkJfS1EJbjWcyhm9GoFfbTr952QhXA/640.png)
主函数
![](http://mmbiz-qpic-cn.weituibao.com/mmbiz_png/1P0M6KK3Ug9NH1ZAjQjbJLkiaiaOTgA54ZiceiasmRvFTkniayznRer2PnPjduAk4ibx61mfbibcrMkUkf5Ft2IaMo9fg/640.png)
usart源文件
![](http://mmbiz-qpic-cn.weituibao.com/mmbiz_png/1P0M6KK3Ug9NH1ZAjQjbJLkiaiaOTgA54ZnfT2OWYTbIWcgsJ4GFwHXG1boD0FmNYx9AjEQHysK59mbtNziaSRB8A/640.png)
usart头文件
![](http://mmbiz-qpic-cn.weituibao.com/mmbiz_png/1P0M6KK3Ug9NH1ZAjQjbJLkiaiaOTgA54ZHYsr3xhqBZV86Q8g51yAteNH9b8yBp7bucXOGuvPdv8DM0tsRW4iaTg/640.png)
![](http://mmbiz-qpic-cn.weituibao.com/mmbiz_png/1P0M6KK3Ug9NH1ZAjQjbJLkiaiaOTgA54ZrOvGmtKsZg0oWK3ps2OVXJJv46pWELSswyjyJaBtpibSZnFNfjg7cCA/640.png)
最终编译后将程序烧入,STM32发送数据,电脑通过串口助手接收到数据,串口发送数据成功。这样以后就可以很方便的进行调试了。 品略图书馆 http://www.pinlue.com/ http://m.pinlue.com/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)