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

关于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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版