USARTx串口和管脚
串口比较
MCS51单片机 | C8051F41X系列单片机 | C8051F02X系列单片机 | ARM9 S3C2410 | STM32F103Cx单片机 |
---|---|---|---|---|
有1个UART(通用异步接收和发送器) | 有1个通用异步串行发送接收端口UART0 | 有2个通用异步串行发送接收端口UART0,UART1 | 有3个UART(通用异步接收和发送器) | 有3个USART(通用同步/异步接收和发送器) |
串行通信的分类
- 同步串行通信:以数据块为单位进行传送
- 异步串行通信:以字符为单位进行传送
串行通信的制式
串行通信的制式分三种:①单工(simplex)②半双工(half duplex)③全双工(full duplex)。若只有一根线用于数据通信,那只能是半双工;必须有二根线用于数据通信,才能实现全双工。
STM32F103Cx拥有的3个USART,它们都可以“全双工”通信
STM32单片机的USART串口:采用分数波特率发生器,串行发送、接收数据的最高速率=72M/16=4.5Mb/s。USART1接口通信速率可达4.5兆位/秒,其他接口的通信速率可达2.25兆位/秒。
波特率:是一个衡量通信速度的参数。如果数据不压缩,它表示每秒钟传送的位数,单位是bps。(在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数 称为 码元传输速率,简称波特率。其单位是波特)
PC机串口和单片机串口相连接
电平转换芯片:MAX232和MAX3232
MAX232 | MAX3232 | |
---|---|---|
供电 | 5V | 5V或3.3V |
功耗 | 功耗较大,供电电压5V时,耗电5mA | 功耗较小,供电电压5V或3.3V时,耗电 0.3mA |
外接电容 | 4个1uF电容 | 4个0.1uF电容 |
- PC机 与 STM32单片机 的连接
- 连线:要完成串口发送、接收,只需要TXD、RXD、GND三根线
- 连接方法:两者的TXD和RXD交叉相连
- 交叉方法:①通过串口(连接)线交叉,②在电路板上交叉(这时的串口(连接)线用直通线)
USARTx串口配置
USARTx串口定义
每个USART口共有7个设置寄存器
寄存器 | 描述 | 偏移地址 | 复位值 |
---|---|---|---|
USART_SR | 一个状态寄存器 | 0x00 | 0x00C0 |
USART_DR | 一个数据寄存器,它是由两个寄存器组成的,一个给发送用(发送寄存器 TDR),一个给接收用(接收寄存器 RDR) | 0x04 | 不确定 |
USART_BRR | 一个波特率寄存器 | 0x08 | 0x0000 |
USART_CR1 | 一个控制寄存器1 | 0x0C | 0x0000 |
USART_CR2 | 一个控制寄存器2 | 0x10 | 0x0000 |
USART_CR3 | 一个控制寄存器3 | 0x14 | 0x0000 |
USART_GTPR | 一个保护时间和预分频寄存器 | 0x18 | 0x0000 |
USART_InitTypeDef
/*
USART_InitTypeDef
结构体定义了串口参数,用于串口参数设置
在文件“stm32f10x_usart.h”中定义
*/
/* USART Init Structure definition */
typedef struct
{
u32 USART_BaudRate; // 用于设置USART传输的波特率
u16 USART_WordLength; // 用于设置一个帧中,传输或接收到的数据位数目
u16 USART_StopBits; // 用于设置所发送的数据的停止位数目
u16 USART_Parity; // 用于设置奇偶校验模式
u16 USART_Mode; // 用于使能或者失能串口发送和接收模式
u16 USART_HardwareFlowControl; // 用于使能或失能硬件流控制模式
} USART_InitTypeDef;
参数设置选择
USART_BaudRate
USART_WordLength
USART_WordLength | 描述 |
---|---|
USART_WordLength_8b | 8位数据(默认) |
USART_WordLength_9b | 9位数据 |
USART_StopBits
USART_StopBits | 描述 |
---|---|
USART_StopBits_1 | 在帧结尾传输1个停止位(默认) |
USART_StopBits_0.5 | 在帧结尾传输0.5个停止位 |
USART_StopBits_2 | 在帧结尾传输2个停止位 |
USART_StopBits_1.5 | 在帧结尾传输1.5个停止位 |
USART_Parity
USART_Parity | 描述 |
---|---|
USART_Parity_No | 奇偶失能(默认) |
USART_Parity_Even | 偶模式 |
USART_Parity_Odd | 奇模式 |
奇偶校验一旦使能,在发送数据的MSB位插入经计算的奇偶位(字长是9位时的第9位,字长是8位时的第8位)。
USART_HardwareFlowControl
USART_HardwareFlowControl | 描述 |
---|---|
USART_HardwareFlowControl_None | 硬件流控制失能(默认) |
USART_HardwareFlowControl_RTS | 发送请求RTS使能 |
USART_HardwareFlowControl_CTS | 清除发送CTS使能 |
USART_HardwareFlowControl_RTS_CTS | RTS和CTS使能 |
USART_Mode
USART_Mode | 描述 |
---|---|
USART_Mode_Tx | 发送使能 |
USART_Mode_Rx | 接收使能 |
USART_Init函数
USART_Init:根据USART_InitTypeDef中指定的参数,初始化外设USARTx串口
// 例如:初始化USART1串口
USART_Init(USART1, &USART_InitStructure);
USART_Cmd
USART_Cmd:使能USARTx外设 (或 失能USARTx外设),使能后,让外部管脚通过多路交叉开关与对应的USARTx相连。
USART_Cmd(USARTx, [ENABLE, DISABLE]); // ENABLE使能 DISABLE失能
发送和接收数据
// 以发送一串字符为例,时钟使能和初始化自行设置
int main()
{
u16 i;
u8 a[] = "abcdef";
for(i=0; a[i]!='\0'; i++)
{
USART_SendData(USARTx,a[i]); // 发送数据
while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET); // 等待发送完成
}
}
// 接收程序如下,以下程序只接收一个字节
int main()
{
u8 i;
while(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)==RESET); // 等待有数据发送来
i = USART_ReceiveData(USARTx); // 数据发送来了保存在变量i中
}
脑图
有需要的自取
串口编程这一块还是比较简单的,如果有记录不完整或则错误的地方,欢迎反馈,我会积极汲取大家的宝贵建议。现在STM32编程的整体框架结构我心里已经有一条比较清晰的轮廓了,多编程,多实践就好了,大家一起加油↖(^ω^)↗