硬汉嵌入式论坛

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

[ADC] 外部触发ADC的数据为0

[复制链接]

20

主题

102

回帖

162

积分

初级会员

积分
162
QQ
发表于 2024-7-18 22:34:02 | 显示全部楼层 |阅读模式
就是我发现一个问题!为什么我用cubemx生成的代码总是缺少ADC的GPIO的采集IO口的配置,这一段需要我手动添加。
微信截图_20240718223006.png
然后第二个问题就是我自己手动用PE11引脚给他触发一个高电平的时候打印出来的ADC的值都是0是怎么回事呢?我去仿真里面看好像根本就采集不到数据
数据全是0.png
下面是我的主函数的代码以及ADC的配置,谢谢大家帮我纠正问题(我开启了DMA)!


#define ADC_DATA_LENGTH  1024  //定义采集数据长度为2048
uint32_t g_adc3_dma_data1[ADC_DATA_LENGTH];//定义adc3采集数据存放数组
uint8_t g_adc3_dma_complete_flag = 0;        //adc3数据dma采集完成标志,在dma采集完成回调函数设置

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if (GPIO_Pin == GPIO_PIN_11)
    {
        // 处理GPIO_PIN_11的中断事件
                g_adc3_dma_complete_flag = 1;
                HAL_ADC_Stop_DMA(&hadc3);
    }
}
void SystemClock_Config(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART6_UART_Init();
  MX_ADC3_Init();
  HAL_ADC_Start_DMA(&hadc3,g_adc3_dma_data1,ADC_DATA_LENGTH);//ADC的dma开始采集
  while (1)
  {
if(g_adc3_dma_complete_flag == 1)//采集数据没完成,采集完成后再发送 111
                        {
                                for(int i=0;i<ADC_DATA_LENGTH;i++)
                                {                               
                                        printf("%d\r\n",g_adc3_dma_data1&0x0000ffff);
                                }
                                g_adc3_dma_complete_flag = 0;               
                                memset(g_adc3_dma_data1,0,ADC_DATA_LENGTH);//清除数据
                                HAL_ADC_Start_DMA(&hadc3, g_adc3_dma_data1,ADC_DATA_LENGTH);//ADC的dma开始采集
                        }
  }

}





void MX_ADC3_Init(void)
{

  ADC_ChannelConfTypeDef sConfig = {0};

  hadc3.Instance = ADC3;
  hadc3.Init.Resolution = ADC_RESOLUTION_16B;
  hadc3.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc3.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc3.Init.LowPowerAutoWait = DISABLE;
  hadc3.Init.ContinuousConvMode = DISABLE;
  hadc3.Init.NbrOfConversion = 1;
  hadc3.Init.DiscontinuousConvMode = DISABLE;
  hadc3.Init.ExternalTrigConv = ADC_EXTERNALTRIG_EXT_IT11;
  hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
  hadc3.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_ONESHOT;
  hadc3.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  hadc3.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
  hadc3.Init.OversamplingMode = DISABLE;
  if (HAL_ADC_Init(&hadc3) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_1;
  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(&hadc3, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }


void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{
        GPIO_InitTypeDef GPIO_InitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  if(adcHandle->Instance==ADC3)
  {

    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC;
    PeriphClkInitStruct.PLL3.PLL3M = 25;
    PeriphClkInitStruct.PLL3.PLL3N = 200;
    PeriphClkInitStruct.PLL3.PLL3P = 10;
    PeriphClkInitStruct.PLL3.PLL3Q = 10;
    PeriphClkInitStruct.PLL3.PLL3R = 10;
    PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;
    PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
    PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
    PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL3;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    {
      Error_Handler();
    }

    /* ADC3 clock enable */
    __HAL_RCC_ADC3_CLK_ENABLE();

    __HAL_RCC_GPIOC_CLK_ENABLE();
    /**ADC3 GPIO Configuration
    PC3_C     ------> ADC3_INP1
    */
         GPIO_InitStruct.Pin = GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    HAL_SYSCFG_AnalogSwitchConfig(SYSCFG_SWITCH_PC3, SYSCFG_SWITCH_PC3_OPEN);

    hdma_adc3.Instance = DMA1_Stream0;
    hdma_adc3.Init.Request = DMA_REQUEST_ADC3;
    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_MDATAALIGN_WORD;
    hdma_adc3.Init.Mode = DMA_NORMAL;
    hdma_adc3.Init.Priority = DMA_PRIORITY_LOW;
    hdma_adc3.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    if (HAL_DMA_Init(&hdma_adc3) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc3);

  }
}

void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
{

  if(adcHandle->Instance==ADC3)
  {
    __HAL_RCC_ADC3_CLK_DISABLE();

    HAL_DMA_DeInit(adcHandle->DMA_Handle);

  }
}



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2024-7-19 09:05:40 | 显示全部楼层
1、这个给ST反馈
2、楼主这个不是监测到触发后,开启转换吗,这个程序里面为什么检测到后关闭了,是出于什么考虑

g_adc3_dma_complete_flag = 1;
HAL_ADC_Stop_DMA(&hadc3);

另外就是当前能正常进入EXTI11中断里面吧,
回复

使用道具 举报

20

主题

102

回帖

162

积分

初级会员

积分
162
QQ
 楼主| 发表于 2024-7-19 12:34:26 | 显示全部楼层
eric2013 发表于 2024-7-19 09:05
1、这个给ST反馈
2、楼主这个不是监测到触发后,开启转换吗,这个程序里面为什么检测到后关闭了,是出于什 ...

谢谢硬汉哥,当前能正常进入中断,然后那个好像确实是逻辑搞错了。应该是进入中断后开始采集,我给弄错了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-16 15:26 , Processed in 0.038766 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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