完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
利用CubeMX 6.3.0 生成AD读取程序无法取出寄存器值,一直为零 应为IO不够用用的串口下载程序
ADC_HandleTypeDef hadc; DMA_HandleTypeDef hdma_adc; /* ADC init function */ void MX_ADC_Init(void) { ADC_ChannelConfTypeDef sConfig = {0}; /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) */ hadc.Instance = ADC1; hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_BACKWARD; hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV; hadc.Init.LowPowerAutoWait = ENABLE; hadc.Init.LowPowerAutoPowerOff = DISABLE; hadc.Init.ContinuousConvMode = ENABLE; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc.Init.DMAContinuousRequests = ENABLE; hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED; if (HAL_ADC_Init( hadc) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel to be converted. */ sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = ADC_RANK_CHANNEL_NUMBER; sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5; if (HAL_ADC_ConfigChannel( hadc, sConfig) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel to be converted. */ sConfig.Channel = ADC_CHANNEL_1; if (HAL_ADC_ConfigChannel( hadc, sConfig) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel to be converted. */ sConfig.Channel = ADC_CHANNEL_2; if (HAL_ADC_ConfigChannel( hadc, sConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN ADC_Init 2 */ // ADC1->CFGR1 = (uint32_t)~ADC_CFGR1_DMACFG; // ADC1->CFGR1 |= (uint32_t)ADC_CFGR1_DMACFG; /* USER CODE END ADC_Init 2 */ } void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(adcHandle->Instance==ADC1) { /* USER CODE BEGIN ADC1_MspInit 0 */ /* USER CODE END ADC1_MspInit 0 */ /* ADC1 clock enable */ __HAL_RCC_ADC1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /**ADC GPIO Configuration PA0 ------> ADC_IN0 PA1 ------> ADC_IN1 PA2 ------> ADC_IN2 */ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); /* ADC1 DMA Init */ /* ADC Init */ hdma_adc.Instance = DMA1_Channel1; 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_WORD; hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; hdma_adc.Init.Mode = DMA_CIRCULAR; hdma_adc.Init.Priority = DMA_PRIORITY_LOW; if (HAL_DMA_Init( hdma_adc) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc); } } void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle) { if(adcHandle->Instance==ADC1) { /* USER CODE BEGIN ADC1_MspDeInit 0 */ /* USER CODE END ADC1_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_ADC1_CLK_DISABLE(); /**ADC GPIO Configuration PA0 ------> ADC_IN0 PA1 ------> ADC_IN1 PA2 ------> ADC_IN2 */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2); /* ADC1 DMA DeInit */ HAL_DMA_DeInit(adcHandle->DMA_Handle); /* USER CODE BEGIN ADC1_MspDeInit 1 */ /* USER CODE END ADC1_MspDeInit 1 */ } } 还有初始化 HAL_ADCEx_Calibration_Start( hadc); HAL_Delay(100); HAL_ADC_Start_DMA( hadc, ADC_Value, 150); 处理函数 void read_V(void) { for(i=0,ad1=0,ad2=0,ad3=0; i<150;) { ad1 += ADC_Value[i++]; ad2 += ADC_Value[i++]; ad3 += ADC_Value[i++]; } ad1 /= 50; ad2 /= 50; ad3 /= 50; ChongDDY= ad1+ad2+ad3; } |
|
相关推荐
1个回答
|
|
|
1。检查ADC硬件连接:确保模拟输入引脚正确连接到您正在使用的ADC通道。仔细检查CubeMX中的引脚配置,确保其与您的硬件设置相匹配。
2.验证ADC初始化设置:确保ADC配置设置(如时钟预分频器、分辨率和数据对齐)在生成的代码中正确设置。您可以参考微控制器的数据表和ADC参考手册来验证这些设置。 3.启用ADC DMA并配置其设置:如果使用DMA(直接内存访问)进行ADC数据传输,请确保DMA控制器已正确初始化和配置。验证DMA中断设置、内存地址和数据传输大小。 4.启用ADC中断(如果适用):如果您正在使用ADC中断来处理数据转换完成,请确保正确设置了ADC中断配置。检查ADC中断矢量是否在微控制器的NVIC(嵌套矢量中断控制器)配置中启用。 5.检查ADC转换触发:确保ADC转换触发源设置正确。它可以是软件触发器,也可以是外部触发器。验证触发源是否在CubeMX中正确配置。 6.验证ADC转换序列和通道配置:检查要采样的ADC通道是否在ADC通道配置结构(sConfig)中正确配置。验证转换的数量及其在序列中的顺序。 7.考虑使用ADC阻塞模式:为了简化故障排除,您可以临时切换到ADC阻塞模式(即使用HAL_ADC_Start、HAL_ADC_PollForConversion和HAL_ADC_GetValue功能),而不是使用DMA或中断。这将帮助您缩小问题范围,并验证它是否与DMA或中断配置有关。 8.调试代码:使用断点并逐步执行代码,以确认ADC初始化、转换和数据处理步骤是否正确执行。在运行时监视寄存器值和变量,以识别任何问题。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
4130 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
3221 浏览 1 评论
2747 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
2175 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
14939 浏览 2 评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
3084浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
1894浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
2064浏览 3评论
1977浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
2166浏览 3评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 06:19 , Processed in 0.817562 second(s), Total 75, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
972