#ifndef ADC_H #define ADC_H #include #include typedef struct { ADC_TypeDef* periph; } adc_t; typedef enum { ADC_EXT_REG_TIM1_CH1 = 0, ADC_EXT_REG_TIM1_CH2 = 1, ADC_EXT_REG_TIM1_CH3 = 2, ADC_EXT_REG_TIM2_CH2 = 3, ADC_EXT_REG_TIM2_CH3 = 4, ADC_EXT_REG_TIM2_CH4 = 5, ADC_EXT_REG_TIM2_TRGO = 6, ADC_EXT_REG_TIM3_CH1 = 7, ADC_EXT_REG_TIM3_TRGO = 8, ADC_EXT_REG_TIM4_CH4 = 9, ADC_EXT_REG_TIM4_CH1 = 10, ADC_EXT_REG_TIM5_CH2 = 11, ADC_EXT_REG_TIM5_CH3 = 12, ADC_EXT_REG_EXTI_LINE_11 = 15, } adc_external_trigger_source_regular_t; typedef enum { ADC_EXT_DISABLED = 0, ADC_EXT_RISING_EDGE = 1, ADC_EXT_FALLING_EDGE = 2, ADC_EXT_BOTH_EDGES = 2, } adc_external_trigger_regular_t; typedef enum { ADC_RES_6BIT = 3, ADC_RES_8BIT = 2, ADC_RES_10BIT = 1, ADC_RES_12BIT = 0, } adc_resolution_t; typedef enum { ADC_ALIGN_LEFT = 1, ADC_ALIGN_RIGHT = 0, } adc_alignment_t; void adc_init(adc_t* adc, ADC_TypeDef* periph); void adc_configure(adc_t* adc, adc_resolution_t resolution, adc_alignment_t alignment, bool continuous); void adc_enable(adc_t* adc, bool enable); void adc_sequence(adc_t* adc, uint8_t count); void adc_select(adc_t* adc, uint8_t conversion_idx, uint8_t channel); void adc_external_trigger(adc_t* adc, adc_external_trigger_regular_t config, adc_external_trigger_source_regular_t source); /* void adc_start_capture(adc_t* adc); */ bool adc_is_captured(adc_t* adc); uint32_t adc_captured_value(adc_t* adc); uint32_t adc_convert_voltage(uint32_t capture, uint32_t min, uint32_t max); #endif // ADC_H