OpenEdv-开源电子网

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

ADC+DMA双通道采集程序卡死及数据错位

[复制链接]

1

主题

5

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2021-6-26
在线时间
4 小时
发表于 2023-9-12 22:52:24 | 显示全部楼层 |阅读模式
1金钱
按照配置后加上DMA的中断程序在初始化卡死。去掉中断后数据错位,双通道输出数据不正常。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2021-6-26
在线时间
4 小时
 楼主| 发表于 2023-9-12 22:52:52 | 显示全部楼层
DMA_HandleTypeDef hdma_adc3;
        ADC_HandleTypeDef hadc3;

void MX_ADC3_Init(void)
{
  ADC_ChannelConfTypeDef sConfig = {0};
  hadc3.Instance = ADC1;
  hadc3.Init.ScanConvMode = ADC_SCAN_ENABLE;
  hadc3.Init.ContinuousConvMode = ENABLE;
  hadc3.Init.DiscontinuousConvMode = DISABLE;
  hadc3.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc3.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc3.Init.NbrOfConversion = 2;
  HAL_ADC_Init(&hadc3);
       
  sConfig.Channel = ADC_CHANNEL_10;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
  HAL_ADC_ConfigChannel(&hadc3, &sConfig);

  sConfig.Channel = ADC_CHANNEL_11;
  sConfig.Rank = ADC_REGULAR_RANK_2;
        sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
  HAL_ADC_ConfigChannel(&hadc3, &sConfig);
}
void MX_DMA_Init(void)
{
__HAL_RCC_DMA1_CLK_ENABLE();
  
                        HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
                        HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);

}
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{

                GPIO_InitTypeDef GPIO_InitStruct = {0};
                if(adcHandle->Instance==ADC1)
                {
                        __HAL_RCC_ADC1_CLK_ENABLE();
                        __HAL_RCC_GPIOC_CLK_ENABLE();
                       
               
                        GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
                        GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
                        HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

                        hdma_adc3.Instance = DMA1_Channel1;
                        hdma_adc3.Init.Direction = DMA_PERIPH_TO_MEMORY;
                        hdma_adc3.Init.PeriphInc = DMA_PINC_DISABLE;
                        hdma_adc3.Init.MemInc = DMA_MINC_ENABLE;
                        hdma_adc3.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
                        hdma_adc3.Init.MemDataAlignment = DMA_PDATAALIGN_WORD;
                        hdma_adc3.Init.Mode = DMA_CIRCULAR;
                        hdma_adc3.Init.Priority = DMA_PRIORITY_HIGH;
                        HAL_DMA_Init(&hdma_adc3);

                        __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc3);
                       
//                        HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
//                        HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
                }
}

void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
{
    __HAL_RCC_ADC1_CLK_DISABLE();
    HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0|GPIO_PIN_1);
    HAL_DMA_DeInit(adcHandle->DMA_Handle);
  
}

回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2021-6-26
在线时间
4 小时
 楼主| 发表于 2023-9-12 22:53:34 | 显示全部楼层
HAL_Init();
        /* 初始化系统时钟为64MHz */
        SystemClock_Config();
  __HAL_AFIO_REMAP_SWJ_NOJTAG();
//        __HAL_RCC_SYSCFG_CLK_ENABLE();
//  protocol_init();
        DEBUG_USART_Config();
//        
        motor_init();
        Encoder_Init();
  TIMx_Configuration();
  PID_param_init();
        Remote_Init();
        MX_DMA_Init();
        
        
        MX_ADC3_Init();
        HAL_ADCEx_Calibration_Start(&hadc3);
HAL_ADC_Start_DMA(&hadc3,(uint32_t*)&ADC_Valuex,10);

//#if defined(PID_ASSISTANT_EN)
//  set_computer_value(SEND_STOP_CMD, CURVES_CH1, NULL, 0);    // 同步上位机的启动按钮状态
//  set_computer_value(SEND_TARGET_CMD, CURVES_CH1, &target_speed_motor1, 1);     // 给通道 1 发送目标值
//        set_computer_value(SEND_STOP_CMD, CURVES_CH2, NULL, 0);    // 同步上位机的启动按钮状态
//  set_computer_value(SEND_TARGET_CMD, CURVES_CH2, &target_speed_motor2, 1);     // 给通道 2 发送目标值
//#endif

        while(1)
        {        
                for(i = 0,ad1 =0,ad2=0; i < 10;)
           {
                                ad1 += ADC_Valuex[i++];
                                ad2 += ADC_Valuex[i++];
           }
                ad1 /= 5;
                ad2 /= 5;
            printf("[\tmain]info:AD1_value=%1.3fV\r\n",ad1*3.3f/4096);
            printf("[\tmain]info:AD2_value=%1.3fV\r n",ad2*3.3f/4096);

    /* 接收数据处理 */
//    receiving_process();

        }
}
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2021-6-26
在线时间
4 小时
 楼主| 发表于 2023-9-12 22:54:14 | 显示全部楼层
以上是ADC的配置函数,及主函数,麻烦大哥们帮帮忙
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2021-6-26
在线时间
4 小时
 楼主| 发表于 2023-9-12 22:57:04 | 显示全部楼层
以上是ADC+DMA配置  及主函数
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2023-9-13 21:28:57 | 显示全部楼层
可以参考我们开发板例程,都有DMA+ADC多通道的了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 15:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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