STM32-HAL库串口DMA空闲中断的正确使用方式及SBUS信号解析

2024-09-03 07:44

本文主要是介绍STM32-HAL库串口DMA空闲中断的正确使用方式及SBUS信号解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

STM32微控制器广泛用于嵌入式系统,其HAL(Hardware Abstraction Layer)库简化了硬件访问,提高了开发效率。在STM32中,使用DMA(Direct Memory Access)进行串口通信可以显著提高数据传输效率,减少CPU负载。本文将介绍如何在STM32中正确使用串口DMA空闲中断,并解析SBUS信号。

串口DMA空闲中断

在STM32中,串口DMA传输完成后,可以通过配置空闲中断(IDLE interrupt)来处理接收到的数据。空闲中断在接收到的数据帧之间检测到空闲信号时触发。

1. 配置DMA和串口

首先,需要配置串口和DMA以实现数据的接收。

#include "stm32f4xx_hal.h"UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart2_rx;void MX_USART2_UART_Init(void) {huart2.Instance = USART2;huart2.Init.BaudRate = 115200;huart2.Init.WordLength = UART_WORDLENGTH_8B;huart2.Init.StopBits = UART_STOPBITS_1;huart2.Init.Parity = UART_PARITY_NONE;huart2.Init.Mode = UART_MODE_TX_RX;huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart2.Init.OverSampling = UART_OVERSAMPLING_16;HAL_UART_Init(&huart2);
}void MX_DMA_Init(void) {__HAL_RCC_DMA1_CLK_ENABLE();hdma_usart2_rx.Instance = DMA1_Stream5;hdma_usart2_rx.Init.Channel = DMA_CHANNEL_7;hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;hdma_usart2_rx.Init.Mode = DMA_CIRCULAR;hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;hdma_usart2_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;HAL_DMA_Init(&hdma_usart2_rx);__HAL_LINKDMA(&huart2, hdmarx, hdma_usart2_rx);
}

2. 启用空闲中断

在初始化串口时,需要启用空闲中断。

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) {GPIO_InitTypeDef GPIO_InitStruct = {0};if(uartHandle->Instance == USART2) {__HAL_RCC_USART2_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF7_USART2;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);HAL_NVIC_EnableIRQ(USART2_IRQn);}
}

3. 处理空闲中断

在中断服务例程中处理空闲中断。

void USART2_IRQHandler(void) {HAL_UART_IRQHandler(&huart2);
}void HAL_UART_IdleCallback(UART_HandleTypeDef *huart) {if (huart->Instance == USART2) {// 处理接收到的数据}
}

解析SBUS信号

SBUS是一种串行总线协议,常用于遥控飞机和无人机。SBUS信号解析包括读取数据、解码和应用。

1. 读取SBUS数据

使用DMA接收SBUS数据。

uint8_t sbus_data[25]; // SBUS数据帧大小为25字节void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {if (huart->Instance == USART2) {// 解析SBUS数据parse_sbus(sbus_data);HAL_UART_Receive_DMA(&huart2, sbus_data, 25);}
}

2. 解析SBUS数据

解析SBUS数据帧,提取控制信号。

void parse_sbus(uint8_t *data) {int16_t channels[16];for (int i = 0; i < 16; i++) {channels[i] = (data[2 * i] << 8) | data[2 * i + 1];channels[i] -= 172; // 偏移量channels[i] = (channels[i] * 100) / 33; // 缩放}// 应用控制信号
}

注意事项

  1. DMA配置:确保DMA配置正确,包括通道、优先级和数据对齐。
  2. 中断优先级:合理配置中断优先级,避免中断冲突。
  3. 数据同步:在多任务环境中,注意数据同步和互斥。

通过上述步骤和代码示例,你应该能够在STM32中正确使用串口DMA空闲中断,并解析SBUS信号。这为开发高性能的嵌入式系统提供了有力支持。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

这篇关于STM32-HAL库串口DMA空闲中断的正确使用方式及SBUS信号解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132434

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma