文章目录
一、STM32串口中断方式通信
(一)中断方式
中断方式是串口通信的三种工作方式之一,把正常正在运行的程序打断,运行中断服务函数。以下简单介绍串口通信的三种方式。
1.轮询方式
CPU不断检测串口的状态标志来判断数据收发的情况。特点:程序设计简单,但CPU在检测标志位期间,无法执行其他任务,CPU利用率较低。
2.中断方式
使能中断后,接收一字节数据或发送- 字节后申请中断,在ISR中完成后续处理。在数据收发期间,CPU可以执行其他任务,CPU利用率较高。
3.DMA方式
初始化时设置相关参数,启动DMA传输后,数据传输过程不需要CPU的干预。传输完成后,再产生DMA中断,由CPU进行后续处理。传输效率最高。
(二)串口中断方式的特点
1.发送数据时,将-字节数据放入数据寄存器DR;接收数据时,将DR的内容存放到用户存储区;
2.中断方式不必等待数据的传输过程,只需要在每字节数据收发完成后,由中断标志位触发中断,在中断服务程序中放入新的一字节数据或者读取接收到的一字节数据;
3.在传输数据量较大,且通信波特率较高(大于38400)时,如果采用中断方式,每收发-个字节的数据,CPU都会被打断,造成CPU无法处理其他事务。因此在批量数据传输,通信波特率较高时,建议采用DMA方式。
(三)中断方式的接口函数
1.串口中断方式发送函数:HAL_UART_Transmit_IT
(1)函数原型
HAL_ StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart,uint8_t *pData, uint16_t Size)
(2)功能描述
在中断方式下发送一定量的数据
(3)注意事项
①函数将使能串口发送中断。
②函数将置位TXEIE和TCIE,使能发送数据寄存器空中断和发送完成中数,以便重新开启发送中断和TCIE。因此用户采用中断方式连续发送数据时,需要重复调用该函和TCIE。因此用户采用中断方式连续发送数据时,需要重复调用该函。
③当指定数量的数据发送完成后, 将调用发送中断回调函数HAL_UART_TxCpltCallback进行后续处理。
④该函数由用户调用。
(4)发送过程
每发送一个数据进入一次中断,在中断中根据发送数据的个数(Size)来判断数据是否发送完成。
2.串口中断方式接收函数:HAL_UART Receive_lT
(1)函数原型
HAL_StatusTypeDef HAL_UART_Receive_ lT(UART_HandleTypeDef *huart, uint8_ t *pData, uint16_ t Size)
(2)功能描述
在中断方式下接收一定数量的数据。
(3)注意事项
①函数将使能串口接收中断。
②函数将置位RXNEIE,使能接收数据寄存器非空中断RXNE。完成指定数量的数据接收后,将会关闭接收中断,即清零RXNEIE。 因此用户采用中断方式连续接收数据时,要重复调用该函数,以重新开启接收中断。
③当指定数量的数据接收完成后,将调用接收中断回调函数HAL UART RxCpltCallback进行后续处理。
④该函数由用户调用。
(4)接收过程
每接收一个数据进入一次中断,在中断中根据接收数据的个数来判断数据是否接收完成。
3.串口中断通用处理函数: HAL_UART_IRQHandler
(1)函数原型
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
(2)功能描述
作为所有串口中断发生后的通用处理函数入口。
(3)注意事项
①函数内部先判断中断类型,并清除对应的中断标志,最后调用回调函数完成对应的中断处理。
②该函数由CubeMX自动生成。
4.串口发送中断回调函数: HAL_UART_TxCpltCallback
(1)函数原型
void HAL_UART_TxCpltCallback(UART_ HandleTypeDef *huart)
(2)功能描述
回调函数,用于处理所有串口的发送中断,用户在该函数内编写实际的任务处理程序,无返回值。
(3)注意事项
①函数由串口中断通用处理函数HAL_ UART_ lRQHandler调用, 完成所有串口的发送中断任务处理。
②数内部需要根据串口句柄的实例来判断是哪一个串口产生的发送中断。
③函数由用户根据具体的处理任务编写。
5.串口接收中断回调函数: HAL_UART_ RxCpltCallback
(1)函数原型
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
(2)功能描述
回调函数,用于处理所有串口的接收中断,用户在该函数内编写实际的任务功能描述|处理程序。
(3)注意事项
①函数由串口中断通用处理函数HAL UART_ IRQHandler调用,完成所有串口的接收中断任务处理。
②函数内部需要根据串口句柄的实例来判断是哪一个串口产生的接收中断。
③函数由用户根据具体的处理任务编写
(四)串口中断处理过程
二、DMA通信
(一)基本概念
1.直接存储器访问 (DMA)
用于在外设与存储器之间以及存储器与存储器之间进行高速数据传输。DMA传输过程的初始化和启动由CPU完成,传输过程由DMA控制器来执行,无需CPU参与,从而节省CPU资源,提高利用率。
2.DMA数据传输的四个要素
① 传输源 :DMA数据传输的来源
② 传输目标:DMA数据传输的目的
③ 传输数量:DMA传输数据的数量
④ 触发信号:启动一次DMA数据传输的动作
(二)STM32的DMA控制器特点
1.STM32F411微控制器具备两个DMA控制器:DMA1和DMA2,每个
控制器有8个数据流,每个数据流可以映射到8个通道(或请求);
2. 每一个DMA控制器用于管理一个或多个外设的存储器访问请求,并通过总线仲裁器来协调各个DMA请求的优先级;
3. 数据流(stream)是用于连接传输源和传输目标的数据通路,每个数据流可以配置为不同的传输源和传输目标,这些传输源和传输目标称为通道(Channel);
4. 具备16字节的FIFO。使能FIFO功能后,源数据先送入FIFO,达到FIFO的触发阈值后,再传送到目标地址。
(三)DMA数据传输方式
1.普通模式
传输结束后(即要传输数据的数量达到零),将不再产生DMA操作。若开始新的DMA传输,需在关闭DMA通道情况下,重新启动DMA传输。
2.循环模式
可用于处理环形缓冲区和连续数据流(例如ADC扫描模式)。当激活循环模式后,每轮传输结束时,要传输的数据数量将自动用设置的初始值进行加载, 并继续响应DMA请求
(四)DMA方式的接口函数
1 .串口DMA方式发送函数:HAL_UART_Transmit_DMA
(1)函数原型
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart,uint8_t *pData, uint16_t Size)
(2)功能描述
在DMA方式下发送一定数量的数据.
(3)注意事项
①该函数将启动DMA方式的串口数据发送
② 完成指定数量的数据发送后,可以触发DMA中断,在中断中将调用发送中断回调函数HAL_UART_TxCpltCallback进行后续处理
③该函数由用户调用
2 串口DMA方式接收函数:HAL_UART_Receive_DMA
(1)函数原型
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart,uint8_t *pData, uint16_t Size)
(2)功能描述
在DMA方式下接收一定数量的数据
(3)注意事项
①该函数将启动DMA方式的串口数据接收
②完成指定数量的数据接收后,可以触发DMA中断,在中断中将调用接收中断回调函数HAL_UART_RxCpltCallback进行后续处理
③该函数由用户调用
3.获取未传输数据个数函数__HAL_DMA_GET_COUNTER
(1)函数原型
_HAL_DMA_GET_COUNTER(HANDLE)
(2)功能描述
获取DMA数据流中未传输数据的个数。
(3)注意事项
①该函数是宏函数,进行宏替换,不发生函数调用
② 该函数需要由用户调用,用于获取未传输数据的个数
三、总结
本文是在进行实验操作之后根据串口通信的文档内容进行总结的,在STM32F103C8T6的开发板上进行字符串的串口通信中不曾注意到在发送字符串中途会产生中断,因此需要一个数组对字符串进行缓存。关于串口通信的知识仍然需要进一步的学习。
参考文献:
https://blog.csdn.net/qq_46467126/article/details/121055475
串口通信PDF文档