我在 Nucleo-h745ziq 板上工作。我启用了 ADC ch3 和 12 位分辨率,启用了 DMA 和循环模式。我将 3v
电源连接到 ADC 通道。但是当我重置板时我没有得到更新值我得到更新值,当我禁用缓存时我得到更新值。下面是我完成的设置。你能帮我解决这个问题吗?
uint8_t 标志;
__attribute__((sec
tion(".buffer"),used)) uint32_t ADCbUFF[1];
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
标志=1;
}
MX_GPIO_Init();
MX_USART3_UART_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_SPI1_Init();
/* 用户代码开始 2 */
HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET_LINEARITY, ADC_SINGLE_ENDED);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADCbUFF, 1);
/* 用户代码结束 2 */
/* 无限循环 */
/* 用户代码开始时 */
而 (1)
{
/* 用户代码结束 */
/* 用户代码开始 3 */
如果(标志==1)
{
printf("ADC值=%ldnr",ADCbUFF[0]);
标志=0;
HAL_延迟(2000);
}
}
静态无效 MX_ADC1_Init(无效)
{
/* 用户代码开始 ADC1_Init 0 */
/* 用户代码结束 ADC1_Init 0 */
ADC_MultiModeTypeDef 多模 = {0};
/* 用户代码开始 ADC1_Init 1 */
/* 用户代码结束 ADC1_Init 1 */
/** 通用配置
*/
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;
hadc1.Init.Resolution = ADC_RESOLUTION_16B;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = 禁用;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DiscontinuousConvMode = 禁用;
hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
hadc1.Init.OversamplingMode = ENABLE;
如果(HAL_ADC_Init(&hadc1)!= HAL_OK)
{
错误处理程序();
}
/** 配置ADC多模式
*/
multimode.Mode = ADC_MODE_INDEPENDENT;
如果 (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
{
错误处理程序();
}
/* 用户代码开始 ADC1_Init 2 */
/* 用户代码结束 ADC1_Init 2 */
}
void SystemClock_Config(无效)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** 提供配置更新使能
*/
HAL_PWREx_ConfigSupply(PWR_DIRECT_SMPS_SUPPLY);
/** 配置主内部稳压器输出电压
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
同时(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)){}
/** 配置PLL时钟源的宏
*/
__HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);
/** 根据指定的参数初始化 RCC 振荡器
* 在 RCC_OscInitTypeDef 结构中。
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 1;
RCC_OscInitStruct.PLL.PLLN = 120;
RCC_OscInitStruct.PLL.PLLP = 2;
RCC_OscInitStruct.PLL.PLLQ = 32;
RCC_OscInitStruct.PLL.PLLR = 2;
RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
RCC_OscInitStruct.PLL.PLLFRACN = 0;
如果 (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
错误处理程序();
}
/** 初始化 CPU、AHB 和 APB 总线时钟
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
|RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
如果 (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
{
错误处理程序();
}
}
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
如果(hadc->实例==ADC1)
{
/* 用户代码开始 ADC1_MspInit 0 */
/* 用户代码结束 ADC1_MspInit 0 */
/** 初始化外设时钟
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC;
PeriphClkInitStruct.PLL2.PLL2M = 2;
PeriphClkInitStruct.PLL2.PLL2N = 129;
PeriphClkInitStruct.PLL2.PLL2P = 18;
PeriphClkInitStruct.PLL2.PLL2Q = 2;
PeriphClkInitStruct.PLL2.PLL2R = 2;
PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_2;
PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;
如果(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct)!= HAL_OK)
{
错误处理程序();
}
/* 外设时钟使能 */
__HAL_RCC_ADC12_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**ADC1 GPIO 配置
PA6 ------> ADC1_INP3
*/
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* ADC1 DMA 初始化 */
/* ADC1 初始化 */
hdma_adc1.Instance = DMA1_Stream0;
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_WORD;
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_adc1.Init.Mode = DMA_CIRCULAR;
hdma_adc1.Init.Priority = DMA_PRIORITY_LOW;
hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
如果(HAL_DMA_Init(&hdma_adc1)!= HAL_OK)
{
错误处理程序();
}
__HAL_LINKDMA(hadc,DMA_Handle,hdma_adc1);
/* ADC1 中断初始化 */
HAL_NVIC_SetPriority(ADC_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(ADC_IRQn);
/* 用户代码开始 ADC1_MspInit 1 */
/* 用户代码结束 ADC1_MspInit 1 */
}
}