diff --git a/src/adc.c b/src/adc.c --- a/src/adc.c +++ b/src/adc.c @@ -15,100 +15,108 @@ /* USER CODE END 0 */ +// Peripheral Handles ADC_HandleTypeDef hadc1; DMA_HandleTypeDef hdma_adc1; + +// Private Variables +static uint16_t adc_readings[3]; + + +uint16_t get_viout_counts(void) +{ + return adc_readings[ADC_CHAN_VIOUT]; +} + +uint16_t get_vbat_counts(void) +{ + return adc_readings[ADC_CHAN_VBAT]; +} + /* ADC1 init function */ -void MX_ADC1_Init(void) +void adc_init(void) { + /* Peripheral clock enable */ + __HAL_RCC_ADC1_CLK_ENABLE(); + __HAL_RCC_DMA1_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + + GPIO_InitTypeDef GPIO_InitStruct; + + /**ADC1 GPIO Configuration + PA0 ------> ADC1_IN1 + PA1 ------> ADC1_IN2 + PA2 ------> ADC1_IN3 + */ + 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); + + - /**Common config - */ - hadc1.Instance = ADC1; - hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; - hadc1.Init.Resolution = ADC_RESOLUTION_12B; - hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; - hadc1.Init.ContinuousConvMode = ENABLE; - hadc1.Init.DiscontinuousConvMode = DISABLE; - hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; - hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; - hadc1.Init.NbrOfConversion = 1; - hadc1.Init.DMAContinuousRequests = ENABLE; - hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; - hadc1.Init.LowPowerAutoWait = DISABLE; - hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; - HAL_ADC_Init(&hadc1); + /**Common config + */ + hadc1.Instance = ADC1; + hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; + hadc1.Init.Resolution = ADC_RESOLUTION_12B; + hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE; + hadc1.Init.ContinuousConvMode = ENABLE; + hadc1.Init.DiscontinuousConvMode = DISABLE; + hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; + hadc1.Init.NbrOfConversion = 1; + hadc1.Init.DMAContinuousRequests = ENABLE; + hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; + hadc1.Init.LowPowerAutoWait = DISABLE; + hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; + HAL_ADC_Init(&hadc1); + + + /* Peripheral DMA init*/ + + hdma_adc1.Instance = DMA1_Channel1; + 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_CIRCULAR; + hdma_adc1.Init.Priority = DMA_PRIORITY_LOW; + HAL_DMA_Init(&hdma_adc1); + + __HAL_LINKDMA(&hadc1,DMA_Handle,hdma_adc1); + + + ADC_ChannelConfTypeDef sConfig; + + // Configure VIOUT channel + sConfig.Channel = ADC_CHANNEL_1; + sConfig.Rank = ADC_REGULAR_RANK_1; + sConfig.SamplingTime = ADC_SAMPLETIME_601CYCLES_5; + HAL_ADC_ConfigChannel(&hadc1, &sConfig); + + // Configure VIOUT-GAINS channel + sConfig.Channel = ADC_CHANNEL_2; + sConfig.Rank = ADC_REGULAR_RANK_2; + sConfig.SamplingTime = ADC_SAMPLETIME_601CYCLES_5; + HAL_ADC_ConfigChannel(&hadc1, &sConfig); + + // Configure VBAT channel + sConfig.Channel = ADC_CHANNEL_3; + sConfig.Rank = ADC_REGULAR_RANK_3; + sConfig.SamplingTime = ADC_SAMPLETIME_601CYCLES_5; + HAL_ADC_ConfigChannel(&hadc1, &sConfig); + + + HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_readings, 3); + + +// HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); +// HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); } -void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) -{ - - GPIO_InitTypeDef GPIO_InitStruct; - if(hadc->Instance==ADC1) - { - /* USER CODE BEGIN ADC1_MspInit 0 */ - - /* USER CODE END ADC1_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_ADC1_CLK_ENABLE(); - - /**ADC1 GPIO Configuration - PA0 ------> ADC1_IN1 - PA1 ------> ADC1_IN2 - PA2 ------> ADC1_IN3 - */ - 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); - - /* Peripheral DMA init*/ - - hdma_adc1.Instance = DMA1_Channel1; - 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_CIRCULAR; - hdma_adc1.Init.Priority = DMA_PRIORITY_LOW; - HAL_DMA_Init(&hdma_adc1); - - __HAL_LINKDMA(hadc,DMA_Handle,hdma_adc1); - /* USER CODE BEGIN ADC1_MspInit 1 */ - /* USER CODE END ADC1_MspInit 1 */ - } -} - -void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc) -{ - - if(hadc->Instance==ADC1) - { - /* USER CODE BEGIN ADC1_MspDeInit 0 */ - - /* USER CODE END ADC1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_ADC1_CLK_DISABLE(); - - /**ADC1 GPIO Configuration - PA0 ------> ADC1_IN1 - PA1 ------> ADC1_IN2 - PA2 ------> ADC1_IN3 - */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2); - - /* Peripheral DMA DeInit*/ - HAL_DMA_DeInit(hadc->DMA_Handle); - } - /* USER CODE BEGIN ADC1_MspDeInit 1 */ - - /* USER CODE END ADC1_MspDeInit 1 */ -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */