changeset 2913:c7609c2784f3

* src/adc_stm32.c: Fixed a bug in setup and usage of the timer.
author nickg
date Wed, 26 Aug 2009 09:43:11 +0000
parents 3fa8710867ea
children 8a0adc7bf4be
files packages/devs/adc/cortexm/stm32/current/ChangeLog packages/devs/adc/cortexm/stm32/current/src/adc_stm32.c
diffstat 2 files changed, 22 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/packages/devs/adc/cortexm/stm32/current/ChangeLog
+++ b/packages/devs/adc/cortexm/stm32/current/ChangeLog
@@ -1,3 +1,8 @@
+2009-03-05  Simon Kallweit  <simon.kallweit@intefo.ch>
+
+	* src/adc_stm32.c:
+	Fixed a bug in setup and usage of the timer.
+
 2009-02-24  Simon Kallweit  <simon.kallweit@intefo.ch>
 
 	* cdl/adc_stm32.cdl:
--- a/packages/devs/adc/cortexm/stm32/current/src/adc_stm32.c
+++ b/packages/devs/adc/cortexm/stm32/current/src/adc_stm32.c
@@ -341,17 +341,9 @@ stm32_adc_set_rate( cyg_adc_channel *cha
     HAL_WRITE_UINT32(info->setup->tim_base + CYGHWR_HAL_STM32_TIM_ARR,
                      period - 1);
     
-    // Set direction = down, clock divider = 1
-    cr = CYGHWR_HAL_STM32_TIM_CR1_DIR | CYGHWR_HAL_STM32_TIM_CR1_CKD_1;
-    HAL_WRITE_UINT32(info->setup->tim_base + CYGHWR_HAL_STM32_TIM_CR1, cr);
-    
     // Reinitialize timer
     cr = CYGHWR_HAL_STM32_TIM_EGR_UG;
     HAL_WRITE_UINT32(info->setup->tim_base + CYGHWR_HAL_STM32_TIM_EGR, cr);
-    
-    // Enable generation of TRGO event
-    cr = CYGHWR_HAL_STM32_TIM_CR2_MMS_UPDATE;
-    HAL_WRITE_UINT32(info->setup->tim_base + CYGHWR_HAL_STM32_TIM_CR2, cr);
 }
 
 //-----------------------------------------------------------------------------
@@ -367,12 +359,16 @@ stm32_dma_isr(cyg_vector_t vector, cyg_a
     cyg_uint32 chan_active = info->chan_mask;
     cyg_uint16 *sample = info->dma_buf;
     cyg_adc_channel **chan = info->chan;
-    cyg_uint32 res = 0;
+    cyg_uint32 isr;
+    cyg_uint32 res = CYG_ISR_HANDLED;
+    
+    HAL_READ_UINT32(info->setup->dma_base + CYGHWR_HAL_STM32_DMA_ISR, isr);
+    if (!(isr & CYGHWR_HAL_STM32_DMA_ISR_MASK(info->setup->dma_channel)))
+        return 0;
     
     while (chan_active) {
         if (chan_active & 0x1)
-            res |= (CYG_ISR_HANDLED |
-                    cyg_adc_receive_sample(*chan, *sample++ & 0xfff));
+            res |= cyg_adc_receive_sample(*chan, *sample++ & 0xfff);
         chan_active >>= 1;
         chan++;
     }
@@ -486,7 +482,17 @@ stm32_adc_init_device(cyg_adc_device *de
     // Enable scanning
     cr = CYGHWR_HAL_STM32_ADC_CR1_SCAN;
     HAL_WRITE_UINT32(info->setup->adc_base + CYGHWR_HAL_STM32_ADC_CR1, cr);
+
+
+    // Set timer direction = down, clock divider = 1
+    cr = CYGHWR_HAL_STM32_TIM_CR1_DIR | CYGHWR_HAL_STM32_TIM_CR1_CKD_1;
+    HAL_WRITE_UINT32(info->setup->tim_base + CYGHWR_HAL_STM32_TIM_CR1, cr);
+
+    // Enable generation of TRGO event
+    cr = CYGHWR_HAL_STM32_TIM_CR2_MMS_UPDATE;
+    HAL_WRITE_UINT32(info->setup->tim_base + CYGHWR_HAL_STM32_TIM_CR2, cr);
     
+
     // Setup DMA channel
     HAL_WRITE_UINT32(info->setup->dma_base + 
                      CYGHWR_HAL_STM32_DMA_CPAR(info->setup->dma_channel),