|
现在假设有这样一种应用场景,ADC模块对4个模拟输入信号进行多次扫描采样,并开启DMA对ADC结果的搬运。一般来讲,我们多次扫描转换后的结果经DMA搬运后,在内存中的存放结果往往是下图左边图示的样子。结合下图,我们不难看出ADC对对4个通道各采样了4次。
那有没有一种可能,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的转换。
下面是ADC1的基本配置,启用4个通道的常规转换、可以申请DMA,其转换经TIM1触发。
这里使用STM32U5片内GPDMA1,选择支持DMA 2D模式的channel 12来做ADC结果的搬运。DMA使用标准请求模式,实现从外设到内存的传输,源端、目的端的数据访问宽度均为‘字’。
重点关注下面2D Addressing的配置。其中,offset的数据都是以字节为单位,可以正可以负。访问往高地址迁移时偏移量为正,反之为负。Repeat counter是指DMA要完成的块传输的次数或个数,这里为4块。
完成配置后,创建工程。仅需添加下面两行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摆放在各自的区域。
这里重点是借助上面演示介绍一下DMA 2D的功能,更多细节还得回头去研究STM32手册,算是抛砖引玉。我们可以在必要时对DMA 2D功能加以灵活运用,给自己的应用带来方便的同时又提升芯片性能。 OK,今天的话题就聊到这里,下次再聊~! 文章出处:茶话MCU |
【经验分享】LAT1496 基于 USBD库CDC Standalone例程中的一个Bug解析
STM32U5A9JDK试用---MIPI-DSI屏幕驱动
STM32U5 ADC 自校准失败终极解决:VDDA 隔离解除 + 电压调整器就绪实操指南
《STM32U3线上课程》学习笔记+STM32U3 超低功耗 MCU,超低功耗及数据安全
立即在GitHub上抢先体验面向STM32U5的最新STM32Cube HAL更新
STM32开发五大误区,新手别傻傻信了
实战经验 | STM32U5周期性异常复位问题分析
经验分享 | 一个 STM32U5 SBSFU SecureFault 问题定位与分析
经验分享 | STM32U5系列TIMER+DMA+DAC应用演示
兔哥的最强U5图显【000】——U5G9最小系统绘制
微信公众号
手机版