使用HAL库的STM32工程,实现DMA传输USART发送接收数据
以串口3为例,初始化部分为STM32CubeMX生成代码
串口初始化
UART_HandleTypeDef huart3;
DMA_HandleTypeDef hdma_usart3_rx;
DMA_HandleTypeDef hdma_usart3_tx;/* USART3 init function */
void MX_USART3_UART_Init(void)
{/* USER CODE BEGIN USART3_Init 0 *//* USER CODE END USART3_Init 0 *//* USER CODE BEGIN USART3_Init 1 *//* USER CODE END USART3_Init 1 */huart3.Instance = USART3;huart3.Init.BaudRate = 115200;huart3.Init.WordLength = UART_WORDLENGTH_8B;huart3.Init.StopBits = UART_STOPBITS_1;huart3.Init.Parity = UART_PARITY_NONE;huart3.Init.Mode = UART_MODE_TX_RX;huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart3.Init.OverSampling = UART_OVERSAMPLING_16;huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;if (HAL_UART_Init(&huart3) != HAL_OK){Error_Handler();}/* USER CODE BEGIN USART3_Init 2 *//* USER CODE END USART3_Init 2 */
}void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};if(uartHandle->Instance == USART3){/* USER CODE BEGIN USART3_MspInit 0 *//* USER CODE END USART3_MspInit 0 *//** Initializes the peripherals clock*/PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART3;PeriphClkInit.Usart3ClockSelection = RCC_USART3CLKSOURCE_PCLK1;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}/* USART3 clock enable */__HAL_RCC_USART3_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();/**USART3 GPIO ConfigurationPC4 ------> USART3_TXPC5 ------> USART3_RX*/GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF7_USART3;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);/* USART3 DMA Init *//* USART3_RX Init */hdma_usart3_rx.Instance = DMA1_Channel3;hdma_usart3_rx.Init.Request = DMA_REQUEST_2;hdma_usart3_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;hdma_usart3_rx.Init.PeriphInc = DMA_PINC_DISABLE;hdma_usart3_rx.Init.MemInc = DMA_MINC_ENABLE;hdma_usart3_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;hdma_usart3_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;hdma_usart3_rx.Init.Mode = DMA_NORMAL;hdma_usart3_rx.Init.Priority = DMA_PRIORITY_LOW;if (HAL_DMA_Init(&hdma_usart3_rx) != HAL_OK){Error_Handler();}__HAL_LINKDMA(uartHandle, hdmarx, hdma_usart3_rx);/* USART3_TX Init */hdma_usart3_tx.Instance = DMA1_Channel2;hdma_usart3_tx.Init.Request = DMA_REQUEST_2;hdma_usart3_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;hdma_usart3_tx.Init.PeriphInc = DMA_PINC_DISABLE;hdma_usart3_tx.Init.MemInc = DMA_MINC_ENABLE;hdma_usart3_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;hdma_usart3_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;hdma_usart3_tx.Init.Mode = DMA_NORMAL;hdma_usart3_tx.Init.Priority = DMA_PRIORITY_LOW;if (HAL_DMA_Init(&hdma_usart3_tx) != HAL_OK){Error_Handler();}__HAL_LINKDMA(uartHandle,hdmatx,hdma_usart3_tx);/* USART3 interrupt Init */HAL_NVIC_SetPriority(USART3_IRQn, 1, 0);HAL_NVIC_EnableIRQ(USART3_IRQn);/* USER CODE BEGIN USART3_MspInit 1 *//* USER CODE END USART3_MspInit 1 */}
}void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{if(uartHandle->Instance == USART3){/* USER CODE BEGIN USART3_MspDeInit 0 *//* USER CODE END USART3_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_USART3_CLK_DISABLE();/**USART3 GPIO ConfigurationPC4 ------> USART3_TXPC5 ------> USART3_RX*/HAL_GPIO_DeInit(GPIOC, GPIO_PIN_4 | GPIO_PIN_5);/* USART3 DMA DeInit */HAL_DMA_DeInit(uartHandle->hdmarx);HAL_DMA_DeInit(uartHandle->hdmatx);/* USART3 interrupt Deinit */HAL_NVIC_DisableIRQ(USART3_IRQn);/* USER CODE BEGIN USART3_MspDeInit 1 *//* USER CODE END USART3_MspDeInit 1 */}
}/* USER CODE BEGIN 1 *//* USER CODE END 1 */
DMA初始化
/*** Enable DMA controller clock*/
void MX_DMA_Init(void)
{/* DMA controller clock enable */__HAL_RCC_DMA1_CLK_ENABLE();/* DMA interrupt init *//* DMA1_Channel2_IRQn interrupt configuration */HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);/* DMA1_Channel3_IRQn interrupt configuration */HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 0, 0);HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
}
中断服务函数
/*** @brief This function handles USART3 global interrupt.*/
void USART3_IRQHandler(void)
{/* USER CODE BEGIN USART3_IRQn 0 *//* USER CODE END USART3_IRQn 0 */HAL_UART_IRQHandler(&huart3);/* USER CODE BEGIN USART3_IRQn 1 *//* USER CODE END USART3_IRQn 1 */
}
应用部分,为自己编写代码
开机启用DMA接收
// 串口接收数据控制结构体
typedef struct
{uint8_t RxBuffer[USART_RX_MAX_LENGTH];uint16_t Size;uint8_t FrameFg;
}WS_RxUsartInfoTypeDef;WS_RxUsartInfoTypeDef uart3Rx;void WS_USART_Rx_Tx_Init(void)
{// 启用DMA接收HAL_UARTEx_ReceiveToIdle_DMA(&huart3, uart3Rx.RxBuffer, sizeof(uart3Rx.RxBuffer) - 1) ;
}
发送函数
// 使用串口发送数据时,调用此函数
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);
重写发送完成回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{/* Prevent unused argument(s) compilation warning */UNUSED(huart);/* NOTE: This function should not be modified, when the callback is needed,the HAL_UART_TxCpltCallback could be implemented in the user file*/if(huart->Instance == USART3){//此处代表发送完成,若使用RS485通讯,可在此切换接收模式}
}
重写接收完成回调函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
// uint16_t len ;/* Prevent unused argument(s) compilation warning */UNUSED(huart);if(huart->Instance == USART3){if(huart->RxEventType == HAL_UART_RXEVENT_IDLE){uart3Rx.FrameFg = 1;uart3Rx.Size = Size;// 启用DMA接收HAL_UARTEx_ReceiveToIdle_DMA(&huart3, uart3Rx.RxBuffer, sizeof(uart3Rx.RxBuffer) - 1) ;// 可在此处调用接收数据处理函数}}
}
相关文章:
使用HAL库的STM32工程,实现DMA传输USART发送接收数据
以串口3为例,初始化部分为STM32CubeMX生成代码 串口初始化 UART_HandleTypeDef huart3; DMA_HandleTypeDef hdma_usart3_rx; DMA_HandleTypeDef hdma_usart3_tx;/* USART3 init function */ void MX_USART3_UART_Init(void) {/* USER CODE BEGIN USART3_Init 0 */…...
常用排序算法总结
内容目录 1. 选择类排序 1.1 直接选择排序1.2 堆排序 2. 交换类排序 2.1 冒泡排序2.2 快速排序 3. 插入类排序 3.1 直接插入排序3.2 希尔排序 4. 其它排序 4.1 归并排序4.2 基数排序/桶排序 排序 1. 选择类排序 选择类排序的特征是每次从待排序集合中选择出一个最大值或者最…...
[项目详解][boost搜索引擎#2] 建立index | 安装分词工具cppjieba | 实现倒排索引
目录 编写建立索引的模块 Index 1. 设计节点 2.基本结构 3.(难点) 构建索引 1. 构建正排索引(BuildForwardIndex) 2.❗构建倒排索引 3.1 cppjieba分词工具的安装和使用 3.2 引入cppjieba到项目中 倒排索引代码 本篇文章,我们将继续项…...
R语言编程
一、R语言在机器学习中的优势 R语言是一种广泛用于统计分析和数据可视化的编程语言,在机器学习领域也有诸多优势。 丰富的包:R拥有大量专门用于机器学习的包。例如,caret包是一个功能强大的机器学习工具包,它提供了统一的接口来训练和评估多种机器学习模型,如线性回归、决…...
Mysql主主互备配置
在现有运行的mysql环境下,修改相关配置项,完成主主互备模式的部署。 下面的配置说明中设置的mysql互备对应服务器IP为: 192.168.1.6 192.168.1.7 先检查UUID 在mysql的数据目录下,检查主备mysql的uuid(如下的server-…...
如何预防数据打架?数据仓库如何保持指标数据一致性开发指南(持续更新)
大数据开发人员最经常遇到尴尬和麻烦的事是,指标开发好了,以为万事大吉了。被业务和运营发现这个指标在不同地方数据打架,显示不同的数值。为了保证指标数据一致性,要从整个开发流程做好。 目录 一、数据仓库架构规划 二、数据抽取与转换 三、数据存储管理 四、指标管…...
我谈Canny算子
在Canny算子的论文中,提出了好的边缘检测算子应满足三点:①检测错误率低——尽可能多地查找出图像中的实际边缘,边缘的误检率(将边缘识别为非边缘)低,且避免噪声产生虚假边缘(将非边缘识别为边缘…...
算法的学习笔记—平衡二叉树(牛客JZ79)
😀前言 在数据结构中,二叉树是一种重要的树形结构。平衡二叉树是一种特殊的二叉树,其特性是任何节点的左右子树高度差的绝对值不超过1。本文将介绍如何判断一棵给定的二叉树是否为平衡二叉树,重点关注算法的时间复杂度和空间复杂度…...
SSM学习day01 JS基础语法
一、JS基础语法 跟java有点像,但是不用注明数据类型 使用var去声明变量 特点1:var关键字声明变量,是为全局变量,作用域很大。在一个代码块中定义的变量,在其他代码块里也能使用 特点2:可以重复定义&#…...
kubeadm快速自动化部署k8s集群
目录 一、准备环境 二、安装docker--三台机器都操作 三、使用kubeadm部署Kubernetes 在所有节点安装kubeadm和kubelet、kubectl 配置启动kubelet(所有主机) master节点初始化 Mater重新完成初始化 执行Master初始化后的提示配置 配置使用网络插件 创建flannel网络 …...
解决JAVA使用@JsonProperty序列化出现字段重复问题(大写开头的字段重复序列化)
文章目录 引言I 解决方案方案1:使用JsonAutoDetect注解方案2:手动编写get方法,JsonProperty注解加到方法上。方案3:首字母改成小写的II 知识扩展:对象默认是怎样被序列化?引言 需求: JSON序列化时,使用@JsonProperty注解,将字段名序列化为首字母大写,兼容前端和第三方…...
分布式理论基础
文章目录 1、理论基础2、CAP定理1_一致性2_可用性3_分区容错性4_总结 3、BASE理论1_Basically Available(基本可用)2_Soft State(软状态)3_Eventually Consistent(最终一致性)4_总结 1、理论基础 在计算机…...
Java应用程序的测试覆盖率之设计与实现(二)-- jacoco agent
说在前面的话 要想获得测试覆盖率报告,第一步要做的是,采集覆盖率数据,并输入到tcp。 而本文便是介绍一种java应用程序部署下的推荐方式。 作为一种通用方案,首先不想对应用程序有所侵入,其次运维和管理方便。 正好,jacoco agent就是类似于pinpoint agent一样,都使用…...
【机器学习】13. 决策树
决策树的构造 策略:从上往下学习通过recursive divide-and-conquer process(递归分治过程) 首先选择最好的变量作为根节点,给每一个可能的变量值创造分支。然后将样本放进子集之中,从每个分支的节点拓展一个。最后&a…...
《a16z : 2024 年加密货币现状报告》解析
加密社 原文链接:State of Crypto 2024 - a16z crypto译者:AI翻译官,校对:翻译小组 当我们两年前第一次发布年度加密状态报告的时候,情况跟现在很不一样。那时候,加密货币还没成为政策制定者关心的大事。 比…...
Laravel 使用Simple QrCode 生成PNG遇到问题
最近因项目需求,需要对qrcode 进行一些简单修改,发现一些问题,顺便记录一下 目前最新的版本是4.2,在环境是 PHP8 ,laravel11 的版本默认下载基本是4.0以上的 如下列代码 QrCode::format(png)->generate(test);这样…...
一站式学习 Shell 脚本语法与编程技巧,踏出自动化的第一步
文章目录 1. 初识 Shell 解释器1.1 Shell 类型1.2 Shell 的父子关系 2. 编写第一个 Shell 脚本3. Shell 脚本语法3.1 脚本格式3.2 注释3.2.1 单行注释3.2.2 多行注释 3.3 Shell 变量3.3.1 系统预定义变量(环境变量)printenv 查看所有环境变量set 查看所有…...
批处理操作的优化
原来的代码 Override Transactional(rollbackFor Exception.class) public void batchAddQuestionsToBank(List<Long> questionIdList, Long questionBankId, User loginUser) {// 参数校验ThrowUtils.throwIf(CollUtil.isEmpty(questionIdList), ErrorCode.PARAMS_ERR…...
机器视觉运动控制一体机在DELTA并联机械手视觉上下料应用
市场应用背景 DELTA并联机械手是由三个相同的支链所组成,每个支链包含一个转动关节和一个移动关节,具有结构紧凑、占地面积小、高速高灵活性等特点,可在有限的空间内进行高效的作业,广泛应用于柔性上下料、包装、分拣、装配等需要…...
RHCE-web篇
一.web服务器 Web 服务器是一种软件或硬件系统,用于接收、处理和响应来自客户端(通常是浏览器)的 HTTP 请求。它的主要功能是存储和提供网站内容,比如 HTML 页面、图像、视频等。 Web 服务器的主要功能 处理请求…...
算法将驱动一切:边缘AI智能体如何重塑智能系统
仓库装卸区的安全摄像头每天采集86400秒的视频数据。长途卡车上的车队远程信息记录仪在两次加油之间积累了数GB的行车影像。外科手术机器人的立体摄像头以每秒60帧的速度生成密集点云。所有这些数据都产生于数字世界与现实世界的交界处,但几乎没有任何一条被用于智能…...
BetterGI自动化工具:每天为原神玩家节省2小时
BetterGI自动化工具:每天为原神玩家节省2小时 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙 | 全连音游 | 自动烹饪 …...
多目标粒子群混合储能优化配置【附算法】
✨ 长期致力于混合储能、优化配置、风光互补微电网、多目标粒子群算法、CRITIC-TOPSIS研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)风光-负荷多场景…...
离散流匹配与MaskFlow框架:视频生成技术解析
1. 离散流匹配在视频生成中的技术演进 视频生成技术近年来取得了显著进展,但长视频生成仍然面临两大核心挑战:一是如何有效建模视频中复杂的时空动态关系,二是如何在有限的计算资源下实现高效生成。传统方法通常采用固定长度的训练序列&…...
开源自托管看板工具:基于Preact+Hono+SQLite的零云依赖方案
1. 项目概述:一个为自托管与AI协作而生的看板应用如果你正在寻找一个可以完全掌控在自己手里、没有订阅费用、又能无缝集成到你自己产品中的看板工具,那么clawnify/open-kanban这个项目值得你花时间深入研究。它不是一个玩具,而是一个生产就绪…...
FlareLine Flutter:开源跨平台管理后台模板开发与部署指南
1. 项目概述:一个为现代应用而生的Flutter仪表盘模板如果你正在寻找一个能快速启动你的下一个Web、Android或iOS项目后台管理界面的方案,并且希望这个方案足够现代、功能齐全,同时又能让你完全掌控代码,那么FlareLine Flutter这个…...
人脸模糊实战指南:YOLOv8+SAM三重模糊工业级方案
1. 项目概述:为什么一张脸的模糊处理,比你想象中更难也更重要我做图像隐私处理相关项目快八年了,从最早用Photoshop手动框选、拖拽高斯模糊图层,到后来写脚本调OpenCV的Haar级联检测器,再到如今用YOLOv8SAM组合做像素级…...
构建自我进化的AI家园:基于多智能体与GitOps的工程实践
1. 项目概述:构建一个能自我进化的AI家园如果你和我一样,对那种“一问一答”式的AI聊天机器人感到厌倦,总想着能不能让AI更“主动”一点,甚至能帮你打理整个技术栈,那么这个项目绝对值得你花时间研究。ai-homebase不是…...
Unity游戏马赛克移除终极指南:如何轻松解锁隐藏内容?
Unity游戏马赛克移除终极指南:如何轻松解锁隐藏内容? 【免费下载链接】UniversalUnityDemosaics A collection of universal demosaic BepInEx plugins for games made in Unity3D engine 项目地址: https://gitcode.com/gh_mirrors/un/UniversalUnity…...
让 Agent 也能发邮件:Cloudflare Email Service 正式公测
原文:Cloudflare Email Service: now in public beta. Ready for your agents 邮件是世界上最通用的接口 不需要下载特定 App,不需要接入自定义 SDK,不需要注册新平台。全球几十亿人都有邮箱,任何人都可以通过一封邮件和你的应用…...
