基于STM32Cubemx HAL 库实现 DMA 驱动 GPIO 高速翻转

发布者:Leishan最新更新时间:2024-09-23 来源: elecfans关键字:STM32Cubemx  HAL  DMA  驱动  GPIO 手机看文章 扫描二维码
随时随地手机看文章

说明:本文主要内容是从简单介绍有关STM32的DMAMUX模块-电子发烧友网 (elecfans.com)这篇文章摘录。我是小白,在索引HAL DMA GPIO 翻转时,没有找到本文,而在所有DMAMUX才索引到此文。为了方便后续小白能够及时找到此文。我重新做了编译。并做了相关程序的验证。对相关数据做了说明。感谢本文应用的3片文章的作者!


目前STM32家族中的很多系列,比如STM32G0/STM32G4/STM32L4+/STM32H7等都内置了DMAMUX模块。有了它一方面使得DMA请求与DMA控制器之间的映射关系更为灵活方便,另一方面也大大拓展了DMA请求事件,不再局限于外设事件,比方基于GPIO的外部中断事件、或者DMA事件本身来触发DMA传输。


关于DMAMUX的基本结构及功能原理,这里就不说了,这里重点介绍基于STM32G4芯片,使用GPIO的外部中断事件触发DMA传输,通过DMA将内存数据传输到GPIO端口的实现过程,包括基于CubeMx的配置、关键代码及注意点。


本演示例程基于STM32G4系列的Nucleo板进行,按键【PC.13】用来触发中断,该中断事件被配置DMA请求源。板上有个LED灯与PA.5相连。例程中通过DMA传输来修改GPIOA输出寄存器的内容来改变亮灯情况。


要完成的任务很简单,按键产生外部中断事件,外部中断事件与DMAMUX的DMA请求生成器相连,进而产生DMA请求,最后触发相应的DMA控制器完成数据传输。下面就直接进入配置过程。


先通过CubeMx神器做基本的初始化配置【RCC配置就省略不提了】。

注意别忘了使能PC13脚所对应的NVIC控制器配置,即下图所示配置。

798284d0-fc1f-11eb-9bcf-12bb97331649.png

然后,对DMA进行配置。配置也比较简单,见下图。注意DMA请求源并非常规的外设事件,而是DMA请求发生器相关通道,关于它的配置在图中下方的蓝色方框那里。

79a7bcd2-fc1f-11eb-9bcf-12bb97331649.png

EXTI13事件作为DMAMUX的输入请求信号,每次中断事件产生一个DMA请求,请求信号与DMA1的Channel1相连。为了便于演示,我这里将DMA传输配置成了循环模式。


基于上面配置生成初始化代码,然后添加用户代码。基于HAL库的关键用户参考代码如下:

DMA_HandleTypeDef hdma_dma_generator0;

uint16_t DataSource[]={0x5555,0xaaaa,0x5a5a,0xa5a5};

int main(void)

{

HAL_Init();

SystemClock_Config();

MX_GPIO_Init();

MX_DMA_Init();

/* USER CODE BEGIN 2 */

HAL_DMAEx_EnableMuxRequestGenerator(&hdma_dma_generator0);

HAL_DMA_Start(&hdma_dma_generator0 , (uint32_t)&DataSource,

(uint32_t)&(GPIOA-》ODR),4 );

/* USER CODE END 2 */

while (1)

{

}

}

顺便提醒下,上面红色代码行可能是有些人容易忽视的地方,至少目前库版本需要手动添加这句。

最后,简单验证下。看看按键时是否发生GPIOA输出的数据变化及灯亮暗。

验证过程是没啥问题的,跟预期效果一致。这里特意分享整个实现过程以供有需要的工程师参考。有关STM32的DMAMUX模块的简单介绍可以阅读下面的文章《《STM32芯片中的DMAMUX是干啥用的》》。OK,下次再聊。

我使用TIM1-CH1的输出作为触发链接到EXTI引脚上面周期触发DMA搬运。474主频160MHz,搬运速度为20MHz。而TIM1-CH1的触发频率可以达到80Hz。下图从“AN2548_STM32F。。。。。”文档摘录,即一个DMA搬运周期约6个系统时钟。我现在是反过来从内存搬运到外设,算下来是8个时钟。基本正常。如果直接用CPU搬运则可以达到160MHz(CPU搬运时间为1个系统主频)。但是由于GPIO输出达不到160MHz因此输出波形异常。把主频降低到120MH在,输出正常,可以达到120MHz刷新。

pYYBAGR5pS6AVWbnAAGJ5W4rtws887.png


z这篇文章介绍的方法刷新速度与上面的速度相同(已经测试)“ STM32 | 基于 HAL 库实现 DMA 驱动 GPIO 高速翻转_stm32 dma gpio_羽墨志的博客-CSDN博客”但是这个方法没办法周期触发同步。

在STM32G474 中要使用M to M搬运,需要使用下面2条语句:

HAL_DMAEx_EnableMuxRequestGenerator(&hdma_memtomemX_channelX); ///上面这篇文章没有这句,无法在474内得到期望结果。

HAL_DMA_Start(&hdma_memtomem_dma1_channel1, (uint32_t)(dma_buff), (uint32_t)(&GPIOB->ODR), sizeof(dma_buff)/sizeof(dma_buff[0]));


关键字:STM32Cubemx  HAL  DMA  驱动  GPIO 引用地址:基于STM32Cubemx HAL 库实现 DMA 驱动 GPIO 高速翻转

上一篇:MAVLink学习之路04_MAVLink移植到STM32具体步骤
下一篇:STM32单片机有哪几种常见的开发环境?

推荐阅读最新更新时间:2024-11-11 17:34

效率高达98%的60V降压-升压型 LED 驱动
具有四个电源开关的同步降压-升压型转换器能实现非常高的效率,同时提供升压和降压 DC/DC 转换。组合两个单独转换器 (降压和升压) 的能力拥有缩减解决方案尺寸和成本的优势。当只需要升压或降压转换时,四开关转换器的运作能够仅利用两个开关以获得最高的效率。然而,它们也必须能够使用四开关操作 (当 VIN 和 VOUT 相互接近时),并且在这些工作区之间平稳地转换。为两开关升压、两开关降压和四开关操作组合控制环路以及在这些工作区之间设计近乎完美的转换会存在挑战。不过,下一代降压-升压型转换器能解决此类难题和完成更多的任务。 LT 8391 60V 四开关降压-升压型 LED 驱动器专为驱动高达 250W 的高功率 LED 并在两开关
[电源管理]
效率高达98%的60V降压-升压型 LED <font color='red'>驱动</font>器
STM32F10x DMA介绍以及 dma usart数据收发
DMA方式 1. DMA 介绍 Direct memory access (DMA) is used in order to provide high-speed data transfer between peripherals and memory and between memory and memory. Data can be quickly moved by DMA without any CPU action. This keeps CPU resources free for other operations. The DMA controller combines a powerful dual AHB
[单片机]
手机光环渐失 IoT、AI接手 驱动半导体业创新发展
  过去10年间,在智能手机的带动下,半导体业也不断成长,然随着此区块市场日渐成熟,成长动能趋缓,半导体业也开始寻找下一个能为产业注入新活力的领域,近年来窜红的物联网( IoT )及人工智能( AI )应用就极有可能成为引领半导体业下一波成长的关键。下面就随半导体小编一起来了解一下相关内容吧。     praxthoughts的评论认为,在这波由智能手机引爆的热潮里,系统单芯片(SoC)业者竞相投入开发昂贵的先进制程,努力打造更高效能、低功耗的芯片,使得通用SoC不管在销售或技术创新上都有了长足的进展,连带也驱动其他如嵌入式和消费性电子等市场的成长,如今智能手机市场成长走缓,周边产业的风貌可能也会连带着出现变化。   市场上预测
[半导体设计/制造]
40W全电压数字式离线PWM LED驱动方案解析
iW3620 使用 iWatt 的专利 PrimAccurate 一次侧控制技术,由于不再需要传统的光隔离器和外部补偿元件,因此减少了外部元件数量,从而缩小了产品尺寸并降低了成本。该设备通过在准谐振模式下工作来优化高负载时的效率,并使用逐脉冲波形分析来提供优于传统离线解决方案的环路响应特性。iW3620 具有全面的保护功能,并集成了iWatt的EZ-EMI技术,可以帮助实现最终应用中的EMI 管理,从而为最终用户提供了一个易于设计且可靠的固态照明解决方案。 典型应用原理图 特性 PrimAccurate - 隔离型离线交流/直流控制器 可轻松满足电磁干扰国际标准的 EZ-EMI 设计 非常适合于最大功率为40W
[电源管理]
40W全电压数字式离线PWM LED<font color='red'>驱动</font>方案解析
stm32f103ADC测试程序,16路ADC采样+DMA传送数据
#include adc.h #include delay.h /* 16路ADC采样DMA传输 调用Adc_Init()函数初始化设备,ADC循环采样 数据被DMA搬运到ADC_Value 数组中 滤波后的数据在ADC_AfterFilter 中 */ u16 ADC_Value = {0}; u16 ADC_AfterFilter = {0}; void Adc_Init(void) { ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStruct
[单片机]
设计LED驱动电源的一些建议
  LED驱动电源设计并不难,但一定要心中有数。只要做到调试前计算,调试时测量,调试后老化,相信谁都可以搞好LED。   1、LED电流大小   大家都知道LEDripple过大的话,LED寿命会受到影响,影响有多大,但目前没有具体的指标。   2、芯片发热   这主要针对内置电源调制器的高压驱动芯片,降低芯片的功耗,不要引入额外的功耗,做好散热。   3、功率管发热   功率管的功耗分成两部分,开关损耗和导通损耗。LED是电驱动应用,开关损害要远大于导通损耗。开关损耗与功率管的cgd和cgs以及芯片的驱动能力和工作频率有关,所以要解决功率管的发热可以从以下几个方面解决:   A、不能片面根
[电源管理]
驱动电机轴承电腐蚀原罪—趋肤效应
新能源驱动电机轴承最常见的失效模式除了之前文章中提到的 蠕变跑圈 以外,还有 电腐蚀 。其中电腐蚀的失效模式又可分为 白蚀裂纹(WECs) 和 凹槽腐蚀(FLUTING) 。 工程应用中最容易分辨及观察到的是后者,所以一般大家说的轴电流导致的轴承腐蚀说的也是后者,当然危害也是最大的。 随着新能源的发展,轴电流实际应用解决的方案已日渐成熟,常见的有轴接地、陶瓷球轴承、导电油脂等。前面的“ 我们从奥迪E-TRAN学到什么? ”文章中有提及奥迪方案。E-TRAN电机转子具有特殊的轴接地,以避免可能的轴承电流流过滚动轴承或齿轮。同时,两个内部转子轴承设计为陶瓷轴承,以避免轴电流通过。功能是防轴承电腐蚀。 轴电流的产生以及解决方
[嵌入式]
<font color='red'>驱动</font>电机轴承电腐蚀原罪—趋肤效应
Melexis率先在全球推出60W单线圈无传感器BLDC驱动芯片
2024年10月18日,比利时泰森德洛—— 全球微电子工程公司Melexis宣布,推出24V/60W无传感器单线圈BLDC驱动芯片MLX90416,其专为消费电子和工业领域的电机、风扇和泵应用而设计。 当前,众多消费电子设备及工业应用装置,如电风扇、空气净化器、吸尘器、水泵以及通风设施等,普遍采用三相BLDC电机与驱动芯片的组合或交流感应电机。不过,这两种方案均存在明显的局限性:三相BLDC电机成本高昂且结构复杂;交流感应电机能效不足且缺乏先进功能。 MLX90416以其独特优势,针对上述痛点,提供一种高效又经济可行的解决方案,有助于简化电机设计与制造流程 。该产品以迈来芯的“No-Hall”技术为核心,无需反
[工业控制]
Melexis率先在全球推出60W单线圈无传感器BLDC<font color='red'>驱动</font>芯片
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved