diff --git a/inc/adc.h b/inc/adc.h --- a/inc/adc.h +++ b/inc/adc.h @@ -12,6 +12,15 @@ #include "stm32f3xx_hal.h" /* USER CODE BEGIN Includes */ +enum _adc_reading_id +{ + ADC_CHAN_VIOUT = 0, + ADC_CHAN_GAIN_VIOUT = 1, + ADC_CHAN_VBAT = 2, +}; + +uint16_t get_viout_counts(void); +uint16_t get_vbat_counts(void); /* USER CODE END Includes */ @@ -19,7 +28,8 @@ /* USER CODE END Private defines */ -void MX_ADC1_Init(void); +void adc_init(void); +extern ADC_HandleTypeDef hadc1; /* USER CODE BEGIN Prototypes */ 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 */ diff --git a/src/dma.c b/src/dma.c --- a/src/dma.c +++ b/src/dma.c @@ -25,13 +25,6 @@ */ void MX_DMA_Init(void) { - /* DMA controller clock enable */ - __HAL_RCC_DMA1_CLK_ENABLE(); - - /* DMA interrupt init */ - /* DMA1_Channel1_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); } diff --git a/src/error.c b/src/error.c --- a/src/error.c +++ b/src/error.c @@ -13,11 +13,11 @@ static volatile uint32_t err_reg; static volatile uint8_t num_errors_asserted = 0; // Moderately detailed messages corresponding to each error enum -static const char * error_message[] = -{ - "Info", - "General", -}; +//static const char * error_message[] = +//{ +// "Info", +// "General", +//}; // Set the passed error flag diff --git a/src/interrupts.c b/src/interrupts.c --- a/src/interrupts.c +++ b/src/interrupts.c @@ -52,6 +52,7 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPI if(HAL_GetTick() > last_button_press + 100) { HAL_GPIO_TogglePin(LED_RED); + HAL_GPIO_TogglePin(GATE_DRIVE); last_button_press = HAL_GetTick(); } } break; diff --git a/src/main.c b/src/main.c --- a/src/main.c +++ b/src/main.c @@ -14,6 +14,8 @@ #include "flash.h" #include "ssd1306.h" #include "stdio.h" +#include "adc.h" +#include "dma.h" int main(void) { @@ -23,12 +25,13 @@ int main(void) ssd1306_init(); ssd1306_drawlogo(); ssd1306_clearscreen(); + adc_init(); // ssd1306_drawstring(const char *dataPtr, unsigned char row, unsigned char xPos) ssd1306_drawstring("[ ProtoFuse ]", 0, 0); ssd1306_drawstring("HW v1.0 SW v0.1", 1, 0); - uint16_t battery_adc_count = 0; + uint16_t temp_counter = 0; flash_init(); @@ -41,15 +44,17 @@ int main(void) while (1) { // Grab and transmit data - if(HAL_GetTick() - last_blink_time > 1000) + if(HAL_GetTick() - last_blink_time > 100) { char buffer[256]; // added stdio.h to fix implicit declaration error // changed battery_adc_count from int32_t to int - snprintf(buffer, 256, "My Variable: %u", battery_adc_count); + snprintf(buffer, 256, "Counter: %u", temp_counter); ssd1306_drawstring(buffer, 2, 0); + snprintf(buffer, 256, "i count: %u", get_viout_counts()); + ssd1306_drawstring(buffer, 3, 0); // HAL_GPIO_TogglePin(LED_RED); - battery_adc_count++; + temp_counter++; last_blink_time = HAL_GetTick(); }