STM32——关于USART的讲解与应用(一)(看完这篇你就懂了)

        在STM32中,我们使用USART的目的是为了建立设备之间的通讯,实现微控制器与外部设备之间的数据传输,允许通过串行接口发送和接收数据。而USART(通用同步/异步收发器)给予是一种用于串行通信的外设模块。

        当我们在设备之间建立了一种通信之后,我们就要进行通信了。但是,我们如何懂得对方所发送的信息呢?比如说在微信上,我向你发送了“你好,世界”,对方给你回复“Hello,World”,我们如何知道对方发送的信息含义呢?对方又是如何知道我给它发送的信息含义呢?这里就需要定义一种规则,比如都说中文或者都说英文,当然了,在MCU和外部设备之间,我们也要有这样的一种规则,这里就是我们所说的通信协议了,让双方都按照协议的规则来进行收发数据。

 


 上面只是我们定义了通信协议,然后我们还需要知道对方使用什么硬件电路来进行发送和接收,比如,我向你发送数据使用BB机,你给我发送数据则使用手机,那么,我们两个之间肯定无法建立有效的连接,所以,我们也就无法进行通信,所以下面也就是定义了我们之间互相通信的硬件信息。

  • 双向串口通信有两根通信线(发送端TX和接收端RX)
  • TX和RX要交叉连接
  • 当只需单向的数据传输时,可以只接一根通信线
  • 当电平标准不一致时,需要加电平转换芯片

在上面提到了电平标准,我们要知道比如说你打电话时,你在国内互相通信是完全没有问题的。但是当你需要向国外打电话时,你就需要知道对方国家的代码和区号等等,所以这里就有一个标准了。

  •  电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压和数据的对应关系。串口常用的电平标准有以下三种:
  • TTL电平(USART):+3.3V或5V表示1,0V表示0
  • RS232电平:-3~-15V表示1,+3~+15V表示0
  • RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)

当我们都把所有的准备工作做好以后,我们知道,我们该给对方发信息了,但是,我们如何来确保对方接收到的信息都是正确的呢?这里,我们就需要对信息来进行一个处理,以确保对方所接收到的信息都是正确的。

 上面这两个时序图,是串口发送一个字节的格式。在串口中。每一个字节都装载在一个数据帧里面,每个数据帧都由起始位、数据位、停止位这三个部分组成。

我们的数据位可分为添加奇偶检验位(数据位为9位)和不添加奇偶检验位(数据位为8位),接下来我们来看一下串口的参数:

  • 波特率:串口通信的速率
  • 起始位:标志一个数据帧的开始,固定为低电平
  • 数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行
  • 检验位:用于数据验证,根据数据位计算得来
  • 停止位:用于数据帧间隔,固定为高电平

        由于串口是异步通信,故需要通信双方来约定一个通信速率,比如我每隔1秒发送一位数据,那你也就得每隔1秒接收一位数据。假设当你接收的速率过快,那么你就会重复接收某些位数据。当你接受的速率过慢,那么你就会错过接收某些数据。

        当我们在发送数据的时候,我们必须要先发送一个起始位,这个起始位必须是低电平,用来打破空闲状态的高电平,使得其产生一个下降沿信号,这里的下降沿就相当于一个标志,高速接收设备,这一帧数据要开始传输,你要准备好接收数据了。同理,也就是为什么要有一个停止位,用来告诉设备我传输完数据了。可以准备开始下一帧数据的传输了,这也就是为什么要将停止位置为高电平。

        起始位固定为0,产生下降沿,表示传输数据开始。停止位固定为1,产生上升沿,表示传输数据结束。

        在串口中,使用一种叫奇偶检验的数据验证方法,奇偶检验可以用来判断数据是不是传输错误了。如果数据出错,可以选择丢弃或者要求重传。校验可以选择三种方式,无校验,奇校验、偶校验。

  • 无校验:就是不需要对数据进行校验,如上图的左边所示。起始位、数据位、停止位三部分。
  • 奇校验、偶校验:如上图的右边所示。起始位、数据位、校验位、停止位四部分。

如果使用奇校验,那么包括校验位在内的9位数据会出现奇数个1。如果使用偶校验,那么包括校验位在内的9位数据会出现偶数个1。


USART可以用于以下几个目的:

1.与外部设备进行通信:通过USART,STM32微控制器可以与其他设备(如计算机、传感器、显示屏等)进行双向通信。它可以实现异步通信(不同设备之间的通信速率可以不同)或同步通信(设备间通信速率相同)。

2.调试和日志输出:USART可以被用于将调试和日志信息从微控制器发送到计算机。这在开发和调试应用程序时非常有用,可以帮助检测错误和跟踪程序执行过程。

3.Bootloader和固件更新:通过USART,可以实现微控制器的固件更新和bootloader的功能。这样可以方便地在外部设备连接时更新或改变程序功能。

4.串行通信接口替代:USART还可以替代其他串行通信接口,如SPI(串行外设接口)或I2C(串行总线接口),在某些特定应用中提供更高的灵活性和性能。

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的STM32F103 USART的代码示例: ``` #include "stm32f10x.h" void USART_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // 配置GPIO引脚 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; // 配置PA9为TX,PA10为RX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置USART RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 使能USART1时钟 USART_InitStructure.USART_BaudRate = 115200; // 设置波特率为115200 USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 数据位为8位 USART_InitStructure.USART_StopBits = USART_StopBits_1; // 停止位为1位 USART_InitStructure.USART_Parity = USART_Parity_No; // 无校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无硬件流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 同时开启接收和发送 USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); // 使能USART } void USART_SendChar(char ch) { while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); // 等待发送缓冲区为空 USART_SendData(USART1, ch); // 发送一个字节 } char USART_ReceiveChar(void) { while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); // 等待接收到数据 return USART_ReceiveData(USART1); // 返回接收到的数据 } int main(void) { USART_Init(); // 初始化USART while (1) { char ch = USART_ReceiveChar(); // 从串口接收一个字符 USART_SendChar(ch); // 发送接收到的字符 } } ``` 在上面的代码中,我们使用了USART1模块,配置了PA9和PA10引脚作为USART的TX和RX引脚。在USART_Init()函数中,我们先初始化GPIO引脚,然后配置USART的各个参数,最后使能USART。在USART_SendChar()函数中,我们等待发送缓冲区为空,然后发送一个字节。在USART_ReceiveChar()函数中,我们等待接收到数据,然后返回接收到的数据。在main()函数中,我们不断从串口接收一个字符,并将它发送回去。 这只是一个简单的USART的代码示例,实际应用中还需要根据具体需求进行配置和使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xa_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值