Пример #1
0
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;  
}
Пример #2
0
/**
 * \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);
		}
	}
}
Пример #3
0
/**
 * \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;
}