32单片机——串口
1、通信
通信的方式可以分为多种:
(1)按照数据传送方式可分为串行通信和并行通信;
①串行通信
基本特征:数据逐位顺序依次传输
优点:传输线少、布线成本低、灵活度高等优点,一般用于近距离人机交互,特殊处理后也可以用于远距离
缺点:传输速率低
②并行通信
基本特征:数据各位可以通过多条线同时传输
优点:传输速率高
缺点:布线成本高,抗干扰能力差因而适用于短距离、高速率的通信
(2)按照通信的数据同步方式,可分为异步通信和同步通信
①同步通信
要求通信双方共用同一时钟信号,在总线上保持统一的时序和周期完成信息传输
优点:可以实现高速率、大容量的数据传输,以及点对多点传输
缺点: 要求发送时钟和接收时钟保持严格同步,收发双方时钟允许的误差较小,同时硬件复杂
②异步通信
不需要时钟信号,而是在数据信号中加入开始位和停止位等一些同步信号,以便使接收端能够正确地将每一个字符接收下来,某些通信中还需要双方约定传输速率
优点 :没 有时钟信号硬件简单,双方时钟可允许一定误差
缺点:通信速率较低,只适用点对点 传输
(3)按照数据的传输方向又可分为单工、半双工和全双工通信
①单工:数据传输仅能沿一个方向,不能实现反方向传输。如校园广播
②半双工:数据共用一条线路沿着两个方向,但是需要分时进行。如对讲机
③全双工:数据利用两条线路同时进行双向传输,一条用于发送数据,另一条用于接收数据。如打电话
1.1 通信速率
衡量通信性能的一个非常重要的参数就是通信速率,通常以比特率(Bitrate)来表示。比特率是每秒钟传输二进制代码的位数,单位是:位/秒( bps)
如:每秒钟传送240个字符,而每个字符格式包含10位(1个起始位、1个停止位、8个数据位),这时的比特率为:10位×240个/秒=2400bps
波特率表示每秒钟传输了多少个码元。而码元是通信信号调制的概念,通信中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元。
如:常见的通信传输中,用0V表示数字0,5V 表示数字1,那么一个码元可以表示两种状态0和1,所以一个码元等于一个二进制比特位,此时波特率的大小与比特率一致;如果在通信传输中,有0V、2V、4V以及6V分别表示二进制数00、01、10、11,那么每个码元可以表示四种状态,即两个二进制比特位,所以码元数是二进制比特位数的一半,这个时候的波特率为比特率的一半
由于很多常见的通信中一个码元都是表示两种状态,所以我们常常直接以波特率来表示比特率
1.2 常见的串行通信接口
2、串口(RS-232)
串口通信是一种设备间常用的串行通信方式,串口按位(bit)发送和接收字节。尽管比特字节(byte)的串行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据
串口通信协议是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式才能正常收发数据的有关规范。在串口通信中,常用的协议包括 RS-232、RS-422和RS-485等
2.1 RS-232接口(DB9)
(1)数据:
TXD(pin 3):串口数据输出
RXD(pin 2):串口数据输入
(2)握手:
RTS(pin 7):请求发送
CTS(pin 8):清除发送
DSR(pin 6):数据发送就绪
DCD(pin 1):数据载波检测
DTR(pin 4):数据终端就绪
(3)地线:GND(pin 5):信号地
(4)其他:RI(pin 9):振铃指示
2.2 RS-232通信
注意:两个设备之间的TXD和RXD,必须交差连接,方可正常通信
2.3 STM32串口与电脑USB口通信
注意:两个设备之间的TXD和RXD,必须交差连接,方可正常通信
2.4 RS-232电平、COMS电平与TTL电平的区别
一般情况下
(1)RS-232电平
逻辑1:-15V ~ -3V
逻辑0:+15V ~ +3V
(2)COMS电平
逻辑1:3.3V
逻辑0:0V
(3)TTL电平
逻辑1:5V
逻辑0:0V
3、STM32的USART
USART:Universal synchronous asynchronous receiver transmitter,通用同步异步收发器,常用的是异步通信
(1)特征
①全双工异步通信
②单线半双工通信
③单独的发送器和接收器使能位
④可配置使用DMA的多缓冲器通信
⑤多个带标志的中断源
(2)外设的引脚
USART框图
①USART信号引脚
TX:发送数据输出引脚
RX:接收数据输入引脚
SW_RX:数据接收引脚,属于内部引脚,用于智能卡模式
IrDA_RDI:IrDA 模式下的数据输入
IrDA_TDO:IrDA模式下的数据输出
nRTS:发送请求,若是低电平,表示USART准备好接收数据
nCTS:清除发送,若是高电平,在当前数据传输结束时阻断下一次的数据发送
SCLK:发送器时钟输出,适用于同步传输
②数据寄存器
USART_DR包含了已发送或接收到的数据,它由两个寄存器组成,一个专门给发送用的(TDR),一个专门给接收用的(RDR),该寄存器具备读和写的功能
TDR寄存器提供了内部总线和输出移位寄存器之间的并行接口
RDR寄存器提供了输入移位寄存器和内部总线之间的并行接口
当进行数据发送操作时,往USART_DR中写入数据会自动存储在TDR内;当进行读取操作时,向USART_DR读取数据会自动提去RDR数据
发送数据的流程
接收数据的流程
③控制器
USART有专门控制发送的发送器,控制接收的接收器,还有唤醒单元、中断控制等等
④时钟与波特率
主要功能:为USART提供时钟以及配置波特率,常用的波特率:4800、9600、115200
4、案例
根据接收到不同的指令,进行不同的操作(0x0d--回车--\r;0x0a--换行--\n)
0x21 0x0d 0x0a ----> led0亮
0x22 0x0d 0x0a ----> led0灭
0x23 0x0d 0x0a ----> beep响
0x24 0x0d 0x0a ----> beep不响
串口的配置文件:【免费】32单片机-串口的配置资源-CSDN文库
main.c
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/EXTI/exti.h"
#include "./BSP/BEEP/beep.h"
int main(void){
uint16_t count;
HAL_Init();
sys_stm32_clock_init(RCC_PLL_MUL9); //设置系统时钟
delay_init(72);
led_init();
beep_init();
usart_init(115200); //串口
while (1){
//实时监测状态变量的值
if(g_usart_rx_sta & 0x8000){ //接收到bit15位
count=g_usart_rx_sta & 0x3fff;
HAL_UART_Transmit(&g_uart1_handle,(uint8_t *)g_usart_rx_buf,count,1000); //将指定内容发送出去
/*
分析接收到的内容/指令进行不同的操作
*/
if((g_usart_rx_sta & 0xc000)==0xc000){ // 0xC000表示同时设置了bit15和bit14
if(g_usart_rx_buf[0]==0x21){ //led0亮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
}else if(g_usart_rx_buf[0]==0x22){ //led0灭
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
}else if(g_usart_rx_buf[0]==0x23){ //beep响
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
}else if(g_usart_rx_buf[0]==0x24){ //beep不响
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
}
}
//等待发送完成
while(__HAL_UART_GET_FLAG(&g_uart1_handle,UART_FLAG_TC)!=SET);
g_usart_rx_sta=0;
}else{
delay_ms(20);
}
}
}
HAL_UART_Transmit
用于通过UART(串口)发送数据
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
①参数1:UART句柄,用于标识不同的UART模块
②参数2:要发送的数据缓冲区指针
③参数3:要发送的数据长度
④参数4:发送超时时间,单位为毫秒
__HAL_UART_GET_FLAG
用来获取状态寄存器的标志位
#define __HAL_UART_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR & (__FLAG__)) == (__FLAG__))
①参数1:串口句柄
②参数2:标志位宏
UART_FLAG_TC
#define UART_FLAG_TC ((uint32_t)USART_SR_TC)
#define USART_SR_TC USART_SR_TC_Msk /* 传输完成 */