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 /* 传输完成 */

相关推荐
hallo-ooo几秒前
【STM32】定时器
stm32·单片机
二块烧肉3 小时前
STM32 IIC总线
stm32·单片机·嵌入式硬件
weixin_501278943 小时前
关于用SysTick配置延迟函数的设置
单片机·嵌入式硬件
广药门徒3 小时前
电脑RGB888P转换为JPEG方案 ,K230的RGB888P转换为JPEG方案
stm32·单片机
2401_888859715 小时前
STM32 DMA直接存储器存取
stm32·单片机·嵌入式硬件
智者知已应修善业5 小时前
【51单片机6位数码管显示时间与秒表】2022-5-8
c语言·c++·经验分享·笔记·单片机·算法·51单片机
路弥行至8 小时前
stm32卡在SystemClock_Config();的解决方法
stm32·单片机·嵌入式硬件
承前智8 小时前
基于ArduinoIDE的任意型号单片机 + GPS北斗BDS卫星定位
单片机·嵌入式硬件
不脱发的程序猿9 小时前
单片机裸机环境下临界区保护
单片机·嵌入式硬件