硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1312|回复: 8
收起左侧

[ADC] stm32h750 ADC DMA不通问题

[复制链接]

5

主题

23

回帖

38

积分

新手上路

积分
38
发表于 2024-9-8 16:49:15 | 显示全部楼层 |阅读模式
本帖最后由 sofia 于 2024-9-9 20:22 编辑

用定时器3 TIM_TRGO_UPDATE触发ADC1转换,DMA转存,无赖小弟搞了一个星期还是不通进不去DMA中断服务函数,求大神点拨下,谢谢。初始代码如下:


void TIM3_Config(void)
{
    __HAL_RCC_TIM3_CLK_ENABLE();                                      /* 使能TIMx时钟 */
   
    g_timx_handle.Instance = TIM3;                          /* 通用定时器x */
    g_timx_handle.Init.Prescaler = 23999;                              /* 预分频系数 */
    g_timx_handle.Init.CounterMode = TIM_COUNTERMODE_UP;             /* 递增计数模式 */
    g_timx_handle.Init.Period = 0;                                 /* 自动装载值 */
        g_timx_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
        g_timx_handle.Init.ClockDivision = TIM_CLOCKPRESCALER_DIV1;
        HAL_TIM_Base_Init(&g_timx_handle);

        g_timx_master_config.MasterOutputTrigger = TIM_TRGO_UPDATE;
        g_timx_master_config.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
        HAL_TIMEx_MasterConfigSynchronization(&g_timx_handle, &g_timx_master_config);

        __HAL_TIM_ENABLE(&g_timx_handle);
        HAL_TIM_Base_Start(&g_timx_handle);
}

void adc_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;
    ADC_ChannelConfTypeDef adc_ch_conf = {0};
        ADC_HandleTypeDef g_adc_handle;
               
        DMA_HandleTypeDef g_dma_adc_handle;
        ADC_HandleTypeDef g_adc_dma_handle;

    //ADC_ADCX_CHY_GPIO_CLK_ENABLE();                                         /* ????ADC???IO??????? */
    ADC_ADC1_CH3_GPIO_CLK_ENABLE();
    __HAL_RCC_ADC12_CLK_ENABLE();                                              /* ???ADC1/2??? */
    __HAL_RCC_DMA1_CLK_ENABLE();                                        /* DMA1?????? */
    __HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_CLKP);                            /* ADC?????????? */

    gpio_init_struct.Pin = GPIO_PIN_7|GPIO_PIN_6;           /* ADC???IO???? */
        //gpio_init_struct.Pin = ADC_ADC1_CH3P_GPIO;
    gpio_init_struct.Mode = GPIO_MODE_ANALOG;                               /* ??? */
        gpio_init_struct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOA, &gpio_init_struct);
#if 1
    gpio_init_struct.Pin = ADC_ADC2_CH4N_GPIO|ADC_ADC2_CH4P_GPIO;           /* ADC???IO???? */
    gpio_init_struct.Mode = GPIO_MODE_ANALOG;                               /* ??? */
        gpio_init_struct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(ADC_ADC2_CH4_GPIO_PORT, &gpio_init_struct);
#endif
    /* ?????DMA */
    g_dma_adc_handle.Instance = DMA1_Stream7;                             /* ???DMA1 Stream7 */
    g_dma_adc_handle.Init.Request = DMA_REQUEST_ADC1;                     /* ???????DMA_REQUEST_ADC1 */
    g_dma_adc_handle.Init.Direction = DMA_PERIPH_TO_MEMORY;                 /* ?????赽?洢???? */
    g_dma_adc_handle.Init.PeriphInc = DMA_PINC_DISABLE;                     /* ??????????? */
    g_dma_adc_handle.Init.MemInc = DMA_MINC_ENABLE;                         /* ?洢???????? */
    g_dma_adc_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;    /* ???????????:16λ */
    g_dma_adc_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;       /* ?洢?????????:16λ */
    g_dma_adc_handle.Init.Mode = DMA_CIRCULAR;// | DMA_SxCR_DBM;                                /* ????????????????????? */
        //g_dma_adc_handle.Init.Mode = DMA_NORMAL;
        g_dma_adc_handle.Init.Priority = DMA_PRIORITY_HIGH;                   /* ?е?????? */
    g_dma_adc_handle.Init.FIFOMode = DMA_FIFOMODE_DISABLE;                  /* ???FIFO*/
        g_dma_adc_handle.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_HALFFULL;
        g_dma_adc_handle.Init.MemBurst                          = DMA_MBURST_SINGLE;
        g_dma_adc_handle.Init.PeriphBurst                  = DMA_PBURST_SINGLE;

        HAL_DMA_Init(&g_dma_adc_handle);                                        /* ?????DMA */

    HAL_NVIC_SetPriority(DMA1_Stream7_IRQn, 1, 1);
    HAL_NVIC_EnableIRQ(DMA1_Stream7_IRQn);

    __HAL_LINKDMA(&g_adc_dma_handle, DMA_Handle, g_dma_adc_handle);         /* ??DMA?????ADC??????????? */

    /* ?????ADC1 */
    g_adc_dma_handle.Instance = ADC1;                                               /* ??????ADC */
    g_adc_dma_handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;                        /* ???????2???,??adc_ker_ck=per_ck/2=32Mhz */
    g_adc_dma_handle.Init.Resolution = ADC_RESOLUTION_16B;                             /* 16λ??  */
    g_adc_dma_handle.Init.ScanConvMode = ADC_SCAN_DISABLE;                              /* ???????????????????? */
//    g_adc_dma_handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV;                           /* ???EOC?ж? */
        g_adc_dma_handle.Init.EOCSelection = DISABLE;

    g_adc_dma_handle.Init.LowPowerAutoWait = DISABLE;                                   /* ?????????? */
    g_adc_dma_handle.Init.ContinuousConvMode = DISABLE;                                  /* ???????????? */

    g_adc_dma_handle.Init.NbrOfConversion = 1;                                          /* ?????Χ??1~16??????????1????? */
    g_adc_dma_handle.Init.DiscontinuousConvMode = DISABLE;                              /* ???????????鲻?????????? */
    g_adc_dma_handle.Init.NbrOfDiscConversion = 1;                                      /* ???ò???????????????????????????????鲻????????????????????? */
    g_adc_dma_handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;//
    g_adc_dma_handle.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T3_TRGO;//
    g_adc_dma_handle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;    /* DMA???δ???ADC???? */

    g_adc_dma_handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;                           /* ???μ?????????????????? */
    g_adc_dma_handle.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;                         /* ????ADC????????????λ?? */
    g_adc_dma_handle.Init.OversamplingMode = DISABLE;                                   /* ????????? */  
    HAL_ADC_Init(&g_adc_dma_handle);                                                    /* ????? */
        
    HAL_ADCEx_Calibration_Start(&g_adc_dma_handle, ADC_CALIB_OFFSET, ADC_DIFFERENTIAL_ENDED); /* ADCУ? */

    adc_ch_conf.Channel = ADC_CHANNEL_3;                             /* ????????ADC??? */
    adc_ch_conf.Rank = ADC_REGULAR_RANK_1;                          /* ????????????1?? */
    adc_ch_conf.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;          /* ?????????810.5????????? */
    adc_ch_conf.SingleDiff = ADC_DIFFERENTIAL_ENDED;//???????     ADC_SINGLE_ENDED ;/* ???????? */
    adc_ch_conf.OffsetNumber = ADC_OFFSET_NONE;                     /* ????? */
    adc_ch_conf.Offset = 0;                                         /* ??????????£?????????? */
    adc_ch_conf.OffsetRightShift = DISABLE;                         /* ??????? */
    adc_ch_conf.OffsetSignedSaturation = DISABLE;                   /* ????з?????? */
    HAL_ADC_ConfigChannel(&g_adc_dma_handle, &adc_ch_conf);         /* ????ADC??? */

        TIM3_Config();
    HAL_ADC_Start_DMA(&g_adc_dma_handle, &ADCxValues, 128);                  /* ????ADC?????DMA?????? */
}


void DMA1_Stream7_IRQHandler(void)
{
                if((DMA1->HISR & DMA_FLAG_TCIF3_7) != RESET)
                {
                        
                        s_DmaFlag = 2;
                        DMA1->HIFCR = DMA_FLAG_TCIF3_7;
                }
                if((DMA1->HISR & DMA_FLAG_HTIF3_7) != RESET)
                {
                        s_DmaFlag = 1;
                        DMA1->HIFCR = DMA_FLAG_HTIF3_7;
                }
    }
}






回复

使用道具 举报

39

主题

1516

回帖

1638

积分

至尊会员

积分
1638
发表于 2024-9-8 22:05:04 | 显示全部楼层
g_timx_master_config.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;   这个你关闭了 所以不行
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-9-9 08:21:52 | 显示全部楼层
HAL_TIM_Base_Start启动没。
回复

使用道具 举报

5

主题

23

回帖

38

积分

新手上路

积分
38
 楼主| 发表于 2024-9-9 20:21:53 | 显示全部楼层
sanit 发表于 2024-9-8 22:05
g_timx_master_config.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;   这个你关闭了 所以不行

使用TIM3 TRGO定时触发AD转换  为什么要开这个主从模式  能否讲讲?谢谢
回复

使用道具 举报

5

主题

23

回帖

38

积分

新手上路

积分
38
 楼主| 发表于 2024-9-9 20:25:09 | 显示全部楼层
本帖最后由 sofia 于 2024-9-9 20:26 编辑
eric2013 发表于 2024-9-9 08:21
HAL_TIM_Base_Start启动没。

坛主大神  这个已经加了  只是忘记粘贴上来了   定时器10k的频率触发AD转换  用软件触发是可以的  用定时+DMA就不行  实在找不出哪里出问题  
回复

使用道具 举报

5

主题

23

回帖

38

积分

新手上路

积分
38
 楼主| 发表于 2024-9-9 21:48:28 | 显示全部楼层
初始化ADC\DMA\TIM3相关寄存器打印值如下:
ADC1->CR:0x50000105
ADC1->CFGR:0x80001483
ADC1->CFGR2:0
ADC1->SMPR1:0x1200
ADC1->SMPR2:0
ADC1->PCSEL:0x8
ADC1->DIFSEL:0x8
ADC1->SQR1:0xc0
ADC1->SQR2:0
ADC1->SQR3:0
ADC1->SQR4:0
ADC1->OFR1:0
ADC1->OFR2:0
ADC1->OFR3:0
ADC1->OFR4:0
ADC1->DR:0x6fff

DMA1_Stream7->CR:0x7f
DMA1_Stream7->NDTR:0x40022040
DMA1_Stream7->PAR:0x24000688
DMA1_Stream7->M0AR:0
DMA1_Stream7->M1AR:0x8

TIM3->CR1:0x81
TIM3->CR2:0x20
TIM3->SMCR:0
TIM3->DIER:0
TIM3->SR:1
TIM3->EGR:0
TIM3->CNT:0
TIM3->PSC:0x5dbf
TIM3->ARR:0
TIM3->RCR:0
TIM3->TISEL:0
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-9-10 08:39:35 | 显示全部楼层
sofia 发表于 2024-9-9 20:25
坛主大神  这个已经加了  只是忘记粘贴上来了   定时器10k的频率触发AD转换  用软件触发是可以的  用定时 ...

参考我们的吧

https://forum.anfulai.cn/forum.p ... &extra=page%3D1
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2024-10-18 16:57:17 | 显示全部楼层
我使用STM32CubeMX配置的 用定时器2 TIM_TRGO_UPDATE触发ADC1转换,DMA转存,也是进不去DMA中断服务函数

后面只改了图中这个配置就正常了

  hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_ONESHOT;//这句代码吧

void MX_ADC1_Init(void)
{
  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  ADC_MultiModeTypeDef multimode = {0};
  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */

  /** Common config
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc1.Init.LowPowerAutoWait = DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.NbrOfConversion = 1;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T2_TRGO;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
  hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_ONESHOT;
  hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
  hadc1.Init.OversamplingMode = DISABLE;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure the ADC multi-mode
  */
  multimode.Mode = ADC_MODE_INDEPENDENT;
  if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_8;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;
  sConfig.OffsetSignedSaturation = DISABLE;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */

  /* USER CODE END ADC1_Init 2 */

}
微信图片_20241018165428.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-10-19 09:26:57 | 显示全部楼层
boome 发表于 2024-10-18 16:57
我使用STM32CubeMX配置的 用定时器2 TIM_TRGO_UPDATE触发ADC1转换,DMA转存,也是进不去DMA中断服务函数

...

谢谢分享。
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2024-10-21 09:09:41 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 20:15 , Processed in 0.054114 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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