串行通信&UART协议梳理附STM32平台采用DMA以UART方式收发不定长信息

文章详细梳理了串行通信中的UART、SPI和I²C协议,解释了它们在OSI模型中的位置,特别是UART的物理层和数据链路层规范。此外,还介绍了如何在STM32平台上利用DMA进行UART方式的收发操作,以及中断处理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章列表

嵌入式各协议标准按照OSI模型的思路进行逐个梳理,文章列表如下:

  1. 串行通信&UART协议梳理附STM32平台采用DMA以UART方式收发不定长信息
  2. I²C总线协议梳理附STM32平台I2C总线SSD1306OLED屏幕软件模拟方式驱动
  3. SDIO协议梳理附SD卡读写以及FATFS移植实例
  4. SPI协议梳理附SSD1306OLED屏幕驱动

Serial communication(串行通信)

串行通信是一种相对于并行通信的概念。指的是信号在1bit带宽的线路上进行传输;例如一字节信息即八位需要一位一位由高位到低位或由低位到高位逐位传输,而并行通信则是多bit带宽线路,传输以字节信息可能是八位同时发送,通过信号线判断所在位的信号,缺陷在于多条线信号同步要求很高,在实际干扰环境下通信效率可能不如串行通信。

直到这里串行通信的概念只是一个十分笼统的理论模型,并没有规定任何协议而只是一个通信思路。不涉及OSI模型的任何一层。

UART,SPI,I²C,CAN都是串行通信的思想。

UART(通用异步收发)

UART是一种将串行通信思想付诸实现的一种,串行,异步通信总线协议,囊括了232,485等各类接口标准规范和总线标准规范。UART协议较为宽泛地规定了标准,涉及OSI模型的物理层和数据链路层。

物理层

协议项协议内容
通信模式全双工
链接线电气特性全双工模式3根线:TX(发送线),RX(接收线),GND(地线)
电平值视具体协议
速度波特率:1200bit/s~115200bit/s
主从模式单主单从,一一对应,互为主从,主从波特率需要一致

硬件连接:

主机 从机 TX 主机TX RX GND RX 主机RX TX 主机 从机

数据链路层

UART协议帧格式(一般是高位->低位):

bit数具体操作
起始位1 bit不传输时保持高电平,拉低到低电平保持一个波特周期即生效
数据位5~8 bit一般传输一个字节,所以是8bit
奇偶效验位0~1 bit0:数据位中1的个数是偶数,1:数据位中1的个数是奇数
停止位1~2 bit从低电平拉升到高电平保持一到两个波特周期即生效

传输时帧内无间隔,相邻两帧间隔任意时长。

UART&USART

USART相较于UART的不同点:

UARTUSART
传输线信号线,地线信号线,地线,时钟线
波特率从机需要知道主机的波特率从机不需要知道主机的波特率,来源于主控提供的时钟信号
传输单位由若干bit组成的字符由若干字符组成的信息帧(块)
单位格式起始位+数据位+奇偶校验位+停止位同步字符+数据位+字符校验位
传输间隔相邻两个字符间隔任意时长一个信息帧内,字符与字符之间无间隔
时钟信号时序要求低,使用各自的时钟信号,只需要波特率相同时序要求高,使用同频同相的时钟路线
优点简单传输效率高
缺点传输效率低(传输一个字符要增加20%的附加信息位)复杂

STM32平台采用DMA以UART方式收发不定长信息(使用Cube MX生成HAL库)

主函数核心代码:

#define LENGTH 128

uint8_t rxcount;
uint8_t rxbuf[LENGTH]={0};
extern uint8_t rxflag;
extern DMA_HandleTypeDef hdma_usart1_rx;

int fputc(int ch,FILE *fp){
  HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);
  return ch;
}

int main(void)
{
  __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
  HAL_UART_Receive_DMA(&huart1,(uint8_t *)rxbuf,LENGTH);

  while (1)
  {
    if(rxflag==1){
      rxflag=0;
      HAL_UART_DMAStop(&huart1);
      rxcount=LENGTH-__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
      HAL_UART_Transmit(&huart1,(uint8_t *)rxbuf,rxcount,HAL_MAX_DELAY);
      memset(rxbuf,0,LENGTH);
      HAL_UART_Receive_DMA(&huart1,(uint8_t *)rxbuf,LENGTH);
    }
  }
}

中断句柄核心代码:

volatile uint8_t rxflag=0;
extern DMA_HandleTypeDef hdma_usart1_rx;
extern UART_HandleTypeDef huart1;

void USART1_IRQHandler(void)
{
  HAL_UART_IRQHandler(&huart1);
  //USART_SR(IDLE位:Bit 4,只读)
  //当一帧数据接收完成线路空闲后IDLE便会置1中断
  if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE))==SET){
    __HAL_UART_CLEAR_IDLEFLAG(&huart1);
    rxflag=1;
  }
}

USART_SR IDLE位说明:

This bit is set by hardware when an Idle Line is detected. An interrupt is generated if the IDLEIE=1 in the USART_CR1 register. It is cleared by a software sequence (an read to the USART_SR register followed by a read to the USART_DR register).

  • 0: No Idle Line is detected
  • 1: Idle Line is detected

Note: The IDLE bit will not be set again until the RXNE bit has been set itself (i.e. a new idle line occurs).

USART_CR1 IDLEIE位说明:

IDLEIE: IDLE interrupt enable
This bit is set and cleared by software.

  • 0: Interrupt is inhibited
  • 1: A USART interrupt is generated whenever IDLE=1 in the USART_SR register
### 回答1: STM32UART DMA FIFO接收功能是通过使用DMA(直接存储器访问)来实现的。DMA是一种直接从外设设备到内存(或相反)进行数据传输的技术,在UART中,它可以用于接收通过串口传输的数据。 在使用DMA FIFO接收功能时,首先需要将UART设置为工作在DMA模式下。然后,需要配置DMA通道相关的寄存器,以指定DMA传输的源地址目标地址,以及传输的数据长度。 接下来,创建一个FIFO(First In First Out)缓冲区,用于存储接收到的数据。FIFO可以是一个数组或使用专门的FIFO库或数据结构。在每次接收到数据时,将数据存储在FIFO中。可以使用指针来跟踪FIFO的读写位置。 一旦配置好DMAFIFO,就可以开始接收数据了。当UART接收到新的数据时,它会触发DMA请求,自动将接收到的数据传输到指定的目标地址。DMA会根据配置的设置自动进行数据的传输。 在数据接收完成后,可以通过检查DMA传输的标志位或使用中断来通知数据接收完成。然后,可以从FIFO中读取接收到的数据,并进行相应的处理。 使用DMA FIFO接收功能可以提高接收数据的效率可靠性。由于DMA的高速传输FIFO的缓存功能,可以减少CPU的运算压力,提高系统的性能。 总而言之,STM32UART DMA FIFO接收功能通过使用DMAFIFO来实现串口数据的高效接收,适用于需要高速可靠数据传输的应用场景。 ### 回答2: 在STM32微控制器中,UART是一种常用的通信接口,而DMA(直接内存访问)是一种特殊的数据传输方式,用于提高数据传输的效率。在UART接收数据时,使用DMA FIFO接收模式可以使数据的接收更加高效。 首先,使用DMA FIFO接收模式需要先使能相应的UART接收DMA请求。在STM32的寄存器中,可以设置DMA控制器UART之间的数据流向,使DMA能够自动接收UART传输的数据。 然后,设置DMA通道的配置参数。在配置参数中,需要指定DMA的传输方向为从外设到内存,并设置外设数据宽度、内存数据宽度、传输大小等参数。通过配置这些参数,DMA可以按照指定的方式UART接收数据并存储到内存中的指定位置。 接着,配置DMA FIFO模式。在DMA的相关寄存器中,可以设置DMA在FIFO模式下的工作方式,如FIFO传输使能、FIFO接收阈值等参数。通过配置这些参数,可以控制DMA的数据传输方式,以适应具体的应用需求。 最后,启动DMA传输。在配置DMA相关寄存器后,可以通过设置相关的标志位或调用相关的函数启动DMA传输。一旦启动了DMA传输,DMA会自动从UART接收数据并存储到内存中,无需CPU的干预。 总之,通过配置STM32UARTDMAFIFO参数,并启动DMA传输,可以实现高效的UART接收数据。这种方式减少了CPU的负担,提高了数据传输的效率,特别适用于大量数据的接收处理。 ### 回答3: 在STM32微控制器中,UART是一种通用异步收发传输接口,而DMA是直接内存访问控制器,用于实现高效的数据传输。FIFO(First-In-First-Out)则是一种数据缓冲区,用于存储串口接收的数据。 使用UART DMA FIFO接收数据的过程如下: 首先,需要配置UARTDMA的相关寄存器。通过设置UART的波特率、数据位数、停止位数等参数,以及DMA的通道、传输方向缓冲区地址等信。 接着,可以启用UART的接收中断并设置接收缓冲区的大小。当接收到数据后,将触发中断,并将数据存储在接收缓冲区中。 然后,配置DMA的传输方式。可以选择单次传输还是循环传输,以及传输长度等。 接下来,将DMA的源地址设置为UART的数据寄存器地址,将目标地址设置为FIFO缓冲区的地址,然后启动DMA传输。 最后,可以通过查询或DMA中断来检测DMA传输是否完成。当传输完成时,可以读取FIFO缓冲区中的数据,并进行相关处理。 总结来说,STM32UART DMA FIFO接收过程包括配置UARTDMA的相关寄存器、启用接收中断、设置接收缓冲区、配置DMA传输方式、启动DMA传输检测传输完成,以实现高效的数据接收。使用UART DMA FIFO可以减少CPU的工作负载,提高系统的响应速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值