STM32CubeMX的使用,配置DMA串口

2023-05-16

这次记录下最近调用的外设。DMA以前用得很少,只通过ADC采集使用,开启后就直接读那个数组就可以了。

我对dma的理解就是不占用cpu,数据传输速度快,可以直接从外设和内存间相互读取。

目前的工作用的芯片只能使用hal库开发,stm32g0系列性价比高。用cubemx把基础外设全配置跑了一遍,给我最大感受就是方便快捷,在st自家芯片中移植性强。

时钟和晶振配置不多说了,网上都很全了,可以不使用外部晶振,但HCLK最大只能到64M,最好还是外接晶振让系统更可靠稳定吧。

这里我创建了个新的ioc文件,之前写了10多个传感器的板子不想动了,这篇文章算是我头一个记录hal+cubemx的记录(虽然之前自己已经写过不少了),顺便把引脚更改写下,希望能帮助到新人。

Baud Rate(波特率):两边设备通讯需要相同,这里我设定的是115200

其它基础设置数据位,无校验位,停止位,没特殊要求我按的默认。

进阶选项看需求,我这里收发都需要,其它没有设置。

一些暂时用不到的设置,错误返回值默认使能的。

传输数据高位在前默认没有使能,一般spi通讯先读MSB。

当启用功能后,GPIO会自动帮你设置好,可以自行更改。 

左键点下对应的引脚进行复用 

串口功能开启后,引脚就变绿了,如果没有在左边开启串口,引脚会是黄色的。

右键选择第一项,可写个对此引脚写个标签,建议写,以后方便移植,也好直观看出引脚功能。

 在生成的工程中,main.h里也会出现宏定义

中断记得要勾上,系统会自动给你初始化好nvic的中断优先级。

DMA这里点击 Add 进行添加,把发送和接收添加到对应的DMA通道里。

 单击一行,出现设置。

优先级为低。

1:模式为普通。调用一次dma发送函数只发一次,而Circular为循环。调用一次后就不需要管它了,直接读取放进形参的数组/指针

(如果开启多个串口dma,请务必注意发送间隔,不然有时会发送意义不明的数值。接收也改为普通模式)

 数据长度是字节(8位)

在工程管理中选择自己使用的编译器。

1:仅赋值需要的库文件

2: 勾选这个选项后,初始化的外设会自动生成到别的文件夹,不勾选的话全部生成在main.c

 

进阶选项中可以设置初始化函数的顺序,之前在网上看到别人说过如果DMA初始化不在串口前面,串口中初始化里有对应DMA的设置,DMA就会失效。我在使用前会把相应的底层库看一遍,目前定时器,串口,AD,PWM,输入捕获,IIC(这个地址要注意下,要结合需要驱动的芯片手册)的使用都没有任何问题。

生成代码。

接下来直接看代码。

和标准库不同的是,hal库使用的是回调函数,之前我们在中断服务函数里写中断程序,现在全使用回调函数。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 
{
	if(htim==&htim17)  //定时器17 1ms
	{
		if(Sys_Data.Updata_Time.MH440D++>100)
		{
				Sys_Data.Updata_TimeFlag.MH440D=1;
				Sys_Data.Updata_Time.MH440D=0;
		}			
	}
}

串口程序这里没有使用回调函数。

#include "MH440D.h"


/*和校验*/
uint8_t GetCheckSum(uint8_t *packet)
{
	uint8_t i, checksum;
	for( i = 1; i < 8; i++)
	{
	checksum += packet[i];
	}
	checksum = 0xff-checksum;
	checksum += 1;
	return checksum;
}

void MH440D_SendCom(_MH440D* MH440D)
{
	uint8_t i;
	uint8_t Sendbuff[9]={0xff,MH440D->CH4_N,MH440D->CH4_Com,0,0,0,0,0,0};

	MH440D->CheckSum=GetCheckSum(Sendbuff);
	Sendbuff[8]=MH440D->CheckSum;
	memcpy(MH440D->SendBuff,Sendbuff,9);    //复制数组
	
	HAL_UART_Transmit_DMA(&huart1,MH440D->SendBuff ,9);    //发送一次
	
}

FlagStatus MH440D_Read(_MH440D* MH440D)
{
		HAL_UART_Receive_DMA(&huart1,MH440D->RecBuff ,9 );
	
			if( MH440D->RecBuff[0]==0XFF  && MH440D->RecBuff[1] ==0x86)    //判断设备首地址和命令
			{
				
				 MH440D->CheckSum =GetCheckSum(MH440D->RecBuff); 
				 if(MH440D->RecBuff[8]==MH440D->CheckSum)
				 {
					 
					  MH440D->CH4_H=MH440D->RecBuff[2];       //读出传感器数据
					  MH440D->CH4_L=MH440D->RecBuff[3];
						return 1;	
				 }
				 
				 else
						return  0;
				
			}
			else
				return 0;
}

接收我使用的是循环读取,其实调用一次就可以了,但我在主函数循环里还是重复调用了。

模拟了下发送和接收。

 

我以前写接收时,每次接收只读一位,然后写的比较复杂,从开始位来判断标志位,循环读多少,来判断对方芯片发送的格式和校验,一不小心写错保存的数据就出差错了,十分麻烦。发现用DMA直接将数组/指针首地址放入后,确定好数据长度,可直接存取正确的顺序,剩下只需要处理数据就好了。spi和iic也差不多,基本上是对变量的长度和地址进行操作。以前也很少用硬件,全是用的io模拟,理解通信协议后 ,我在使用过的芯片,pic,stc系列(51/12/8/15我都当做51核了),stm32系列都能很好移植了。

 学生时期用了4年多标准库,工作时候有机会使用到了cubemx生成代码+hal库,还是挺爽的,但我还是少不了看寄存器手册的地方= =

也是头一次我开始尝试写结构体套结构体,以前只直接struct,各种函数调用,套来套去,现在根据公司要求规则,换了个写法,正在慢慢改进。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32CubeMX的使用,配置DMA串口 的相关文章

  • Cache和DMA一致性

    cache读必须要buffer是cacheline对齐的 DMA应该多多少少知道点吧 DMA Direct Memory Access 是指在外接可以不用CPU干预 xff0c 直接把数据传输到内存的技术 这个过程中可以把CPU解放出来 x
  • Windows中使用GCC编译STM32CubeMx生成的Makefile文件

    1 下载ARM官方对应Cortex M内核的GCC编译器 xff1a https developer arm com tools and software open source software developer tools gnu t
  • STM32使用串口空闲中断接收不定长数据帧-USART_IT_IDLE使用(不使用DMA方式)

    STM32使用串口空闲中断接收不定长数据帧 USART IT IDLE使用 xff08 不使用DMA方式 xff09 前言串口空闲中断介绍清中断方法串口中断处理函数串口中断用到的全局变量定义串口初始化 xff08 使能接收中断 空闲中断 x
  • stm32串口DMA方式向上位机连续发送数据

    目录 一 认识DMA1 DMA框图2 什么是DMA xff1f 3 DMA传输方式4 DMA传输参数5 DMA数据传输的四个要素6 DMA的应用场景 二 串口DMA方式向上位机发送数据1 实验要求2 通过STMCube配置项目 1 设置RC
  • STM32】 DMA原理,步骤超细详解,一文看懂DMA

    如需转载请注明地址 xff1a https blog csdn net as480133937 article details 104927922 DMA的基本介绍 什么是DMA DMA的基本定义 DMA xff0c 全称Direct Me
  • DMA的补充笔记

    DMA有两个总线 xff1a 1 DMA存储器总线 xff1a DMA通过该总线来执行存储器数据的传入和传出 2 DMA外设总线 xff1a DMA通过该总线访问AHB外设 xff08 AHB主要是针对高效率 高频宽以及快速系统模块所设计的
  • AXI DMA总结、内核axidmatest.c测试程序分析、SG mode

    AXI DMA 概述 xff1a XILINX提供的AXI DMA支持Scatter Gather mode和Direct Register mode 数据位宽支持32 64 128 256 512 1024bits xff0c strea
  • stm32HAL库 串口接收不定长数据(DMA传输)

    相信大家很多初学者都会遇到串口接收不定长数据的情况 对于初学者可能看着有点难理解 xff0c 多看几遍就好 xff0c 亲测能用 话不多说上菜上菜 xff01 xff01 xff01 xff01 此代码是本人在具体工程应用 xff0c 实测
  • 在EBAZ4205 zynq7010上运行AXI_DMA中断回环测试

    在EBAZ4205 zynq7010上运行AXI DMA loop interrupt 整体的布局图 这是上面的一张接口图 下面对每个模块附上截图 AXI DMA的输出mm2s introut s2mm introut接到PS系统的中断触发
  • STM32F103 UART4串口使用DMA接收不定长数据和DMA中断发送

    一 前言 使用DMA通信的好处是 不占用单片机资源 不像普通串口中断 发送一个字节触发一次中断 发送100个字节触发100次中断 接收一个字节触发一次中断 接收200个字节触发200次中断 数据接收完毕触发一次DMA中断 发送数据完毕触发一
  • 基于32单片机的16通道ADC的数据采集

    基于32单片机的16通道ADC的数据采集 这个部分的内容 是作为外部模拟量部分的采集工作 按照任务要求 所设计的方案 需要完成以下指标 ADC必须能采集16通道的模拟量 ADC的分辨率是16bit 采样率不小于20khz 由此分析可以得出
  • stm32Cubemx:串口的空闲中断和接收中断------stm32f407zgt6

    介绍串口的接收中断与空闲中断 这两种中断都是在串口进行接收时可能会发生的中断 串口接收中断即每当串口完成一次接收之后触发一次中断 在 STM32 中相应的中断处理函数为 USARTx IRQHandler 中断回调函数为 HAL UART
  • stm32之ADC应用实例(单通道、多通道、基于DMA)

    硬件 STM32F103VCT6 开发工具 Keil uVision4 下载调试工具 ARM仿真器 网上资料很多 这里做一个详细的整合 也不是很详细 但很通俗 所用的芯片内嵌3个12位的模拟 数字转换器 ADC 每个ADC共用多达16个外部
  • STM32CubeMX学习一 之GPIO配置

    文章目录 前言 一 本地环境 二 开始 1 工程创建 2 GPIO配置 2 时钟配置 3 代码生成 3 编译工程 前言 记录一下STM32CubeMX的学习笔记 同时分享给初学的小白 希望一起进步 一 本地环境 编译环境 KEIL 代码生成
  • STM32CubeMX时钟源的选择

    使用STM32CubeMX进行时钟源RCC配置的时候 可以选择使用内部时钟或外部时钟 当程序对时钟精度要求较高时 通常使用外部时钟 下拉选框如下图 Disable 禁用外部时钟 BYPASS Clock Resource 外部有源晶振 旁路
  • STM32CubeMX配置GPIO外部中断

    前言 用PA0来检测按键的输入信号 当按键按下时会由低电平变为高电平 1 配置RCC时钟 将RCC的High Speed Clock HSE 配置为Crystal Ceramic Resonator 将主频设置为72MHz 2 配置GPIO
  • STM32CubeMX学习六 之ADC配置

    文章目录 前言 一 本地环境 二 开始 1 定时器配置 2 引脚配置 在这里插入图片描述 https img blog csdnimg cn e5b6f155a1b8468cb15046a0a9d031cd png 3 内部时钟配置 4 A
  • Linux内核设备驱动程序以DMA方式进入内核空间

    LDD3 p 453 演示dma map single使用作为参数传入的缓冲区 bus addr dma map single dev gt pci dev gt dev buffer count dev gt dma dir Q1 这个缓
  • 环形缓冲区和 DMA

    我试图了解从数据包到达网卡到目标应用程序收到数据包之间发生的所有事情 假设 缓冲区足够大 可以容纳整个数据包 我知道情况并非总是如此 但我不想介绍太多技术细节 一种选择是 1 Packet reaches the NIC 2 Interru
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能

随机推荐

  • C语言中的字符串初始化

    1 C语言没有字符串类型 xff0c 通过字符数组模拟 xff0c C语言字符串 xff0c 以字符 0 数字0 2 数组指定长度后 xff0c 后面没有赋值的元素 xff0c 自动补0 char buf 100 61 39 a 39 39
  • 自动收取蚂蚁森林能量雨

    首先 xff0c 说明一下 这是一个非常迂回且效果不佳的方法 xff0c 小弟不才 xff0c 安卓以及苹果手机上的脚本没啥研究 xff0c PC的按键精灵略懂 xff0c 因此才有一下脚本 觉得有用拿去参考 xff0c 大佬勿喷 我一直都
  • AD中画圆弧形板框的方法

    在实际的板框设计中 xff0c 有时为了生产需要 xff0c 不得不需要将PCB板设计成四角需要倒角的形式 xff0c 经过实际的摸索 xff0c 现在得出一种画圆形板框的小技巧 现在需要将板框设计成3 5mm半径样式 xff08 1 xf
  • AD中板内挖空的方法

    一 先使用禁止布线层将板框确定 使用的快捷键 xff1a D gt S gt D 二 再绘制一个挖空区域 使用的快捷键 xff1a T gt V gt B 三 挖空后的效果
  • STL初识

    STL的诞生 长久以来 xff0c 软件界一直希望建立一种可重复利用的东西 C 43 43 的面向对象和泛型编程思想 xff0c 目的就是复用性的提升 大多情况下 xff0c 数据结构和算法都未能有一套标准 导致被迫从事大量重复工作 为了建
  • 删除U盘中的System Volume Information 文件夹的方法

    在使用U盘测试ARM板的时候 xff0c 会发现System Volume Information这个文件夹阴魂不散 xff0c 总是存在 xff0c 在Windows下是看不见的 xff0c 即便将文件的查看属性设置为显示隐藏文件 在使用
  • Linux命令发送Http的get或post请求

    get请求 curl命令模拟get请求 xff1a 1 使用curl命令 xff1a curl span class hljs string 34 http www baidu com 34 span 如果这里的URL指向的是一个文件或者一
  • 深度学习之----多任务学习

    介绍 在机器学习 xff08 ML xff09 中 xff0c 通常的关注点是对特定度量进行优化 xff0c 度量有很多种 xff0c 例如特定基准或商业 KPI 的分数 为了做到这一点 xff0c 我们通常训练一个模型或模型组合来执行目标
  • PID控制原理(全干货)

    主要内容 xff1a 1 常用的控制算法与PID控制算法的异同点 xff1b 2 PID控制算法的理论分析 3 基于单片机的PID算法实现 4 PID算法的工程应用的一些注意事项 5 演示板电路分析 6 PID算法C语言实现 基于ARM C
  • ESP32 手册+文档整理

    ESP32 一些手册和批注 Arduino IDE 这个板子是带了LoRa的版本 xff0c 国外还有一个TTGo 有类似的ESP32 43 LoRa这种组合 如果不需要LoRa xff0c 可以考虑ESP32 DevKit 或者PicoK
  • 【TVM帮助文档学习】TVM语言参考

    本文翻译自Language Reference tvm 0 9 dev0 documentation 本文档提供TVM的嵌入式语言和IRs的参考 Relay介绍 Relay 是一种函数式的 可微的编程语言 它是一种面对机器学习领域的具有良好
  • 【TVM帮助文档学习】通过示例分析TVM代码流程

    本文翻译自TVM Codebase Walkthrough by Example tvm 0 9 dev0 documentation 了解TVM代码颇具挑战性 xff0c 它的各组件之间的交互非常隐晦 在本指南中 xff0c 我们将通过一
  • Linux设置nacos自启动(centos7)

    1 编写服务脚本 vim lib systemd system nacos service 将下列内容添加进入 span class token punctuation span Unit span class token punctuat
  • 图像处理——Haar特征

    Haar特征最初是用来进行人脸特征的表示的 xff0c 最近重新看了SURF算法 xff0c 发现在生成特征点描述子的时候也有用到Haar特征 查看了一些博文 xff0c 自己整理一些 xff0c 方便以后复习 Haar特征分为三类 xff
  • TVM运行时系统

    本文翻译自TVM Runtime System tvm 0 9 dev0 documentation TVM的编译器栈开发和部署支持多种编程语言 在本文中 xff0c 我们将解释TVM运行时的关键元素 我们需要满足一些有趣的需求 部署 从p
  • 彻底解决anaconda虚拟环境中pip是全局pip 下载包自动到base环境而非虚拟环境的问题 No module named _abc报错解决

    删除系统变量中的 PYTHONHOME C ProgramData Anaconda3 同时需要将虚拟环境的Lib site package的路径添加至系统变量Path中 xff0c 否则还是会报没有 abc模块的错误
  • C++基础语法

    C语言作为程序化的开发语言 xff0c 适合处理较小规模的程序 xff0c 相对于大规模程序 xff0c C语言并不合适 xff0c 所以提出了C 43 43 语言 C 43 43 对C语言的加强主要表现在 1 命名空间 2 函数重载与运算
  • 什么是DOM对象?如何获取DOM对象?

    今天的web前端培训环节 xff0c 我们讲解一下DOM对象 DOM对象本质上是浏览器根据html标签生成的 JS对象 xff0c 它的所有的标签属性都可以在这个 JS对象上面找到 xff0c 修改这个对象的属性会自动映射到标签身上 DOM
  • 2021电赛F题数字识别和巡线部分

    文章之前12月发了一次 xff0c 但是我后来申请的免毕设后 xff0c 用到了一些文字 xff0c 所以删了这篇文章 xff0c 但是还是查重了 xff0c 于是我把一些程序讲解先删了 xff0c 等毕设结束后再编辑加上 这次电赛我没有准
  • STM32CubeMX的使用,配置DMA串口

    这次记录下最近调用的外设 DMA以前用得很少 xff0c 只通过ADC采集使用 xff0c 开启后就直接读那个数组就可以了 我对dma的理解就是不占用cpu xff0c 数据传输速度快 xff0c 可以直接从外设和内存间相互读取 目前的工作