STM32F103xx学习笔记(2)——USART串口通讯
部分基础概念
并行通讯和串行通讯
串行:按位传输,一次传输一位。适合远距离传输。
并行:一次传输多位数据。传输速度快,但是受距离限制大(并行的时序要求),布线更复杂。

高速串行通讯是趋势。
例如现在采用的PCIe:高速时钟频率的串行传输替代了以前的并行传输,本身亦可以拓展位宽。
类似的还有硬盘的SATA接口。
不过某些高速数据传输应用中(内部总线),并行通讯仍是必要的。
单工,半双工,全双工
定义从信息的传输方向来定义。
单工:只能A传输到B。
半双工:A传输B,B传输A,二者无法同时存在。
全双工:允许A,B同时互相传输。
同步,异步
同步传输过程需要时钟信号线,而异步传输只需要数据信号线。
通讯协议
串口通讯 Serial Communication支持大部分通讯方式,是一种常用的串行通讯,异步,全双工方式。

串口通讯协议

上面是一个数据帧,也称为一个数据流。
先从低位发送,起始位是0,停止位必须是1,默认是1,也就是空闲位。在232中,如果空闲位高电平保持一个数据帧的长度(空闲帧),便认为发送结束。
波特率:每秒传输的码元(位)数量,由于通讯中没有时钟,因此通讯双方要约定好波特率,即告知每个码元的长度。常见波特率有9600、115200等。
USART外设
Universal Synchronous Asynchronous Receiver and Transmitter
通用 串行 同步 收发。
去掉时钟的同步属性,即为UART。

IrDA红外信号传输,LIN本地网络传输,STM32中,USART1的速度最快。
在UART的基础上拓展更多协议,衍生出RS-232,RS-485电气标准,其中RS-485使用差分传输,但是双线半双工,RS-422使用4线差分做到全双工。在电脑上,微软定义了COM串口。
功能框图

SW_RX:只会在单线Single Line才会启用。
IrDA:红外模块
nRTS:requair to send 请求发送,低电平有效。nCTS:clear to send,低电平有效,通讯双方两个引脚对应连接。
SCLK控制:把时钟信号输出。
处理寄存器时,可以将RDR和TDR合二为一为DR。
波特率设置 USART_BRR
使能位TE,RE,在16位寄存器BRR中配置,高12位为整数,低四位为小数。规则:USARTDIV = DIV_Mantissa + (DIV_Fraction/16),最终的发送,接受器的时钟为 (外设总线)/(UAARTDIV * 16),因此,波特率公式为:

假设我们需要的波特率是115200,则对应的分频值应该是:39.0625,把这个值写入到BRR寄存器中。39.0625的小数部分:0.0625 * 16 = 1, 整数部分是:39(0x27)。
相关寄存器
USART_BRR

设置波特率,14位整数,4位小数,寄存器值为0x271时,设置波特率为115200.
收发使能和串口使能




RXNE=1:接受缓冲寄存器为满
M位默认八位字长。一般校验位和M位配合使用,数据位位9位时,配合打开校验位,使其中一为位校验位。
发送接受数据
状态寄存器

TXE:transmit data register empty,发送寄存器空




中断形式进行通讯
利用中断可以更好的实现接收字符串功能和IDEL位的判断。
另外USART1——Handler一个中断服务程序对应多个中断向量,需要在终端服务程序中用if…else if…判断中断来源。
C语言笔记
本次实验中加深了对C++中数组的理解:
uint8_t buffer[100] = {0};
uint8_t size = 0;
// 定义了一个字符串打印函数
void usart_send_string(uint8_t *str, uint8_t size);
// 以下两中函数的调用均可
// 第一种
usart_send_string(&buffer[0],size);
// 第二种
usart_send_string(buffer,size);
其中,第一种比较好理解,取第一个数组元素的指针,可是第二种为什么也可以成功调用函数呢?因为C 语言中的数组名表现为指向数组第一个元素的指针。
5410

被折叠的 条评论
为什么被折叠?



