OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3920|回复: 6

关于stm32H750的双ADC多通道的同步规则采样问题

[复制链接]

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2019-10-23
在线时间
42 小时
发表于 2020-3-4 10:25:54 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 vanau 于 2020-3-4 10:30 编辑

    论坛里面的朋友们大家好,最近遇到一个问题。利用H750的adc1和adc2做一个同步采样,这两个adc分别用了两个通道。    其中,adc1使用的是ADC_CHANNEL_16/ADC_CHANNEL_17 ,adc2使用的是ADC_CHANNEL_4/ADC_CHANNEL_8 ,两者用的是DMA传输方式取数据,使用的是hal库。
    在这里,我使用cubemcx建立了这个工程,随后添加了关于adc数据的存放地址。根据手册上面说的,主adc(也就是adc1)会触发从adc(adc2)的采样与转换,且两者在转换之后,都会触发dma请求。这样配置下来,dma传输完成之后,会相继进入到各自的中断函数(这里是DMA2_Stream0_IRQHandler和DMA1_Stream1_IRQHandler),这时我们在中断函数中做进一步处理。
    但是,我发现,这里只进入了adc1的dma中断,却始终进不了adc2的dma中断,是我这代码配置的不对吗?还是adc2根本没有转换数据?






TIM截图20200304022330.jpg

test_adc.part03.rar

3.46 MB, 下载次数: 54

test_adc.part02.rar

10 MB, 下载次数: 199

test_adc.part01.rar

10 MB, 下载次数: 230

最佳答案

查看完整内容[请看2#楼]

这个已解决了,建议看手册,还有先使用cubemx建立一个工程。需要知道,只需要开启主adc的多通道DMA即可,一次转换后的数据格式,从adc高16位,主adc为低16位。由主adc的DMA进行传输,DMA传输完成后再进行数据处理即可
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2019-10-23
在线时间
42 小时
 楼主| 发表于 2020-3-4 10:25:55 | 显示全部楼层
也无风雨也无情 发表于 2020-4-28 14:08
楼主的问题解决了吗?我也碰到了这个问题

这个已解决了,建议看手册,还有先使用cubemx建立一个工程。需要知道,只需要开启主adc的多通道DMA即可,一次转换后的数据格式,从adc高16位,主adc为低16位。由主adc的DMA进行传输,DMA传输完成后再进行数据处理即可
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2019-10-23
在线时间
42 小时
 楼主| 发表于 2020-3-4 10:31:05 | 显示全部楼层
工程有点大,我上传的时候分开压缩了,大佬需要下完一块解压
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2019-10-23
在线时间
42 小时
 楼主| 发表于 2020-3-4 10:32:39 | 显示全部楼层
  1. int main(void)
  2. {
  3.   /* USER CODE BEGIN 1 */

  4.   /* USER CODE END 1 */
  5.   

  6.   /* Enable I-Cache---------------------------------------------------------*/
  7.   SCB_EnableICache();

  8.   /* Enable D-Cache---------------------------------------------------------*/
  9.   SCB_EnableDCache();

  10.   /* MCU Configuration--------------------------------------------------------*/

  11.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  12.   HAL_Init();

  13.   /* USER CODE BEGIN Init */

  14.   /* USER CODE END Init */

  15.   /* Configure the system clock */
  16.   SystemClock_Config();

  17.   /* USER CODE BEGIN SysInit */

  18.   /* USER CODE END SysInit */

  19.   /* Initialize all configured peripherals */
  20.   MX_GPIO_Init();
  21.   MX_DMA_Init();
  22.   MX_ADC1_Init();
  23.   //MX_ADC2_Init();
  24.        
  25.         HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t *)g_usADC1_Data, 1000);
  26.        
  27.         //需要使用HAL_ADCEx_MultiModeStart_DMA对hadc2进行操作吗?
  28.   /* USER CODE BEGIN 2 */

  29.   /* USER CODE END 2 */

  30.   /* Infinite loop */
  31.   /* USER CODE BEGIN WHILE */
  32.   while (1)
  33.   {
  34.     /* USER CODE END WHILE */

  35.     /* USER CODE BEGIN 3 */
  36.   }
  37.   /* USER CODE END 3 */
  38. }
复制代码


这个main函数,我只是添加了HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t *)g_usADC1_Data, 1000);还需要对adc2进行操作吗???
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2019-10-23
在线时间
42 小时
 楼主| 发表于 2020-3-4 11:31:14 | 显示全部楼层
  1. 《1111》
  2. //去掉adc中的 ADC_MultiModeTypeDef multimode信息以及multimode配置
  3.   MX_ADC1_Init();
  4.   MX_ADC2_Init();
  5.   HAL_ADC_Start_DMA(&hadc1,(uint32_t *)g_usADC1_Data, 2);
  6.   HAL_ADC_Start_DMA(&hadc2,(uint32_t *)g_usADC2_Data, 2);
  7.     这样两者均不会进入到DMA中断

  8. 《2222》
  9. //去掉adc中的 ADC_MultiModeTypeDef multimode信息以及multimode配置,只
  10.     MX_ADC1_Init();
  11.     HAL_ADC_Start_DMA(&hadc1,(uint32_t *)g_usADC1_Data, 2);
  12. 这样可以进入adc1的dma中断,但是
  13.   MX_ADC1_Init();
  14.   MX_ADC2_Init();
  15.   HAL_ADC_Start_DMA(&hadc1,(uint32_t *)g_usADC1_Data, 2);
  16. 这样就不行了额,进不了adc1的dma中断

  17. 《3333》
  18. //加上adc中的 ADC_MultiModeTypeDef multimode信息以及multimode配置
  19.   MX_ADC1_Init();
  20.   MX_ADC2_Init();
  21.     HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t *)g_usADC1_Data, 1000);
  22. 可进入adc1的DMA中断,但是进入不了adc2的 DMA中断

  23. 《4444》
  24. //加上adc中的 ADC_MultiModeTypeDef multimode信息以及multimode配置
  25.   MX_ADC1_Init();
  26.   MX_ADC2_Init();
  27.    
  28.     HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t *)g_usADC1_Data, 1000);
  29.     HAL_ADCEx_MultiModeStart_DMA(&hadc2, (uint32_t *)g_usADC2_Data, 1000);
  30. 依然可进入adc1的DMA中断,但是进入不了adc2的 DMA中断
复制代码
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2020-3-20
在线时间
8 小时
发表于 2020-4-28 14:08:12 | 显示全部楼层
楼主的问题解决了吗?我也碰到了这个问题
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-5-1
在线时间
3 小时
发表于 2020-5-2 16:05:28 | 显示全部楼层
vanau 发表于 2020-4-28 21:15
这个已解决了,建议看手册,还有先使用cubemx建立一个工程。需要知道,只需要开启主adc的多通道DMA即可, ...

楼主写的程序能发我一份参考一下吗,我急用,毕设还没做完,有赏
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 11:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表