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

基于STM32U5 ADC+DMA配置经验分享

[复制链接]
攻城狮Melo 发布时间:2023-8-2 16:42
有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。


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


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


微信图片_20230802163811_5.png

微信图片_20230802163811_4.png

微信图片_20230802163811_3.png


相关代码:
  1. #define     ADC_BUFFRER_SIZE   ((uint32_t)  8)   
  2. uint32_t   ADC1_Result[ADC_BUFFRER_SIZE];

  3. ADC_HandleTypeDef hadc1;
  4. DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1

  5.   /* USER CODE BEGIN 2 */


  6. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
  7.    
  8.   __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);

  9.   if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,
  10.                          (ADC_BUFFRER_SIZE)
  11.                        ) != HAL_OK)
  12.   {
  13.     Error_Handler();
  14.   }

  15.    /* USER CODE END 2 */
复制代码

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


微信图片_20230802163811_2.png


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


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


微信图片_20230802163811_1.png


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


微信图片_20230802163811.png

微信图片_20230802163812_2.png

微信图片_20230802163812_1.png


相关用户代码:
  1. /* Private variables ---------------------------------------------------------*/
  2. ADC_HandleTypeDef hadc4;
  3. DMA_NodeTypeDef Node_GPDMA1_Channel1;
  4. DMA_QListTypeDef List_GPDMA1_Channel1;
  5. DMA_HandleTypeDef handle_GPDMA1_Channel0;
  6. /* USER CODE BEGIN PV */

  7. /* USER CODE BEGIN 2 */

  8. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version

  9. MX_ADC4Queue_Config();

  10. __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);

  11. HAL_DMAEx_List_SetCircularMode(&ADC4Queue);
  12.    
  13. if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)
  14. {
  15. Error_Handler();
  16. }

  17. if (HAL_ADC_Start_DMA(&hadc4,
  18. (uint32_t *)ADC4_Result,
  19. (ADC_BUFFRER_SIZE)
  20. ) != HAL_OK)
  21. {
  22. Error_Handler();
  23. }
  24. /* USER CODE BEGIN WHILE */
复制代码

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


微信图片_20230802163812.png


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



如有侵权请联系删除

转载自: 茶话MCU


收藏 评论1 发布时间:2023-8-2 16:42

举报

1个回答
无极考拉 回答时间:2023-9-8 08:56:44

学习一下

所属标签

相似分享

官网相关资源

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