[其他ST产品] (转载)基于STM32U5 ADC+DMA配置经验分享

[复制链接]
1580|11
 楼主| elephant00 发表于 2023-8-3 17:10 | 显示全部楼层 |阅读模式
AD, ADC, DM, DMA, ST
有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。


先对ADC1基于DMA标准请求模式做演示。


随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。









相关代码:
  • #define     ADC_BUFFRER_SIZE   ((uint32_t)  8)
  • uint32_t   ADC1_Result[ADC_BUFFRER_SIZE];
  • ADC_HandleTypeDef hadc1;
  • DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1
  •   /* USER CODE BEGIN 2 */
  • HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
  •   __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);
  •   if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,
  •                          (ADC_BUFFRER_SIZE)
  •                        ) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •    /* USER CODE END 2 */

复制代码


运行结果如下图所示:【目前4个通道我是悬空的】





现在对ADC4基于DMA链表模式做演示,其实就一个节点。


选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!





关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。









相关用户代码:
  • /* Private variables ---------------------------------------------------------*/
  • ADC_HandleTypeDef hadc4;
  • DMA_NodeTypeDef Node_GPDMA1_Channel1;
  • DMA_QListTypeDef List_GPDMA1_Channel1;
  • DMA_HandleTypeDef handle_GPDMA1_Channel0;
  • /* USER CODE BEGIN PV */
  • /* USER CODE BEGIN 2 */
  • HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
  • MX_ADC4Queue_Config();
  • __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);
  • HAL_DMAEx_List_SetCircularMode(&ADC4Queue);
  • if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)
  • {
  • Error_Handler();
  • }
  • if (HAL_ADC_Start_DMA(&hadc4,
  • (uint32_t *)ADC4_Result,
  • (ADC_BUFFRER_SIZE)
  • ) != HAL_OK)
  • {
  • Error_Handler();
  • }
  • /* USER CODE BEGIN WHILE */

复制代码


结果验证【显示了2组数据】:





最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。



如有侵权请联系删除

香水城 发表于 2023-8-4 07:25 | 显示全部楼层
谢谢转载,原文链接 STM32U5 ADC+DMA配置演示
周半梅 发表于 2024-3-1 07:03 | 显示全部楼层

需要在做项目的过程中经历磨难
Pulitzer 发表于 2024-3-1 08:06 | 显示全部楼层

硬件设计和软件设计本来就是鱼和熊掌的关系,两者不可兼得
童雨竹 发表于 2024-3-1 10:02 | 显示全部楼层

结构化模块化的程序设计的思想,使最基本的要求
Wordsworth 发表于 2024-3-1 11:05 | 显示全部楼层

确定好硬件原理图,硬件布线,最后才是软件的开发
Clyde011 发表于 2024-3-1 12:08 | 显示全部楼层

没有发现有哪本是介绍设计思想的
公羊子丹 发表于 2024-3-1 13:01 | 显示全部楼层

写程序不难,但是程序怎么样才能写的好,写的快,那是需要点经验积累的
万图 发表于 2024-3-1 14:04 | 显示全部楼层

在实际的项目应用当中,单片机引脚的复用相当厉害
Uriah 发表于 2024-3-1 15:07 | 显示全部楼层

但是如果不懂程序设计的思想的话,会给你做项目的过程中带来很多很多的困惑。
帛灿灿 发表于 2024-3-1 17:03 | 显示全部楼层

时间片轮的设计思想
Bblythe 发表于 2024-3-1 18:06 | 显示全部楼层

事实上很多做项目的工程师本身自己也会在用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1031

主题

3946

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部