(stm32之HAL库)UART工作在DMA模式要打开串口中断吗?_hal uart dma-CSDN博客
串口简介
串口是串行接口的简称
常用串口:RS232
,RS485
,USB(Universal Serial Bus)
通用串行接口,TTL
串口
TTL
是Transistor-Transistor Logic
的简写,是一种电平逻辑,晶体管-晶体管逻辑
USART简介
USART,即通用同步/异步收发传输器(Universal Asynchronous Receiver/Transmitter),是单片机上的一个外设
UART遵循异步串行通信协议的,USRT遵循同步串行通信协议 异步不需要统一时钟信号,同步需要统一时钟信号
一般使用最多的是UART,我们此次学习也是针对UART
UART通信协议
- 起始位:发出1位低电平信号,表示开始传输字符
- 数据位:真正发送的数据,一般为8位(1个字节),常采用ASCII编码,从最低位开始发送
- 校验位:用于检验接收到的数据是否正确,分为奇校验和偶校验
- 停止位:一组数据的结束传输的标志。可以是1位、1.5位、2位的高电平
- 空闲位:空闲时数据线为高电平状态,代表无数据传输
- 波特率:衡量传输速率的指标。UART通信中波特率等于比特率
UART发送/接收机制
UART发送端口,首先是CPU将数据放入数据发送寄存器,然后发送移位寄存器会将数据从数据发送寄存器 取出进行移位并通过UART_TX
发送出去
UART接收端口,首先是UART_RX
接收串行数据至接收移位寄存器,接收移位寄存器将串行数据移位变换为并行数据给数据接收寄存器,再通过APB总线给STM32内部
UART模式
轮询模式
CPU不断查询发送数据寄存器或者接受数据寄存器导致程序的阻塞
发送
在UART
底层有发送移位寄存器和发送数据寄存器,发送数据时,需要CPU将发送数据寄存器的数据移动至发送移位寄存器,然后UART
按照指定的波特率发送数据,CPU则不断查询数据发送寄存器是否空,如果空则需要移动数据进来
接收
在UART
底层有接收移位寄存器和接收数据寄存器,接收数据时,UART
按照指定的波特率接收数据至接收移位寄存器,然后数据会存储在接收数据寄存器,CPU则不断查询数据接收寄存器是否有数据,如果有数据,CPU会把寄存器的数据移动至我们用来接收数据的变量的内存里
当HAL_UART_Receive
执行完成,我们就可以知道数据接收完成
中断模式
使用中断模式时,需要先配置UART的NVIC
中断设置
底层中断实现数据每传送一字节,召回CPU继续运输数据,不需要我们考虑,HAL
库底层已经帮我们实现
上层中断实现数据接收完成后的数据处理,通过中断回调函数实现,需要我们自己设计
发送
CPU将数据送入 发送数据寄存器,然后就去执行其他代码,当发送移位寄存器的数据发送后,发送数据寄存器空,会触发发送数据寄存器空中断,CPU再次将数据送入 发送数据寄存器,然后又去执行其他代码,所有数据发送完成后会触发 传送完成中断,调用HAL_UART_TxCpltCallback
中断回调函数
接收
CPU在处理其他代码,接收移位寄存器将一帧数据移动至 接受数据寄存器后,会触发 接收数据寄存器非空中断,CPU会回来将 接收数据寄存器 的数据移动至我们用来接收数据的变量的内存里,然后又去执行其他代码,所有数据完成后会调用_HAL_UART_RxCpltCallback_
中断回调函数处理接收的数据
而执行HAL_UART_Receive_IT
后,我们不能直接对数据继续处理,数据还没接收完成,因为CPU不会进入阻塞态,会去执行其他代码,需要通过HAL_UART_RxCpltCallback
回调函数处理接收的数据
DMA模式
DMA,全称为Direct Memory Access
,直接内存访问,本质是将传输数据从一个内存空间搬运至另一个内存空间,可以用来提供外设和内存,内存和外设之间的高速数据传输
DMA模式中也会有中断参与,在Cube
配置中需要开启中断
发送
在普通的轮询USART
中,CPU一直在等待外设发送数据,外设每发送一帧数据,CPU就从内存中移动一帧数据到外设的寄存器
在中断的USART
中,外设每从寄存器中发送一帧数据,就会触发一次发送数据寄存器空中断,使CPU回来将数据从内存搬运至外设的寄存器中
没有DMA的话,CPU会作为数据发送的中转站,而使用DMA的话,整个数据传输过程不需要CPU的参与,由DMA代理执行,DMA负责将内存数据搬运至外设的传输寄存器
接收
在普通的轮询USART
中,CPU一直在询问外设是否接收完数据,外设接收一帧数据,该位数据由CPU从外设的数据接收寄存器运进内存,CPU再次询问外设是否接收完数据,再运,直至整个数据接收完成
而在中断USART
中,外设每接收一帧数据,触发一次数据接收寄存器非空中断,CPU过来将数据从寄存器搬运至内存,所有数据接收完成后,会调用接收完成中断回调函数(HAL_UART_RxCpltCallback
)
没有DMA的话,CPU会作为数据转运的中转站,而使用DMA的话,整个数据转运过程不需要CPU的参与,由DMA代理执行
Cube配置解析
基础参数配置
- Baud Rate:波特率
- Word Length:包含校验位在内的数据包长度
- Parity:奇偶校验位
- Stop Bits:停止位位数
- Data Direction:发送和
NVIC配置
如果使用中断模式,需要在NVIC settings
开启USARTi global interrupt
DMA配置
- Add:选择添加
USARTi_RX
的DMA
或者USARTi_TX
的DMA
- Delete:删除对应的DMA
- Mode:选择
normal
模式或者circular
模式 - Data Byte:数据传输的位数
- Increment Address:开启地址自增,外设只有一个寄存器,地址固定,不需要开启地址自增,而内存中我们存数据的变量是数组,接受一字节数据后需要往后移,需要开启地址自增
- Priority:优先级设置
- Direction:方向,固定死的
GPIO配置
一般用来查看引脚的GPIO
配置,不需要更改(有特殊需求时,可以按需修改)
在GPIO Settings
处可以查看TX
和RX
的GPIO
引脚配置,此处可以看到RX
为输入模式,无上拉无下拉
HAL库UART常用函数
轮询模式
|
|
中断模式
只能接收一次,接收完成后需要再次开启
|
|
DMA模式
(stm32之HAL库)UART工作在DMA模式要打开串口中断吗?_hal uart dma-CSDN博客
|
|
HAL
库中使用的HAL_UART_Transmit_DMA
,HAL_UART_Receive_DMA
等都有中断的参与,需要在Cube
中开启中断
Demo
接收定长数据Nomad_violet
,同时在主函数中翻转小灯
轮询实现数据收发
Cube配置
模式选择为异步
波特率选择115200 Bit/s
,其余不动即可
将PA8
配置为GPIO_Output
GPIO
配置保持默认即可
代码实现
|
|
中断实现数据收发
Cube配置
配置同上,只需额外开启中断即可
代码实现
|
|