示例#1
0
/**
 * ADC1+2 interrupt hander
 */
void adc1_2_irq_handler(void)
{
    uint8_t channel = 0;
    uint16_t value  = 0;
    struct adc_buf * buf;

#ifdef USE_AD1
    // Clear Injected End Of Conversion
    ADC_ClearITPendingBit(ADC1, ADC_IT_JEOC);
    for(channel = 0; channel < NB_ADC1_CHANNELS; channel++) {
        buf = adc1_buffers[channel];
        if(buf) {
            value = ADC_GetInjectedConversionValue(ADC1, adc_injected_channels[channel]);
            adc_push_sample(buf, value);
        }
    }
    adc_new_data_trigger = 1;
#endif
#ifdef USE_AD2
    // Clear Injected End Of Conversion
    ADC_ClearITPendingBit(ADC2, ADC_IT_JEOC);
    for(channel = 0; channel < NB_ADC2_CHANNELS; channel++) {
        buf = adc2_buffers[channel];
        if(buf) {
            value = ADC_GetInjectedConversionValue(ADC2, adc_injected_channels[channel]);
            adc_push_sample(buf, value);
        }
    }
    adc_new_data_trigger = 1;
#endif
}
示例#2
0
/**
 * ADC1+2 interrupt hander
 */
void adc1_2_isr(void)
{
  uint8_t channel = 0;
  uint16_t value  = 0;
  struct adc_buf * buf;

#ifdef USE_AD1
  // Clear Injected End Of Conversion
  ADC_SR(ADC1) &= ~ADC_SR_JEOC;
  for(channel = 0; channel < NB_ADC1_CHANNELS; channel++) {
    buf = adc1_buffers[channel];
    if(buf) {
      value = *adc_injected_channels[channel];
      adc_push_sample(buf, value);
    }
  }
  adc_new_data_trigger = 1;
#endif
#ifdef USE_AD2
  // Clear Injected End Of Conversion
  ADC_SR(ADC2) &= ~ADC_SR_JEOC;
  for(channel = 0; channel < NB_ADC2_CHANNELS; channel++) {
    buf = adc2_buffers[channel];
    if(buf) {
      value = *adc_injected_channels[channel];
      adc_push_sample(buf, value);
    }
  }
  adc_new_data_trigger = 1;
#endif
}
示例#3
0
  void adc_isr(void)
#endif
{
  uint8_t channel = 0;
  uint16_t value  = 0;
  struct adc_buf * buf;

#if USE_ADC_WATCHDOG
  /*
    We need adc sampling fast enough to detect battery plug out, but we did not
    need to get actual actual value so fast. So timer fire adc conversion fast,
    at least 500 hz, but we inject adc value in sampling buffer only at 50hz
   */
  const uint32_t timeStampDiff = get_sys_time_msec() - adc_watchdog.timeStamp;
  const bool_t shouldAccumulateValue = timeStampDiff > 20;
  if (shouldAccumulateValue)
    adc_watchdog.timeStamp = get_sys_time_msec();

  if (adc_watchdog.cb != NULL) {
    if (adc_awd(adc_watchdog.adc)) {
      ADC_SR(adc_watchdog.adc) &= ~ADC_SR_AWD; // clear int flag
      adc_watchdog.cb();
    }
  }
#endif

#if USE_AD1
  // Clear Injected End Of Conversion
  if (adc_eoc_injected(ADC1)){
    ADC_SR(ADC1) &= ~ADC_SR_JEOC;
#if USE_ADC_WATCHDOG
    if (shouldAccumulateValue) {
#endif
    for (channel = 0; channel < nb_adc1_channels; channel++) {
      buf = adc1_buffers[channel];
      if (buf) {
        value = adc_read_injected(ADC1, channel+1);
        adc_push_sample(buf, value);
      }
    }
#if USE_ADC_WATCHDOG
  }
#endif

#if !USE_AD2 && !USE_AD3
    adc_new_data_trigger = TRUE;
#endif
  }
#endif
#if USE_AD2
  if (adc_eoc_injected(ADC2)){
    ADC_SR(ADC2) &= ~ADC_SR_JEOC;
#if USE_ADC_WATCHDOG
    if (shouldAccumulateValue) {
#endif
    for (channel = 0; channel < nb_adc2_channels; channel++) {
      buf = adc2_buffers[channel];
      if (buf) {
        value = adc_read_injected(ADC2, channel+1);
        adc_push_sample(buf, value);
      }
    }
#if USE_ADC_WATCHDOG
  }
#endif
#if !USE_AD3
    adc_new_data_trigger = TRUE;
#endif
  }
#endif
#if USE_AD3
  if (adc_eoc_injected(ADC3)){
    ADC_SR(ADC3) &= ~ADC_SR_JEOC;
#if USE_ADC_WATCHDOG
    if (shouldAccumulateValue) {
#endif
    for (channel = 0; channel < nb_adc3_channels; channel++) {
      buf = adc3_buffers[channel];
      if (buf) {
        value = adc_read_injected(ADC3, channel+1);
        adc_push_sample(buf, value);
      }
    }
#if USE_ADC_WATCHDOG
  }
#endif
    adc_new_data_trigger = TRUE;
  }
#endif


  return;
}
示例#4
0
  void adc_isr(void)
#endif
{
  uint8_t channel = 0;
  uint16_t value  = 0;
  struct adc_buf * buf;

#if USE_ADC_WATCHDOG
  if (adc_watchdog.cb != NULL) {
    if (adc_awd(adc_watchdog.adc)) {
      ADC_SR(adc_watchdog.adc) &= ~ADC_SR_AWD; // clear int flag
      adc_watchdog.cb();
    }
  }
#endif

#if USE_AD1
  // Clear Injected End Of Conversion
  if (ADC_SR(ADC1) & ADC_SR_JEOC){
    ADC_SR(ADC1) &= ~ADC_SR_JEOC;
    for (channel = 0; channel < nb_adc1_channels; channel++) {
      buf = adc1_buffers[channel];
      if (buf) {
        value = *(&ADC_JDR1(ADC1)+channel);
        adc_push_sample(buf, value);
      }
    }
#if !USE_AD2 && !USE_AD3
    adc_new_data_trigger = TRUE;
#endif
  }
#endif
#if USE_AD2
  if (ADC_SR(ADC2) & ADC_SR_JEOC){
    ADC_SR(ADC2) &= ~ADC_SR_JEOC;
    for (channel = 0; channel < nb_adc2_channels; channel++) {
      buf = adc2_buffers[channel];
      if (buf) {
        value = *(&ADC_JDR1(ADC2)+channel);
        adc_push_sample(buf, value);
      }
    }
#if !USE_AD3
    adc_new_data_trigger = TRUE;
#endif
  }
#endif
#if USE_AD3
  if (ADC_SR(ADC3) & ADC_SR_JEOC){
    ADC_SR(ADC3) &= ~ADC_SR_JEOC;
    for (channel = 0; channel < nb_adc3_channels; channel++) {
      buf = adc3_buffers[channel];
      if (buf) {
        value = *(&ADC_JDR1(ADC3)+channel);
        adc_push_sample(buf, value);
      }
    }
    adc_new_data_trigger = TRUE;
  }
#endif

  return;
}