当前位置: 首页 > news >正文

解析UART空闲中断与DMA接收机制

目录

1.打开空闲接收中断

如何使用 HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA 打开空闲接收中断,以及其中的关系?

2.HAL_UART_RxCpltCallback 回调函数和 HAL_UARTEx_RxEventCallback 回调函数的区别?

1.打开空闲接收中断

如何使用 HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA 打开空闲接收中断,以及其中的关系?

如果 UART 和 DMA 一起使用的时候,他们各自是两个外设,他们彼此的中断是互相独立的,不要把他们混淆在一起。

HAL 库中,一旦打开空闲中断,则默认打开半满(DMA)中断和全满(DMA)中断。

HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); (胶水接口 DMA + UART)

  • 参数一:串口的对象 (UART)

  • 参数二:指向的地址空间(自增地址)(DMA)

  • 参数三:最大的搬运数据 (DMA)

中断一:half size of receive (半满)(DMA 的中断回调:DMA2_Stream2_IRQHandler(void))

DMA 在搬运完一半 Size 大小后的数据,产生中断事件。

此中断产生后,不会去重新配置串口外设的寄存器,仅仅是发生中断,可以在中断回调函数中处理一些事情(比如发送信号量给串口数据处理线程)

中断二:cplt size of receive (全满) (DMA 的中断回调:DMA2_Stream2_IRQHandler(void))

DMA 在搬运完 Size 大小后的数据,产生中断事件。

此中断产生后,会重新配置 DMA 的待搬运计数寄存器,从整个 buffer 的头再去装数,可能开始产生覆盖之前数据的情况。

中断三:Idle 中断(当串口的起始位持续一个字节的时间都没有到来的时候,触发空闲中断) (UART 的中断回调 HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size))

中断触发原理:串口外设在一个字节长的时间中没有接收到串口起始位,则发生中断 IDLEI。IDLEIE(空闲中断使能寄存器)

三个中断的配合例子,中断一(DMA 半满中断),中断二(DMA 全满中断),中断三(串口空闲中断)之间的关系:

当使用 HAL_UARTEx_ReceiveToIdle_DMA 函数时,假设参数三 Size 是 32 字节(半满 16 字节)。

当发送 17 个字节时,会先进入中断一(DMA 半满中断),然后再进入中断三(串口空闲中断)。

当发送 15 个字节时,会直接进入中断三(串口空闲中断)。

当发送 33 个字节时,会先进入中断一(DMA 半满中断),然后进入中断二(DMA 全满中断),然后进入中断三(串口空闲中断)。并且,由于是 33 个字节,如果这个时候 DMA 的配置为 DMA_NORMAL 模式,则第 33 个字节会被丢掉。如果,DMA 被配置为 DMA_CIRCULAR,则第 33 个字节会覆盖最开始的第一个字节。

2.HAL_UART_RxCpltCallback 回调函数和 HAL_UARTEx_RxEventCallback 回调函数的区别?

HAL_UART_RxCpltCallback,主要用于固定长度的 UART 接收,当接收到设定长度的数据后触发。

HAL_UART_Receive_IT HAL_UART_Receive_DMA 函数 (实验内容中的 1~4 步均是这个回调),接收到指定长度的时候会调用,不适用于接收可变长的串口数据。

HAL_UARTEx_RxEventCallback,主要用于可变长度的数据接收,特别是结合空闲行检测,可以在接收到不确定长度的数据时触发。通常与 DMA 接收模式一起用,主要用于 HAL_UARTEx_ReceiveToIdle_DMA 函数(实验内容中的第 5 步是这个回调),当检测到空闲,或者到达 DMA 最大缓冲时,使用这个回调。

http://www.dtcms.com/a/410190.html

相关文章:

  • 重庆网站建设百度推广wordpress 随机一句话
  • 企业数据采集实战(二):设备多样性与异构性问题的挑战
  • Android Handler源码阅读
  • JavaWeb项目部署02(Docker)
  • VMware+RockyLinux+ikuai+docker+cri-docker+k8s+calico BGP网络 自用 实践笔记(底稿)
  • 意力机制 | 添加Deformable-LKA可变形大核注意力
  • Android Automotive OS架构
  • 企业网站访问量的第一来源是( )上海兼职网站制作
  • 《AI协同开发深潜:从架构迷雾到系统澄明的实战路径》
  • 专业的营销型网站建设企业方案项目策划书怎么写
  • 光环状态类型释义
  • Doris数据库-常用功能
  • MySQL中的空间碎片率计算分析
  • Python爬虫实战:获取东方财富网游戏板块数据与市场趋势分析
  • 【深度学习计算机视觉】07:单发多框检测(SSD)
  • 提取网站子页面邮箱文化馆建设网站
  • 大数据安全解决方案(PPT)
  • AI大模型学习(14)AI 小白入门!用 OpenCV+Python 打造人体姿态识别系统,超详细教程来了
  • 使用 Azure AD 实现认证与权限管理:原理解析与操作指南
  • 莆田网站建设收费标准广州金山大厦 网站建设
  • Lombok注解使用无效的情况(未能获得后端数据)
  • 网络原理-网络层
  • Flink 容错从状态后端到 Exactly-Once
  • 怎样做门窗网站网站首页被k还有救吗
  • 一体化DevOps平台选型新思维:如何打破研发与运维的壁垒?
  • 2025年14款DevOps理念的项目管理软件促进高效协同
  • 【音视频】pjsua2库:Account 用户注册详解
  • (Arxiv-2025)Lynx:迈向高保真个性化视频生成
  • 学习项目movie-web:构建本地电影、电视视频中心
  • QT音视频