From d6e2a05ca2c8d2a585d1dd50c4031ff4b5ac402f Mon Sep 17 00:00:00 2001 From: Felix Ruess Date: Fri, 5 Sep 2014 23:28:35 +0200 Subject: [PATCH 1/2] [stm32] fix adc very hack-ish fix for when using multiple ADs, e.g. AD1 and AD2 Before this "fix" e.g. AD1_1 and AD2_1 had the same value (0). Can probably be done more nicely... --- sw/airborne/arch/stm32/mcu_periph/adc_arch.c | 34 +++++++++++++------- sw/airborne/arch/stm32/mcu_periph/adc_arch.h | 12 +++---- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/sw/airborne/arch/stm32/mcu_periph/adc_arch.c b/sw/airborne/arch/stm32/mcu_periph/adc_arch.c index f9501944fdc..e753280a3a6 100644 --- a/sw/airborne/arch/stm32/mcu_periph/adc_arch.c +++ b/sw/airborne/arch/stm32/mcu_periph/adc_arch.c @@ -282,19 +282,23 @@ void adc_init( void ) { * That's why "adc_channel_map" has this descending order. */ - nb_adc1_channels = NB_ADC1_CHANNELS; + nb_adc1_channels = 0; #if USE_AD1 #ifdef AD1_1_CHANNEL adc_channel_map[AD1_1] = AD1_1_CHANNEL; + nb_adc1_channels++; #endif #ifdef AD1_2_CHANNEL adc_channel_map[AD1_2] = AD1_2_CHANNEL; + nb_adc1_channels++; #endif #ifdef AD1_3_CHANNEL adc_channel_map[AD1_3] = AD1_3_CHANNEL; + nb_adc1_channels++; #endif #ifdef AD1_4_CHANNEL adc_channel_map[AD1_4] = AD1_4_CHANNEL; + nb_adc1_channels++; #endif // initialize buffer pointers with 0 (not set). Buffer null pointers will be ignored in interrupt // handler, which is important as there are no buffers registered at the time the ADC trigger @@ -304,19 +308,23 @@ void adc_init( void ) { #endif // USE_AD1 - nb_adc2_channels = NB_ADC2_CHANNELS; + nb_adc2_channels = 0; #if USE_AD2 #ifdef AD2_1_CHANNEL - adc_channel_map[AD2_1] = AD2_1_CHANNEL; + adc_channel_map[AD2_1 - nb_adc1_channels] = AD2_1_CHANNEL; + nb_adc2_channels++; #endif #ifdef AD2_2_CHANNEL - adc_channel_map[AD2_2] = AD2_2_CHANNEL; + adc_channel_map[AD2_2 - nb_adc1_channels] = AD2_2_CHANNEL; + nb_adc2_channels++; #endif #ifdef AD2_3_CHANNEL - adc_channel_map[AD2_3] = AD2_3_CHANNEL; + adc_channel_map[AD2_3 - nb_adc1_channels] = AD2_3_CHANNEL; + nb_adc2_channels++; #endif #ifdef AD2_4_CHANNEL - adc_channel_map[AD2_4] = AD2_4_CHANNEL; + adc_channel_map[AD2_4 - nb_adc1_channels] = AD2_4_CHANNEL; + nb_adc2_channels++; #endif // initialize buffer pointers with 0 (not set). Buffer null pointers will be ignored in interrupt // handler, which is important as there are no buffers registered at the time the ADC trigger @@ -326,19 +334,23 @@ void adc_init( void ) { #endif // USE_AD2 - nb_adc3_channels = NB_ADC3_CHANNELS; + nb_adc3_channels = 0; #if USE_AD3 #ifdef AD3_1_CHANNEL - adc_channel_map[AD3_1] = AD3_1_CHANNEL; + adc_channel_map[AD3_1 - nb_adc1_channels - nb_adc2_channels] = AD3_1_CHANNEL; + nb_adc3_channels++; #endif #ifdef AD3_2_CHANNEL - adc_channel_map[AD3_2] = AD3_2_CHANNEL; + adc_channel_map[AD3_2 - nb_adc1_channels - nb_adc2_channels] = AD3_2_CHANNEL; + nb_adc3_channels++; #endif #ifdef AD3_3_CHANNEL - adc_channel_map[AD3_3] = AD3_3_CHANNEL; + adc_channel_map[AD3_3 - nb_adc1_channels - nb_adc2_channels] = AD3_3_CHANNEL; + nb_adc3_channels++; #endif #ifdef AD3_4_CHANNEL - adc_channel_map[AD3_4] = AD3_4_CHANNEL; + adc_channel_map[AD3_4 - nb_adc1_channels - nb_adc2_channels] = AD3_4_CHANNEL; + nb_adc3_channels++; #endif // initialize buffer pointers with 0 (not set). Buffer null pointers will be ignored in interrupt // handler, which is important as there are no buffers registered at the time the ADC trigger diff --git a/sw/airborne/arch/stm32/mcu_periph/adc_arch.h b/sw/airborne/arch/stm32/mcu_periph/adc_arch.h index 1bb04ce9aa4..51cd75d926f 100644 --- a/sw/airborne/arch/stm32/mcu_periph/adc_arch.h +++ b/sw/airborne/arch/stm32/mcu_periph/adc_arch.h @@ -47,12 +47,12 @@ enum adc1_channels { #ifdef AD1_4_CHANNEL AD1_4, #endif - NB_ADC1_CHANNELS + ADC1_END }; enum adc2_channels { #ifdef AD2_1_CHANNEL - AD2_1, + AD2_1 = ADC1_END, #endif #ifdef AD2_2_CHANNEL AD2_2, @@ -63,12 +63,12 @@ enum adc2_channels { #ifdef AD2_4_CHANNEL AD2_4, #endif - NB_ADC2_CHANNELS + ADC2_END }; enum adc3_channels { #ifdef AD3_1_CHANNEL - AD3_1, + AD3_1 = ADC2_END, #endif #ifdef AD3_2_CHANNEL AD3_2, @@ -79,10 +79,10 @@ enum adc3_channels { #ifdef AD3_4_CHANNEL AD3_4, #endif - NB_ADC3_CHANNELS + ADC3_END }; -#define NB_ADC (NB_ADC1_CHANNELS+NB_ADC2_CHANNELS+NB_ADC3_CHANNELS) +#define NB_ADC ADC3_END #if USE_ADC_WATCHDOG From 172c67c4e4eeb80f08730ac367b2bcf0235c4677 Mon Sep 17 00:00:00 2001 From: Felix Ruess Date: Fri, 5 Sep 2014 23:51:57 +0200 Subject: [PATCH 2/2] [mcu_periph] NB_ADC only needed for lpc21 --- sw/airborne/arch/lpc21/mcu_periph/adc_arch.h | 3 +++ sw/airborne/arch/stm32/mcu_periph/adc_arch.h | 4 ---- sw/airborne/mcu_periph/adc.h | 7 ------- sw/airborne/test/mcu_periph/test_adc.c | 1 + 4 files changed, 4 insertions(+), 11 deletions(-) diff --git a/sw/airborne/arch/lpc21/mcu_periph/adc_arch.h b/sw/airborne/arch/lpc21/mcu_periph/adc_arch.h index 3da68c2f33b..9313608176f 100644 --- a/sw/airborne/arch/lpc21/mcu_periph/adc_arch.h +++ b/sw/airborne/arch/lpc21/mcu_periph/adc_arch.h @@ -32,6 +32,9 @@ #include BOARD_CONFIG +/** 8 ADCs for bank 0, others for bank 2 */ +#define NB_ADC 8 + #define AdcBank0(x) (x) #define AdcBank1(x) (x+NB_ADC) diff --git a/sw/airborne/arch/stm32/mcu_periph/adc_arch.h b/sw/airborne/arch/stm32/mcu_periph/adc_arch.h index 51cd75d926f..5d8ddd07c24 100644 --- a/sw/airborne/arch/stm32/mcu_periph/adc_arch.h +++ b/sw/airborne/arch/stm32/mcu_periph/adc_arch.h @@ -32,8 +32,6 @@ #include BOARD_CONFIG -// NB_ADCx_CHANNELS - enum adc1_channels { #ifdef AD1_1_CHANNEL AD1_1, @@ -82,8 +80,6 @@ enum adc3_channels { ADC3_END }; -#define NB_ADC ADC3_END - #if USE_ADC_WATCHDOG /* Watchdog callback type definition diff --git a/sw/airborne/mcu_periph/adc.h b/sw/airborne/mcu_periph/adc.h index f57b4500cbd..465ab7f5d94 100644 --- a/sw/airborne/mcu_periph/adc.h +++ b/sw/airborne/mcu_periph/adc.h @@ -37,13 +37,6 @@ #include #include "mcu_periph/adc_arch.h" -/* Allow driver implementation to define - * number of available ADCs implicitly - */ -#ifndef NB_ADC -#define NB_ADC 8 -#endif - #define MAX_AV_NB_SAMPLE 0x20 #define DEFAULT_AV_NB_SAMPLE 0x20 diff --git a/sw/airborne/test/mcu_periph/test_adc.c b/sw/airborne/test/mcu_periph/test_adc.c index 54d27262416..473058bc7dc 100644 --- a/sw/airborne/test/mcu_periph/test_adc.c +++ b/sw/airborne/test/mcu_periph/test_adc.c @@ -33,6 +33,7 @@ static inline void main_init( void ); static inline void main_periodic_task( void ); static inline void main_event_task( void ); +#define NB_ADC 8 #define ADC_NB_SAMPLES 16 static struct adc_buf buf_adc[NB_ADC];