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

文章列表

嵌入式各协议标准按照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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F4系列微控制器中的UART(通用异步收发器)与DMA(直接存储器访问)是两个与串行通信相关的重要模块。 UART模块是用于串行通信的基本模块,用于将数据转换成串行格式并通过单个数据线传输。它具有高度灵活的配置选项,可以支持不同的波特率、数据度、停止位和校验位。STM32F4的UART模块具有多个硬件流控制机制,如RTS/CTS(请求发送/清除发送)和DTR/DSR(数据终端就绪/数据设备就绪)。通过配置相应的寄存器,可以轻松实现UART的发送和接收操作。 与UART相比,DMA模块是一种更高效的数据传输机制。DMA通过直接访问内存而不通过CPU来完成数据的传输,可以显著降低CPU的负载,并提高数据传输的速度和效率。STM32F4的DMA控制器具有多个通道,可以同时处理多个外设的数据传输。通过配置DMA的寄存器,我们可以指定要传输的数据源地址和目标地址,并设置传输的数据度和传输方向。 当UARTDMA结合使用时,可以进一步提高串行数据传输的效率。通过将UART接收和发送操作与DMA关联起来,可以实现数据的无缺失接收和高速发送。例如,在接收数据时,DMA可以自动将接收的数据从UART的接收寄存器传输到指定的内存区域,而不需要CPU的干预。这样,CPU可以同时执行其他任务,而不会占用大量的处理时间。 总之,STM32F4的UARTDMA模块提供了强大的串行通信功能和高效的数据传输机制。通过合理配置和使用,可以实现稳定可靠的数据传输,并在提高系统性能的同时减轻CPU的负担。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值