你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

经验分享 | STM32U5 ADC+TIM+DMA 2D传输应用演示

[复制链接]
攻城狮Melo 发布时间:2026-3-13 14:41

现在假设有这样一种应用场景,ADC模块对4个模拟输入信号进行多次扫描采样,并开启DMA对ADC结果的搬运。一般来讲,我们多次扫描转换后的结果经DMA搬运后,在内存中的存放结果往往是下图左边图示的样子。结合下图,我们不难看出ADC对对4个通道各采样了4次。

image.png

那有没有一种可能,ADC的采样动作不变,经过DMA搬运后的转换结果在内存中的摆放像上图中右边排列的样子呢?即最终各通道的转换结果各自占据一块区域,互不穿插干扰。

对于这种需求,STM32家族中有些系列的通用DMA支持DMA 2D功能,即DMA可以基于‘块’做地址偏移,在传输过程中自动调整不同块的传输起始地址;同时块内的数据访问地址的步进支持灵活编程,可进可退,而不只是固定地仅支持1个数据单位的地址递增。比方STM32U5系列、STM32H5系列等的GPDMA的部分通道就支持DMA 2D功能。【注:STM32系列中部分系列还有针对图形应用的专用DMA 2D模块,不要跟这里聊的GPDMA 2D功能混同】

下面使用STM32U575开发板,基于前面提到的需求,演示一下实现过程,让大家对DMA 2D功能可以有更直观的了解。此处使用TIM1的更新事件触发ADC1的4个模拟通道的模数转换,ADC结果经GPDMA搬运到指定内存。GPDMA 工作在2D模式。最后期望的结果就是4个通道的转换结果分别被摆放到各自的内存区域,在内存里4个通道的结果互不穿插。

现在使用STM32CubeMx进行配置。下面TIM1的配置,它的任务就是周期性地产生更新事件去触发ADC的转换。

image.png

下面是ADC1的基本配置,启用4个通道的常规转换、可以申请DMA,其转换经TIM1触发。 image.png

image.png

这里使用STM32U5片内GPDMA1,选择支持DMA 2D模式的channel 12来做ADC结果的搬运。DMA使用标准请求模式,实现从外设到内存的传输,源端、目的端的数据访问宽度均为‘字’。

image.png

重点关注下面2D Addressing的配置。其中,offset的数据都是以字节为单位,可以正可以负。访问往高地址迁移时偏移量为正,反之为负。Repeat counter是指DMA要完成的块传输的次数或个数,这里为4块。

image.png

完成配置后,创建工程。仅需添加下面两行HAL库代即可验证结果。

HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_Result, 4);

HAL_TIM_Base_Start(&htim1);

注:GPDMA做4次块传输,每块【轮】传输4个数据,共传输16个数据。

下面是GPDMA传输过程中ADC结果依次在内存中呈现的结果。最右边的就是ADC结果在内存中的最终摆放情形。显然,4个通道的数据被DMA摆放在各自的区域。

image.png

这里重点是借助上面演示介绍一下DMA 2D的功能,更多细节还得回头去研究STM32手册,算是抛砖引玉。我们可以在必要时对DMA 2D功能加以灵活运用,给自己的应用带来方便的同时又提升芯片性能。

OK,今天的话题就聊到这里,下次再聊~!

文章出处:茶话MCU

收藏 评论0 发布时间:2026-3-13 14:41

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版