完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我定义了个uint32_t ADC_Value_arr[4]={0,0,0,0};接收四个通道的ADC,单通道+DMA读取数据没有问题,多通道读取是只有ADC_Value_arr[0]有数据,并且数据特别大,达到8位,还不断变化,显然错了,不知道是何原因,实在发现不了错在哪里?贴上代码,希望有人能指出错误,非常感谢!!!
void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc) { GPIO_InitTypeDef GPIO_InitStruct; static DMA_HandleTypeDef hdma_adc; /*##-1- Enable peripherals and GPIO Clocks #################################*/ /* Enable GPIO clock */ ADCx_CHANNEL_GPIO_CLK_ENABLE(); /* ADC1 Periph clock enable */ ADCx_CLK_ENABLE(); /* Enable DMA2 clock */ DMAx_CLK_ENABLE(); /*##-2- Configure peripheral GPIO ##########################################*/ /* ADC1 Channel2,3,6,7 GPIO pin configuration */ GPIO_InitStruct.Pin = ADCx_CHANNEL_PIN2|ADCx_CHANNEL_PIN3|ADCx_CHANNEL_PIN6|ADCx_CHANNEL_PIN7; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(ADCx_CHANNEL_GPIO_PORT, &GPIO_InitStruct); /*##-3- Configure the DMA streams ##########################################*/ /* Set the parameters to be configured */ hdma_adc.Instance = ADCx_DMA_STREAM; //选择stream0 hdma_adc.Init.Channel = ADCx_DMA_CHANNEL;//通道0 hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY;//ÍâÉèµÀÄÚ´æ hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE;//ÍâÉè²»Ôö hdma_adc.Init.MemInc = DMA_MINC_ENABLE;//内存增 hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; // hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_adc.Init.Mode = DMA_CIRCULAR; //循环模式 hdma_adc.Init.Priority = DMA_PRIORITY_HIGH; hdma_adc.Init.FIFOMode = DMA_FIFOMODE_DISABLE; hdma_adc.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL; hdma_adc.Init.MemBurst = DMA_MBURST_SINGLE; hdma_adc.Init.PeriphBurst = DMA_PBURST_SINGLE; HAL_DMA_Init(&hdma_adc); /* Associate the initialized DMA handle to the the ADC handle */ __HAL_LINKDMA(hadc, DMA_Handle, hdma_adc); /*##-4- Configure the NVIC for DMA #########################################*/ /* NVIC configuration for DMA transfer complete interrupt */ HAL_NVIC_SetPriority(ADCx_DMA_IRQn, 5, 0); HAL_NVIC_EnableIRQ(ADCx_DMA_IRQn); } void set_ADC(void) { ADC_ChannelConfTypeDef sConfig; /* Configure the ADC peripheral */ AdcHandle.Instance = ADCx;//ADC1 AdcHandle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4;//21MHZ AdcHandle.Init.Resolution = ADC_RESOLUTION12b; //12位 //AdcHandle.Init.ScanConvMode = DISABLE; AdcHandle.Init.ScanConvMode = ENABLE;//扫描模式 AdcHandle.Init.ContinuousConvMode = ENABLE;//连续模式 AdcHandle.Init.DiscontinuousConvMode = DISABLE;// AdcHandle.Init.NbrOfDiscConversion = 0; AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1; AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT; AdcHandle.Init.NbrOfConversion = 4; AdcHandle.Init.DMAContinuousRequests = ENABLE; AdcHandle.Init.EOCSelection = DISABLE; HAL_ADC_Init(&AdcHandle); /* Configure ADC regular channel */ sConfig.Channel = ADCx_CHANNEL2; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES; sConfig.Offset = 0; HAL_ADC_ConfigChannel(&AdcHandle, &sConfig); sConfig.Channel = ADCx_CHANNEL3; sConfig.Rank = 2; sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES; sConfig.Offset = 0; HAL_ADC_ConfigChannel(&AdcHandle, &sConfig); sConfig.Channel = ADCx_CHANNEL6; sConfig.Rank = 3; sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES; sConfig.Offset = 0; HAL_ADC_ConfigChannel(&AdcHandle, &sConfig); sConfig.Channel = ADCx_CHANNEL7; sConfig.Rank = 4; sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES; sConfig.Offset = 0; HAL_ADC_ConfigChannel(&AdcHandle, &sConfig); /* Start the conversion process and enable interrupt */ // HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)&ADCConvertedValue, 1); HAL_ADC_Start_DMA(&AdcHandle, ADC_Value_arr, 4); } |
|
相关推荐
13个回答
|
|
没试过多通道采集呢
|
|
|
|
恩,我也是用ADC DMA方式,多通道时有问题,永远都是第一个通道可以采样,好像F4和F1都是这样,F0是可以的
|
|
|
|
还有就是
hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; // hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD 感觉应该定义为WORD的,因为HAL_ADC_Start_DMA(&AdcHandle, ADC_Value_arr, 4);中,ADC_Value_arr是uint32 |
|
|
|
肥肥飞飞 发表于 2018-11-22 19:18 按你说的我改了,就没问题了,准确度太差了……非常感谢 |
|
|
|
|
|
|
|
ADC的代码,就是我上边贴的代码,我的工程涉及太多文件,太大了,就不上传了……
|
|
|
|
AdcHandle.Init.ScanConvMode = ENABLE;//扫描模式 请改为 AdcHandle.Init.ScanConvMode = ADC_SCAN_ENABLE;//扫描模式 F1这个库有BUG |
|
|
|
|
|
学习学习
|
|
|
|
另外楼主的程序还需要吧DMA中断给关掉 因为设置的是DMA连续ADC采集,这样也就是每0.428us 就生产一次DMA完成中断,太过频繁的中断会经常阻塞其他程序的执行。
|
|
|
|
ADC的代码,就是我上边贴的代码,我的工程涉及太多文件,太大了,就不上传了……
|
|
|
|
楼主问题解决了,原因是什么呢?是因为BUG吗?
|
|
|
|
我的也遇到同样的问题,但是用的不是cube
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
621 浏览 1 评论
1962 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1068 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1487 浏览 1 评论
LL库F030进行3个串口收发,2个串口为232,一个为485,长时间后,会出现串口1停止运行,另外两个正常,只有重启复原
1924 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 08:23 , Processed in 0.870520 second(s), Total 97, Slave 81 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号