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

关于H7 ADC的多通道 定时器触发问题

[复制链接]
安静ing 提问时间:2019-10-11 11:27 /
悬赏10ST金币未解决
我用单通道定时器触发+dma双缓冲
读到的数据与我定时器配置的采样率是一样的
但配置成多通道后触发时间与定时器无关采样值直接是全速采样了,无法等分时间差

我的ADC配置如下:
求大神指点
  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: bsp_InitADC
  4. *        功能说明: 初始化ADC
  5. *        形    参: 无
  6. *        返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void bsp_InitADC(void)
  10. {
  11.         GPIO_InitTypeDef         GPIO_InitStruct;

  12.         /* 配置ADC采样使用的引脚  */
  13.         __HAL_RCC_GPIOA_CLK_ENABLE();

  14.     GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_4
  15.                           |GPIO_PIN_6|GPIO_PIN_7;
  16.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  17.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  18.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  19.         /* 配置ADC采样使用的时钟  */
  20.         __HAL_RCC_DMA1_CLK_ENABLE();
  21.         DmaHandle.Instance                 = DMA1_Stream1;            /* 使用的DMA1 Stream1 */
  22.         DmaHandle.Init.Request             = DMA_REQUEST_ADC1;            /* 请求类型采用DMA_REQUEST_ADC1 */  
  23.         DmaHandle.Init.Direction           = DMA_PERIPH_TO_MEMORY;    /* 传输方向是从外设到存储器 */  
  24.         DmaHandle.Init.PeriphInc           = DMA_PINC_DISABLE;        /* 外设地址自增禁止 */
  25.         DmaHandle.Init.MemInc              = DMA_MINC_ENABLE;         /* 存储器地址自增使能 */  
  26.         DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;  /* 外设数据传输位宽选择半字,即16bit */     
  27.         DmaHandle.Init.MemDataAlignment    = DMA_MDATAALIGN_HALFWORD;  /* 存储器数据传输位宽选择半字,即16bit */   
  28.         DmaHandle.Init.Mode                = DMA_CIRCULAR;            /* 循环模式 */   
  29.         DmaHandle.Init.Priority            = DMA_PRIORITY_LOW;        /* 优先级低 */  
  30.         DmaHandle.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;    /* 禁止FIFO*/
  31.         DmaHandle.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL; /* 禁止FIFO此位不起作用,用于设置阀值 */
  32.         DmaHandle.Init.MemBurst            = DMA_MBURST_SINGLE;       /* 禁止FIFO此位不起作用,用于存储器突发 */
  33.         DmaHandle.Init.PeriphBurst         = DMA_PBURST_SINGLE;       /* 禁止FIFO此位不起作用,用于外设突发 */

  34.     /* 初始化DMA */
  35.     HAL_DMA_Init(&DmaHandle);
  36.    
  37.     /* 开启DMA1 Stream1的中断 */
  38.     HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 2, 0);
  39.     HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
  40.    
  41.     /* 关联ADC句柄和DMA句柄 */
  42.         __HAL_LINKDMA(&AdcHandle, DMA_Handle, DmaHandle);

  43.         /* 配置ADC */
  44.         __HAL_RCC_ADC12_CLK_ENABLE();
  45.         AdcHandle.Instance = ADC1;
  46.        
  47.         AdcHandle.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV4;      /* 采用AHB同步时钟,4分频,即200MHz/4 = 50MHz */
  48.         AdcHandle.Init.Resolution            = ADC_RESOLUTION_16B;            /* 16位分辨率 */
  49.         AdcHandle.Init.ScanConvMode          = ADC_SCAN_ENABLE;               /* 使用扫描 */
  50.         AdcHandle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;           /* EOC转换结束标志 */
  51.         AdcHandle.Init.LowPowerAutoWait      = DISABLE;                       /* 禁止低功耗自动延迟特性 */
  52.         AdcHandle.Init.ContinuousConvMode    = ENABLE;                        /* 禁止自动转换,采用的定时器触发转换 */
  53.         AdcHandle.Init.NbrOfConversion       = ADC_CH_NUM;                    /* 使用了8个转换通道 */
  54.         AdcHandle.Init.DiscontinuousConvMode = DISABLE;                       /* 禁止不连续模式 */
  55.         AdcHandle.Init.NbrOfDiscConversion   = 1;                             /* 禁止不连续模式后,此参数忽略,此位是用来配置不连续子组中通道数 */
  56.         AdcHandle.Init.ExternalTrigConv      = ADC_EXTERNALTRIG_T1_CC1;            /* 定时器1的CC1触发 */
  57.         AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_RISING;    /* 上升沿触发 */
  58.         AdcHandle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR; /* DMA循环模式接收ADC转换的数据 */
  59.         AdcHandle.Init.BoostMode                = ENABLE;                          /* ADC时钟超过20MHz的话,使能boost */
  60.         AdcHandle.Init.Overrun                  = ADC_OVR_DATA_OVERWRITTEN;        /* ADC转换溢出的话,覆盖ADC的数据寄存器 */
  61.         AdcHandle.Init.OversamplingMode         = DISABLE;                         /* 禁止过采样 */

  62.     /* 初始化ADC */
  63.         HAL_ADC_Init(&AdcHandle);
  64.    
  65.     HAL_Delay(1000);/* 等待电源稳定 */
  66.    
  67.         /* 校准ADC,采用偏移校准 */
  68.         HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);
  69.   
  70.     /**ADC1 GPIO Configuration   
  71.     PA0     ------> ADC1_INP16
  72.     PA1     ------> ADC1_INP17
  73.     PA2     ------> ADC1_INP14
  74.     PA4     ------> ADC1_INP18
  75.     PA6     ------> ADC1_INP3
  76.     PA7     ------> ADC1_INN3 (ADC1_INP7)
  77.     */
  78.     ADC_RegularChannelConfig(ADC_CHANNEL_16,ADC_REGULAR_RANK_1,ADC_SAMPLETIME_1CYCLE_5,ADC_SINGLE_ENDED);
  79.     ADC_RegularChannelConfig(ADC_CHANNEL_17,ADC_REGULAR_RANK_2,ADC_SAMPLETIME_1CYCLE_5,ADC_SINGLE_ENDED);
  80.     ADC_RegularChannelConfig(ADC_CHANNEL_14,ADC_REGULAR_RANK_3,ADC_SAMPLETIME_1CYCLE_5,ADC_SINGLE_ENDED);
  81.     ADC_RegularChannelConfig(ADC_CHANNEL_18,ADC_REGULAR_RANK_4,ADC_SAMPLETIME_1CYCLE_5,ADC_SINGLE_ENDED);
  82.     ADC_RegularChannelConfig(ADC_CHANNEL_7,ADC_REGULAR_RANK_5,ADC_SAMPLETIME_1CYCLE_5,ADC_SINGLE_ENDED);
  83. //    ADC_RegularChannelConfig(ADC_CHANNEL_7,ADC_REGULAR_RANK_1,ADC_SAMPLETIME_1CYCLE_5,ADC_SINGLE_ENDED);

  84.         /* 配置ADC的定时器触发 */
  85.         TIM1_Config(50000);
  86.   
  87.         /* 启动ADC的DMA方式传输 */
  88.         HAL_ADC_Start_DMA(&AdcHandle, (uint32_t *)ADCxValues, ADC_CONV_COUNT);
  89. }


  90. /*
  91. *********************************************************************************************************
  92. *        函 数 名: ADC_RegularChannelConfig
  93. *        功能说明: ADC通道配置
  94. *        形    参: ADC_Channel   :通道号
  95. *            ADC_Rank      :通道序号
  96. *            ADC_SampleTime:采样周期
  97. *            ADC_SingleDiff:输入模式
  98. *        返 回 值: 无
  99. *********************************************************************************************************
  100. */
  101. static void ADC_RegularChannelConfig(uint32_t ADC_Channel, uint32_t ADC_Rank, uint8_t ADC_SampleTime, uint32_t ADC_SingleDiff)
  102. {
  103.         ADC_ChannelConfTypeDef    sConfig = { 0 };

  104.         sConfig.Channel         = ADC_Channel;                 /* 配置使用的ADC通道 */
  105.         sConfig.Rank            = ADC_Rank;                    /* 采样序列 */
  106.         sConfig.SamplingTime    = ADC_SampleTime;              /* 采样周期 */
  107.         sConfig.SingleDiff      = ADC_SingleDiff;              /* 单端输入 */
  108.         sConfig.OffsetNumber    = ADC_OFFSET_NONE;             /* 无偏移 */
  109.         sConfig.Offset          = 0;                           /* 无偏移的情况下,此参数忽略 */
  110.         sConfig.OffsetRightShift = DISABLE;                    /* 禁止右移 */
  111.         sConfig.OffsetSignedSaturation = DISABLE;              /* 禁止有符号饱和 */

  112.         HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
  113. }
复制代码


收藏 评论2 发布时间:2019-10-11 11:27

举报

2个回答
安静ing 回答时间:2019-10-14 15:19:36
顶一下
安静ing 回答时间:2019-10-15 09:25:20
额吧AdcHandle.Init.ContinuousConvMode    = ENABLE;改为禁用就好了 眼花了

所属标签

相似问题

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