OSStatus platform_adc_take_sample( const platform_adc_t* adc, uint16_t* output ) { OSStatus err = kNoErr; platform_mcu_powersave_disable(); require_action_quiet( adc != NULL, exit, err = kParamErr); channel_num = adc->channel; adc_channel_enable(ADC, adc->channel); adc_set_callback(ADC, adc->interrupt, adc_end_conversion, 1); /* Start conversion */ adc_start_software_conversion(ADC); adc_start_calibration(ADC); while (adc_get_interrupt_status(ADC) & (1 << adc->channel)); *output = adc_channel_get_value(ADC, adc->channel); mico_thread_msleep(1); adc_channel_disable(ADC, adc->channel); exit: platform_mcu_powersave_enable(); return err; }
/** * \internal * \brief Call the callback function if the corresponding interrupt is asserted * * \param adc Base address of the ADC. */ static void adc_process_callback(Adc *const adc) { volatile uint32_t status; uint32_t cnt; status = adc_get_interrupt_status(adc); for (cnt = 0; cnt < ADC_NUM_OF_INTERRUPT_SOURCE; cnt++) { if (status & adc_interrupt_mask[cnt]) { adc_interrupt((enum adc_interrupt_source)cnt); } } }
/** * \brief Initialize the ADC Module. * * \param adc Base address of the ADC * \param config Configuration for the ADC * * \retval STATUS_OK Initialization is finished. * \retval STATUS_ERR_BUSY Initialization failed. */ enum status_code adc_init(Adc *const adc, struct adc_config *config) { Assert(adc); Assert(config); if ((adc_get_interrupt_status(adc) & ADC_ISR_DRDY) == ADC_ISR_DRDY) { return STATUS_ERR_BUSY; } /* Reset and configure the ADC module */ adc->ADC_CR = ADC_CR_SWRST; adc_set_config(adc, config); uint32_t i; for (i = 0; i < ADC_NUM_OF_INTERRUPT_SOURCE; i++) { adc_callback_pointer[i] = 0; } return STATUS_OK; }