From eaaf043cdab72623a15c957f44496b7bd0bd9873 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Tue, 12 Oct 2010 17:59:47 +0000 Subject: [PATCH] git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2251 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/platforms/STM32/adc_lld.c | 17 +++++++++++------ os/hal/src/adc.c | 3 +-- testhal/STM32/ADC/main.c | 23 +++++------------------ 3 files changed, 17 insertions(+), 26 deletions(-) diff --git a/os/hal/platforms/STM32/adc_lld.c b/os/hal/platforms/STM32/adc_lld.c index c6db10346..cbb206a2e 100644 --- a/os/hal/platforms/STM32/adc_lld.c +++ b/os/hal/platforms/STM32/adc_lld.c @@ -66,9 +66,9 @@ CH_IRQ_HANDLER(DMA1_Ch1_IRQHandler) { dmaClearChannel(STM32_DMA1, STM32_DMA_CHANNEL_1); if ((isr & DMA_ISR_HTIF1) != 0) { /* Half transfer processing.*/ - if (ADCD1.ad_grpp->acg_callback != NULL) { + if (ADCD1.ad_grpp->acg_endcb != NULL) { /* Invokes the callback passing the 1st half of the buffer.*/ - ADCD1.ad_grpp->acg_callback(&ADCD1, ADCD1.ad_samples, ADCD1.ad_depth / 2); + ADCD1.ad_grpp->acg_endcb(&ADCD1, ADCD1.ad_samples, ADCD1.ad_depth / 2); } } if ((isr & DMA_ISR_TCIF1) != 0) { @@ -80,20 +80,25 @@ CH_IRQ_HANDLER(DMA1_Ch1_IRQHandler) { ADCD1.ad_state = ADC_COMPLETE; #if ADC_USE_WAIT chSysLockFromIsr(); - chSemResetI(&ADCD1.ad_sem, 0); + if (ADCD1.ad_thread != NULL) { + Thread *tp = ADCD1.ad_thread; + ADCD1.ad_thread = NULL; + tp->p_u.rdymsg = RDY_OK; + chSchReadyI(tp); + } chSysUnlockFromIsr(); #endif } /* Callback handling.*/ - if (ADCD1.ad_grpp->acg_callback != NULL) { + if (ADCD1.ad_grpp->acg_endcb != NULL) { if (ADCD1.ad_depth > 1) { /* Invokes the callback passing the 2nd half of the buffer.*/ size_t half = ADCD1.ad_depth / 2; - ADCD1.ad_grpp->acg_callback(&ADCD1, ADCD1.ad_samples + half, half); + ADCD1.ad_grpp->acg_endcb(&ADCD1, ADCD1.ad_samples + half, half); } else { /* Invokes the callback passing the whole buffer.*/ - ADCD1.ad_grpp->acg_callback(&ADCD1, ADCD1.ad_samples, ADCD1.ad_depth); + ADCD1.ad_grpp->acg_endcb(&ADCD1, ADCD1.ad_samples, ADCD1.ad_depth); } } } diff --git a/os/hal/src/adc.c b/os/hal/src/adc.c index 0d33cde4e..c6968f11b 100644 --- a/os/hal/src/adc.c +++ b/os/hal/src/adc.c @@ -268,8 +268,7 @@ msg_t adcConvert(ADCDriver *adcp, msg_t msg; chSysLock(); - chDbgAssert(adcp->ad_config->ac_endcb == NULL, - "adcConvert(), #1", "has callback"); + chDbgAssert(grpp->acg_endcb == NULL, "adcConvert(), #1", "has callback"); adcStartConversionI(adcp, grpp, samples, depth); (adcp)->ad_thread = chThdSelf(); chSchGoSleepS(THD_STATE_SUSPENDED); diff --git a/testhal/STM32/ADC/main.c b/testhal/STM32/ADC/main.c index 11931b05b..00c82b9fd 100644 --- a/testhal/STM32/ADC/main.c +++ b/testhal/STM32/ADC/main.c @@ -29,7 +29,6 @@ static const ADCConfig adccfg = {}; static adcsample_t samples[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; -static Thread *adctp; /* * ADC streaming callback. @@ -66,20 +65,6 @@ static const ADCConversionGroup adcgrpcfg = { ADC_SQR3_SQ1_N(ADC_CHANNEL_IN11) | ADC_SQR3_SQ0_N(ADC_CHANNEL_IN10) }; -/* - * ADC continuous conversion thread. - */ -static WORKING_AREA(adc_continuous_wa, 256); -static msg_t adc_continuous_thread(void *p){ - - (void)p; - adcStart(&ADCD1, &adccfg); - adcStartConversion(&ADCD1, &adcgrpcfg, samples, ADC_GRP1_BUF_DEPTH); - adcWaitConversion(&ADCD1, TIME_INFINITE); - adcStop(&ADCD1); - return 0; -} - /* * Red LEDs blinker thread, times are in milliseconds. */ @@ -118,15 +103,17 @@ int main(int argc, char **argv) { chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); /* - * Creates the ADC continuous conversion test thread. + * Starts an ADC continuous conversion. */ - adctp = chThdCreateStatic(adc_continuous_wa, sizeof(adc_continuous_wa), - NORMALPRIO + 10, adc_continuous_thread, NULL); + adcStart(&ADCD1, &adccfg); + adcStartConversion(&ADCD1, &adcgrpcfg, samples, ADC_GRP1_BUF_DEPTH); /* * Normal main() thread activity, in this demo it does nothing. */ while (TRUE) { + if (palReadPad(IOPORT1, GPIOA_BUTTON)) + adcStopConversion(&ADCD1); chThdSleepMilliseconds(500); } return 0;