完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
ADC配置检测3个通道,DMA传输长度为1,OVR标志不会置1,为什么?
不知道自己哪里理解错误了,求指教 if (HAL_ADC_Start_DMA( hadc1,(uint32_t *)aADCxConvertedData,1) != HAL_OK) { Error_Handler(); } ///////初始配置 hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;//ADC_CLOCK_ASYNC_DIV1;// hadc1.Init.Resolution = ADC_RESOLUTION_12B; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;//多通道扫描要使能,单通道扫描关闭 hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; hadc1.Init.LowPowerAutoWait = DISABLE;//等待转换模式 hadc1.Init.LowPowerAutoPowerOff = DISABLE;//自动关闭模式 hadc1.Init.ContinuousConvMode = DISABLE;//单次或连续转换模式 hadc1.Init.NbrOfConversion = 3;//转换通道3个 hadc1.Init.DiscontinuousConvMode = DISABLE;//不连续模式 hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc1.Init.DMAContinuousRequests = DISABLE;//ENABLE; hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;//溢出覆盖数据 hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5; hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_160CYCLES_5; hadc1.Init.OversamplingMode = DISABLE;//过采样器使能 // hadc1.Init.OversamplingMode = ENABLE; hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_16; hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_4; hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER; hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH; if (HAL_ADC_Init( hadc1) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_4; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2; if (HAL_ADC_ConfigChannel( hadc1, sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_TEMPSENSOR; sConfig.Rank = ADC_REGULAR_RANK_2; if (HAL_ADC_ConfigChannel( hadc1, sConfig) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_VREFINT; sConfig.Rank = ADC_REGULAR_RANK_3; if (HAL_ADC_ConfigChannel( hadc1, sConfig) != HAL_OK) { Error_Handler(); } /* ADC1 DMA Init */ /* ADC1 Init */ hdma_adc1.Instance = DMA1_Channel1; hdma_adc1.Init.Request = DMA_REQUEST_ADC1; hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE; hdma_adc1.Init.MemInc = DMA_MINC_ENABLE; hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_adc1.Init.Mode = DMA_NORMAL;//DMA_CIRCULAR;// hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH; if (HAL_DMA_Init( hdma_adc1) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(hadc,DMA_Handle,hdma_adc1); |
|
相关推荐
1个回答
|
|
检查ADC和DMA的配置是否正确,确保以下几点:
1. 确保ADC的引脚正确配置,使得3个通道的输入信号能够正确连接到ADC。检查ADC的GPIO引脚配置是否正确。 2. 检查DMA的通道配置是否正确,确保DMA能够正确地传输数据。检查DMA的初始化配置是否正确,包括数据传输方向、传输数据的大小、传输完成后的回调函数等。 3. 检查DMA的传输长度是否设置正确,确保每次传输的数据长度为1个单位。在代码中的`HAL_ADC_Start_DMA`函数中,第三个参数为传输数据的长度,应该设置为1。 4. 确保ADC的转换模式配置正确。在代码中的`hadc1.Init.ScanConvMode`配置为`ADC_SCAN_ENABLE`,表示启用多通道扫描模式。 5. 最后,确保ADC的中断和DMA传输的中断配置正确。检查NVIC中断配置和中断处理函数,确保配置正确且能够正常处理中断请求。 如果以上配置都正确,但仍然没有触发OVR标志位,可以参考以下操作进行排查: 1. 检查ADC的时钟源,确保ADC的时钟源和时钟分频配置正确。 2. 检查ADC的采样时间配置,确保采样时间足够长以满足输入信号的要求。 3. 检查ADC转换周期配置,确保转换周期足够长以满足ADC的要求。 4. 检查ADC的参考电压配置,确保参考电压和输入电压范围的匹配。 如果经过检查仍然无法解决问题,可以尝试通过调试工具(如调试器或示波器)观察ADC和DMA的工作状态,以确定具体的问题所在。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1909 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1678 浏览 1 评论
1172 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
771 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1732 浏览 2 评论
1973浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
807浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
257浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
625浏览 3评论
634浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-24 16:32 , Processed in 0.809486 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号