1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2024-12-01 09:24:10 +01:00

PIOS_ADC now non-application specific.

Removed "application hooks" system from PIOS_ADC.

git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@245 ebee16cc-31ac-478f-84a7-5cbb03baadba
This commit is contained in:
gussy 2010-03-04 09:25:09 +00:00 committed by gussy
parent f683a5de3d
commit 6d67d2dab2
4 changed files with 112 additions and 379 deletions

View File

@ -1,271 +0,0 @@
/**
******************************************************************************
*
* @file pios_board.h
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @brief Defines board hardware for the OpenPilot Version 0.1 hardware.
* @see The GNU Public License (GPL) Version 3
*
*****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef PIOS_BOARD_H
#define PIOS_BOARD_H
//------------------------
// DMA Channels Used
//------------------------
/* Channel 1 - */
/* Channel 2 - SPI1 RX */
/* Channel 3 - SPI1 TX */
/* Channel 4 - SPI2 RX */
/* Channel 5 - SPI2 TX */
/* Channel 6 - */
/* Channel 7 - */
/* Channel 8 - */
/* Channel 9 - */
/* Channel 10 - */
/* Channel 11 - */
/* Channel 12 - */
//------------------------
// PIOS_LED
//------------------------
#define PIOS_LED_LED1_GPIO_PORT GPIOC
#define PIOS_LED_LED1_GPIO_PIN GPIO_Pin_12
#define PIOS_LED_LED1_GPIO_CLK RCC_APB2Periph_GPIOC
#define PIOS_LED_LED2_GPIO_PORT GPIOC
#define PIOS_LED_LED2_GPIO_PIN GPIO_Pin_13
#define PIOS_LED_LED2_GPIO_CLK RCC_APB2Periph_GPIOC
#define PIOS_LED_NUM 2
#define PIOS_LED_PORTS { PIOS_LED_LED1_GPIO_PORT, PIOS_LED_LED2_GPIO_PORT }
#define PIOS_LED_PINS { PIOS_LED_LED1_GPIO_PIN, PIOS_LED_LED2_GPIO_PIN }
#define PIOS_LED_CLKS { PIOS_LED_LED1_GPIO_CLK, PIOS_LED_LED2_GPIO_CLK }
//------------------------
// PIOS_I2C
//------------------------
#define PIOS_I2C_GPIO_PORT GPIOB
#define PIOS_I2C_SDA_PIN GPIO_Pin_11
#define PIOS_I2C_SCL_PIN GPIO_Pin_10
#define PIOS_I2C_DUTY_CYCLE I2C_DutyCycle_2
#define PIOS_I2C_BUS_FREQ 400000
#define PIOS_I2C_TIMEOUT_VALUE 5000
#define PIOS_I2C_IRQ_EV_PRIORITY 2
#define PIOS_I2C_IRQ_ER_PRIORITY 2
//------------------------
// PIOS_BMP085
//------------------------
#define PIOS_BMP085_EOC_GPIO_PORT GPIOC
#define PIOS_BMP085_EOC_GPIO_PIN GPIO_Pin_15
#define PIOS_BMP085_EOC_PORT_SOURCE GPIO_PortSourceGPIOG
#define PIOS_BMP085_EOC_PIN_SOURCE GPIO_PinSource8
#define PIOS_BMP085_EOC_CLK RCC_APB2Periph_GPIOC
#define PIOS_BMP085_EOC_EXTI_LINE EXTI_Line15
#define PIOS_BMP085_EOC_IRQn EXTI15_10_IRQn
//-------------------------
// PIOS_USART1 (TELEM)
//-------------------------
#define PIOS_USART1_ENABLED 1
#define PIOS_USART1_USART USART2
#define PIOS_USART1_GPIO_PORT GPIOA
#define PIOS_USART1_RX_PIN GPIO_Pin_3
#define PIOS_USART1_TX_PIN GPIO_Pin_2
#define PIOS_USART1_REMAP_FUNC { }
#define PIOS_USART1_IRQ_CHANNEL USART2_IRQn
#define PIOS_USART1_IRQHANDLER_FUNC void USART2_IRQHandler(void)
#define PIOS_USART1_CLK_FUNC RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE)
#define PIOS_USART1_NVIC_PRIO PIOS_IRQ_PRIO_HIGHEST
#define PIOS_USART1_BAUDRATE 57600
//-------------------------
// PIOS_USART2 (GPS)
//-------------------------
#define PIOS_USART2_ENABLED 1
#define PIOS_USART2_USART USART3
#define PIOS_USART2_GPIO_PORT GPIOC
#define PIOS_USART2_RX_PIN GPIO_Pin_11
#define PIOS_USART2_TX_PIN GPIO_Pin_10
#define PIOS_USART2_REMAP_FUNC { GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE); }
#define PIOS_USART2_IRQ_CHANNEL USART3_IRQn
#define PIOS_USART2_IRQHANDLER_FUNC void USART3_IRQHandler(void)
#define PIOS_USART2_CLK_FUNC RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE)
#define PIOS_USART2_NVIC_PRIO PIOS_IRQ_PRIO_HIGHEST
#define PIOS_USART2_BAUDRATE 57600
//-------------------------
// PIOS_USART3 (AUX) (RX5/RX6)
//-------------------------
#define PIOS_USART3_ENABLED 0
#define PIOS_USART3_USART USART1
#define PIOS_USART3_GPIO_PORT GPIOA
#define PIOS_USART3_RX_PIN GPIO_Pin_10
#define PIOS_USART3_TX_PIN GPIO_Pin_9
#define PIOS_USART3_REMAP_FUNC { }
#define PIOS_USART3_IRQ_CHANNEL USART1_IRQn
#define PIOS_USART3_IRQHANDLER_FUNC void USART1_IRQHandler(void)
#define PIOS_USART3_CLK_FUNC RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE)
#define PIOS_USART3_NVIC_PRIO PIOS_IRQ_PRIO_HIGH
#define PIOS_USART3_BAUDRATE 57600
//-------------------------
// PIOS_USART
//-------------------------
#define PIOS_USART_NUM 3
#define PIOS_USART_RX_BUFFER_SIZE 1024
#define PIOS_USART_TX_BUFFER_SIZE 256
#define PIOS_COM_DEBUG_PORT GPS
//-------------------------
// SPI
//-------------------------
#define PIOS_SPI_IRQ_DMA_PRIORITY PIOS_IRQ_PRIO_HIGH
#define PIOS_SPI_NUM 2
#define PIOS_SPI0_ENABLED 1
#define PIOS_SPI0_PTR SPI1
#define PIOS_SPI0_DMA_RX_PTR DMA1_Channel2
#define PIOS_SPI0_DMA_TX_PTR DMA1_Channel3
#define PIOS_SPI0_DMA_RX_IRQ_FLAGS (DMA1_FLAG_TC2 | DMA1_FLAG_TE2 | DMA1_FLAG_HT2 | DMA1_FLAG_GL2)
#define PIOS_SPI0_DMA_IRQ_CHANNEL DMA1_Channel2_IRQn
#define PIOS_SPI0_DMA_IRQHANDLER_FUNC void DMA1_Channel2_IRQHandler(void)
#define PIOS_SPI0_RCLK1_PORT GPIOA
#define PIOS_SPI0_RCLK1_PIN GPIO_Pin_4
#define PIOS_SPI0_SCLK_PORT GPIOA
#define PIOS_SPI0_SCLK_PIN GPIO_Pin_5
#define PIOS_SPI0_MISO_PORT GPIOA
#define PIOS_SPI0_MISO_PIN GPIO_Pin_6
#define PIOS_SPI0_MOSI_PORT GPIOA
#define PIOS_SPI0_MOSI_PIN GPIO_Pin_7
#define PIOS_SPI1_ENABLED 1
#define PIOS_SPI1_PTR SPI2
#define PIOS_SPI1_DMA_RX_PTR DMA1_Channel4
#define PIOS_SPI1_DMA_TX_PTR DMA1_Channel5
#define PIOS_SPI1_DMA_RX_IRQ_FLAGS (DMA1_FLAG_TC4 | DMA1_FLAG_TE4 | DMA1_FLAG_HT4 | DMA1_FLAG_GL4)
#define PIOS_SPI1_DMA_IRQ_CHANNEL DMA1_Channel4_IRQn
#define PIOS_SPI1_DMA_IRQHANDLER_FUNC void DMA1_Channel4_IRQHandler(void)
#define PIOS_SPI1_RCLK1_PORT GPIOB
#define PIOS_SPI1_RCLK1_PIN GPIO_Pin_12
#define PIOS_SPI1_SCLK_PORT GPIOB
#define PIOS_SPI1_SCLK_PIN GPIO_Pin_13
#define PIOS_SPI1_MISO_PORT GPIOB
#define PIOS_SPI1_MISO_PIN GPIO_Pin_14
#define PIOS_SPI1_MOSI_PORT GPIOB
#define PIOS_SPI1_MOSI_PIN GPIO_Pin_15
//-------------------------
// PIOS_SDCARD
//-------------------------
#define PIOS_SDCARD_SPI 0
//-------------------------
// Delay Timer
//-------------------------
#define PIOS_DELAY_TIMER TIM2
#define PIOS_DELAY_TIMER_RCC RCC_APB1Periph_TIM2
//-------------------------
// Master Clock
//-------------------------
#define PIOS_MASTER_CLOCK 72000000
#define PIOS_PERIPHERAL_CLOCK (PIOS_MASTER_CLOCK / 2)
//-------------------------
// Interrupt Priorities
//-------------------------
#define PIOS_IRQ_PRIO_LOW 12 // lower than RTOS
#define PIOS_IRQ_PRIO_MID 8 // higher than RTOS
#define PIOS_IRQ_PRIO_HIGH 5 // for SPI, ADC, I2C etc...
#define PIOS_IRQ_PRIO_HIGHEST 4 // for USART etc...
//-------------------------
// Receiver PWM inputs
//-------------------------
#define RECEIVER1_GPIO_PORT GPIOB
#define RECEIVER1_PIN GPIO_Pin_0 // PB0
#define RECEIVER1_TIM_PORT TIM3
#define RECEIVER1_CH TIM_Channel_3 // TIM3_CH3
#define RECEIVER2_GPIO_PORT GPIOB
#define RECEIVER2_PIN GPIO_Pin_1 // PB1
#define RECEIVER2_TIM_PORT TIM3
#define RECEIVER2_CH TIM_Channel_4 // TIM3_CH4
#define RECEIVER3_GPIO_PORT GPIOA
#define RECEIVER3_PIN GPIO_Pin_8 // PA8
#define RECEIVER3_TIM_PORT TIM1
#define RECEIVER3_CH TIM_Channel_1 // TIM1_CH1
#define RECEIVER4_GPIO_PORT GPIOA
#define RECEIVER4_PIN GPIO_Pin_0 // PA0
#define RECEIVER4_TIM_PORT TIM5
#define RECEIVER4_CH TIM_Channel_1 // TIM5_CH1
#define RECEIVER5_GPIO_PORT GPIOA
#define RECEIVER5_PIN GPIO_Pin_10 // PA10
#define RECEIVER5_TIM_PORT TIM1
#define RECEIVER5_CH TIM_Channel_3 // TIM1_CH3
#define RECEIVER6_GPIO_PORT GPIOA
#define RECEIVER6_PIN GPIO_Pin_9 // PA9
#define RECEIVER6_TIM_PORT TIM1
#define RECEIVER6_CH TIM_Channel_2 // TIM1_CH2
#define RECEIVER7_GPIO_PORT GPIOB
#define RECEIVER7_PIN GPIO_Pin_4 // PB4
#define RECEIVER7_TIM_PORT TIM3
#define RECEIVER7_CH TIM_Channel_1 // TIM3_CH1
#define RECEIVER8_GPIO_PORT GPIOB
#define RECEIVER8_PIN GPIO_Pin_5 // PB5
#define RECEIVER8_TIM_PORT TIM3
#define RECEIVER8_CH TIM_Channel_2 // TIM3_CH2
#define NUM_RECEIVER_INPUTS 6
//-------------------------
// Servo outputs
//-------------------------
#define PIOS_SERVO_GPIO_PORT_1TO4 GPIOB
#define PIOS_SERVO_GPIO_PIN_1 GPIO_Pin_6
#define PIOS_SERVO_GPIO_PIN_2 GPIO_Pin_7
#define PIOS_SERVO_GPIO_PIN_3 GPIO_Pin_8
#define PIOS_SERVO_GPIO_PIN_4 GPIO_Pin_9
#define PIOS_SERVO_GPIO_PORT_5TO8 GPIOC
#define PIOS_SERVO_GPIO_PIN_5 GPIO_Pin_6
#define PIOS_SERVO_GPIO_PIN_6 GPIO_Pin_7
#define PIOS_SERVO_GPIO_PIN_7 GPIO_Pin_8
#define PIOS_SERVO_GPIO_PIN_8 GPIO_Pin_9
#define PIOS_SERVO_NUM_OUTPUTS 8
//-------------------------
// ADC
//-------------------------
#define ADC_GPIO_PORT GPIOC
#define ADC_Z_PIN GPIO_Pin_0 // ADC123_IN10
#define ADC_A_PIN GPIO_Pin_1 // ADC123_IN11
#define ADC_B_PIN GPIO_Pin_2 // ADC123_IN12
#define ADC_Z_CHANNEL ADC_Channel_10
#define ADC_A_CHANNEL ADC_Channel_11
#define ADC_B_CHANNEL ADC_Channel_12
#define NUM_ADC_PINS 4 // 3 but actually 4 because of temp sensor
#define ADC_IRQ_PRIO PIOS_IRQ_PRIO_HIGH
//-------------------------
// USB
//-------------------------
#define PIOS_USB_ENABLED 1
#define PIOS_USB_DETECT_GPIO_PORT GPIOC
#define PIOS_USB_DETECT_GPIO_PIN GPIO_Pin_4
#define PIOS_IRQ_USB_PRIORITY PIOS_IRQ_PRIO_MID
#endif /* PIOS_BOARD_H */

View File

@ -31,7 +31,7 @@
//------------------------ //------------------------
// DMA Channels Used // DMA Channels Used
//------------------------ //------------------------
/* Channel 1 - */ /* Channel 1 - ADC */
/* Channel 2 - SPI1 RX */ /* Channel 2 - SPI1 RX */
/* Channel 3 - SPI1 TX */ /* Channel 3 - SPI1 TX */
/* Channel 4 - SPI2 RX */ /* Channel 4 - SPI2 RX */
@ -253,16 +253,77 @@
//------------------------- //-------------------------
// ADC // ADC
// PIOS_ADC_PinGet(0) = Temperature Sensor (On-board)
// PIOS_ADC_PinGet(1) = Power Sensor (Current)
// PIOS_ADC_PinGet(2) = Power Sensor (Voltage)
// PIOS_ADC_PinGet(3) = On-board 5v Rail Sensor
//------------------------- //-------------------------
#define ADC_GPIO_PORT GPIOC //#define PIOS_ADC_OVERSAMPLING_RATE 1 // (1 to 16)
#define ADC_Z_PIN GPIO_Pin_0 // ADC123_IN10 #define PIOS_ADC_USE_TEMP_SENSOR 1
#define ADC_A_PIN GPIO_Pin_1 // ADC123_IN11 #define PIOS_ADC_TEMP_SENSOR_ADC ADC1
#define ADC_B_PIN GPIO_Pin_2 // ADC123_IN12 #define PIOS_ADC_TEMP_SENSOR_ADC_CHANNEL 1
#define ADC_Z_CHANNEL ADC_Channel_10
#define ADC_A_CHANNEL ADC_Channel_11 #define PIOS_ADC_PIN1_GPIO_PORT GPIOA // PA1 (Power Sense - Voltage)
#define ADC_B_CHANNEL ADC_Channel_12 #define PIOS_ADC_PIN1_GPIO_PIN GPIO_Pin_1 // ADC123_IN1
#define NUM_ADC_PINS 4 // 3 but actually 4 because of temp sensor #define PIOS_ADC_PIN1_GPIO_CHANNEL ADC_Channel_1
#define ADC_IRQ_PRIO PIOS_IRQ_PRIO_HIGH #define PIOS_ADC_PIN1_ADC ADC1
#define PIOS_ADC_PIN1_ADC_NUMBER 2
#define PIOS_ADC_PIN2_GPIO_PORT GPIOC // PC3 (Power Sense - Current)
#define PIOS_ADC_PIN2_GPIO_PIN GPIO_Pin_3 // ADC123_IN13
#define PIOS_ADC_PIN2_GPIO_CHANNEL ADC_Channel_13
#define PIOS_ADC_PIN2_ADC ADC2
#define PIOS_ADC_PIN2_ADC_NUMBER 1
#define PIOS_ADC_PIN3_GPIO_PORT GPIOC // PC5 (Onboard 5v Sensor) PC5
#define PIOS_ADC_PIN3_GPIO_PIN GPIO_Pin_5 // ADC12_IN15
#define PIOS_ADC_PIN3_GPIO_CHANNEL ADC_Channel_15
#define PIOS_ADC_PIN3_ADC ADC2
#define PIOS_ADC_PIN3_ADC_NUMBER 2
#if 1
#define PIOS_ADC_NUM_PINS 3
#define PIOS_ADC_PORTS { PIOS_ADC_PIN1_GPIO_PORT, PIOS_ADC_PIN2_GPIO_PORT, PIOS_ADC_PIN3_GPIO_PORT }
#define PIOS_ADC_PINS { PIOS_ADC_PIN1_GPIO_PIN, PIOS_ADC_PIN2_GPIO_PIN, PIOS_ADC_PIN3_GPIO_PIN }
#define PIOS_ADC_CHANNELS { PIOS_ADC_PIN1_GPIO_CHANNEL, PIOS_ADC_PIN2_GPIO_CHANNEL, PIOS_ADC_PIN3_GPIO_CHANNEL }
#define PIOS_ADC_MAPPING { PIOS_ADC_PIN1_ADC, PIOS_ADC_PIN2_ADC, PIOS_ADC_PIN3_ADC }
#define PIOS_ADC_CHANNEL_MAPPING { PIOS_ADC_PIN1_ADC_NUMBER, PIOS_ADC_PIN2_ADC_NUMBER, PIOS_ADC_PIN3_ADC_NUMBER }
#else
#define PIOS_ADC_PIN4_GPIO_PORT GPIOC // PC0 (AUX 1)
#define PIOS_ADC_PIN4_GPIO_PIN GPIO_Pin_0 // ADC123_IN10
#define PIOS_ADC_PIN4_GPIO_CHANNEL ADC_Channel_10
#define PIOS_ADC_PIN4_ADC ADC1
#define PIOS_ADC_PIN4_ADC_NUMBER 3
#define PIOS_ADC_PIN5_GPIO_PORT GPIOC // PC1 (AUX 2)
#define PIOS_ADC_PIN5_GPIO_PIN GPIO_Pin_1 // ADC123_IN11
#define PIOS_ADC_PIN5_GPIO_CHANNEL ADC_Channel_11
#define PIOS_ADC_PIN5_ADC ADC1
#define PIOS_ADC_PIN5_ADC_NUMBER 4
#define PIOS_ADC_PIN6_GPIO_PORT GPIOC // PC2 (AUX 3)
#define PIOS_ADC_PIN6_GPIO_PIN GPIO_Pin_2 // ADC123_IN12
#define PIOS_ADC_PIN6_GPIO_CHANNEL ADC_Channel_12
#define PIOS_ADC_PIN6_ADC ADC2
#define PIOS_ADC_PIN6_ADC_NUMBER 3
#define PIOS_ADC_NUM_PINS 6
#define PIOS_ADC_PORTS { PIOS_ADC_PIN1_GPIO_PORT, PIOS_ADC_PIN2_GPIO_PORT, PIOS_ADC_PIN3_GPIO_PORT, PIOS_ADC_PIN4_GPIO_PORT, PIOS_ADC_PIN5_GPIO_PORT, PIOS_ADC_PIN6_GPIO_PORT }
#define PIOS_ADC_PINS { PIOS_ADC_PIN1_GPIO_PIN, PIOS_ADC_PIN2_GPIO_PIN, PIOS_ADC_PIN3_GPIO_PIN, PIOS_ADC_PIN4_GPIO_PIN, PIOS_ADC_PIN5_GPIO_PIN, PIOS_ADC_PIN6_GPIO_PIN }
#define PIOS_ADC_CHANNELS { PIOS_ADC_PIN1_GPIO_CHANNEL, PIOS_ADC_PIN2_GPIO_CHANNEL, PIOS_ADC_PIN3_GPIO_CHANNEL, PIOS_ADC_PIN4_GPIO_CHANNEL, PIOS_ADC_PIN5_GPIO_CHANNEL, PIOS_ADC_PIN6_GPIO_CHANNEL }
#define PIOS_ADC_MAPPING { PIOS_ADC_PIN1_ADC, PIOS_ADC_PIN2_ADC, PIOS_ADC_PIN3_ADC, PIOS_ADC_PIN4_ADC, PIOS_ADC_PIN5_ADC, PIOS_ADC_PIN6_ADC }
#define PIOS_ADC_CHANNEL_MAPPING { PIOS_ADC_PIN1_ADC_NUMBER, PIOS_ADC_PIN2_ADC_NUMBER, PIOS_ADC_PIN3_ADC_NUMBER, PIOS_ADC_PIN4_ADC_NUMBER, PIOS_ADC_PIN5_ADC_NUMBER, PIOS_ADC_PIN6_ADC_NUMBER }
#endif
#define PIOS_ADC_NUM_CHANNELS (PIOS_ADC_NUM_PINS + PIOS_ADC_USE_TEMP_SENSOR)
#define PIOS_ADC_NUM_ADC_CHANNELS 2
#define PIOS_ADC_USE_ADC2 1
#define PIOS_ADC_CLOCK_FUNCTION RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2, ENABLE)
#define PIOS_ADC_SAMPLE_TIME ADC_SampleTime_239Cycles5 /* Sample time: */
/* With an ADCCLK = 14 MHz and a sampling time of 293.5 cycles: */
/* Tconv = 239.5 + 12.5 = 252 cycles = 18µs */
#define PIOS_ADC_IRQ_PRIO PIOS_IRQ_PRIO_HIGH
//------------------------- //-------------------------
// USB // USB

View File

@ -33,12 +33,18 @@
#if !defined(PIOS_DONT_USE_ADC) #if !defined(PIOS_DONT_USE_ADC)
/* Local Variables */ /* Local Variables */
/* following two arrays are word aligned, so that DMA can transfer two hwords at once */ static GPIO_TypeDef* ADC_GPIO_PORT[PIOS_ADC_NUM_PINS] = PIOS_ADC_PORTS;
static uint16_t adc_conversion_values[NUM_ADC_PINS] __attribute__((aligned(4))); static const uint32_t ADC_GPIO_PIN[PIOS_ADC_NUM_PINS] = PIOS_ADC_PINS;
static uint16_t adc_conversion_values_sum[NUM_ADC_PINS] __attribute__((aligned(4))); static const uint32_t ADC_CHANNEL[PIOS_ADC_NUM_PINS] = PIOS_ADC_CHANNELS;
static uint16_t adc_pin_values[NUM_ADC_PINS]; static ADC_TypeDef* ADC_MAPPING[PIOS_ADC_NUM_PINS] = PIOS_ADC_MAPPING;
static uint32_t adc_pin_changed[NUM_ADC_PINS]; static const uint32_t ADC_CHANNEL_MAPPING[PIOS_ADC_NUM_PINS] = PIOS_ADC_CHANNEL_MAPPING;
/* The following two arrays are word aligned, so that DMA can transfer two hwords at once */
static uint16_t adc_conversion_values[PIOS_ADC_NUM_CHANNELS] __attribute__((aligned(4)));
static uint16_t adc_conversion_values_sum[PIOS_ADC_NUM_CHANNELS] __attribute__((aligned(4)));
static uint16_t adc_pin_values[PIOS_ADC_NUM_CHANNELS];
/** /**
@ -49,16 +55,13 @@ void PIOS_ADC_Init(void)
int32_t i; int32_t i;
/* Clear arrays and variables */ /* Clear arrays and variables */
for(i=0; i < NUM_ADC_PINS; ++i) { for(i = 0; i < PIOS_ADC_NUM_CHANNELS; ++i) {
adc_conversion_values[i] = 0; adc_conversion_values[i] = 0;
adc_conversion_values_sum[i] = 0; adc_conversion_values_sum[i] = 0;
} }
for(i=0; i < NUM_ADC_PINS; ++i) { for(i = 0; i < PIOS_ADC_NUM_CHANNELS; ++i) {
adc_pin_values[i] = 0; adc_pin_values[i] = 0;
} }
for(i=0; i < NUM_ADC_PINS; ++i) {
adc_pin_changed[i] = 1;
}
/* Setup analog pins */ /* Setup analog pins */
GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;
@ -66,23 +69,24 @@ void PIOS_ADC_Init(void)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin = ADC_Z_PIN | ADC_A_PIN | ADC_B_PIN; /* Enable each ADC pin in the array */
GPIO_Init(GPIOC, &GPIO_InitStructure); for(i = 0; i < PIOS_ADC_NUM_PINS; i++) {
GPIO_InitStructure.GPIO_Pin = ADC_GPIO_PIN[i];
GPIO_Init(ADC_GPIO_PORT[i], &GPIO_InitStructure);
}
/* Enable ADC1/2 clock */ /* Enable ADC clocks */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2, ENABLE); PIOS_ADC_CLOCK_FUNCTION;
/* Map channels to conversion slots depending on the channel selection mask */ /* Map channels to conversion slots depending on the channel selection mask */
/* Distribute this over the three ADCs, so that channels can be converted in parallel */ for(i = 0; i < PIOS_ADC_NUM_PINS; i++) {
/* Sample time: */ ADC_RegularChannelConfig(ADC_MAPPING[i], ADC_CHANNEL[i], ADC_CHANNEL_MAPPING[i], PIOS_ADC_SAMPLE_TIME);
/* With an ADCCLK = 14 MHz and a sampling time of 293.5 cycles: */ }
/* Tconv = 239.5 + 12.5 = 252 cycles = 18µs */
/* To be pedantic, we take A and B simultaneously, and Z and Temp simultaneously */
ADC_RegularChannelConfig(ADC1, ADC_A_CHANNEL, 1, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 2, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC2, ADC_B_CHANNEL, 1, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC2, ADC_Z_CHANNEL, 2, ADC_SampleTime_239Cycles5);
#if (PIOS_ADC_USE_TEMP_SENSOR)
ADC_TempSensorVrefintCmd(ENABLE);
ADC_RegularChannelConfig(PIOS_ADC_TEMP_SENSOR_ADC, ADC_Channel_14, PIOS_ADC_TEMP_SENSOR_ADC_CHANNEL, PIOS_ADC_SAMPLE_TIME);
#endif
/* Configure ADCs */ /* Configure ADCs */
ADC_InitTypeDef ADC_InitStructure; ADC_InitTypeDef ADC_InitStructure;
@ -92,12 +96,15 @@ void PIOS_ADC_Init(void)
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 2; ADC_InitStructure.ADC_NbrOfChannel = PIOS_ADC_NUM_ADC_CHANNELS;
ADC_Init(ADC1, &ADC_InitStructure); ADC_Init(ADC1, &ADC_InitStructure);
#if (PIOS_ADC_USE_ADC2)
ADC_Init(ADC2, &ADC_InitStructure); ADC_Init(ADC2, &ADC_InitStructure);
/* Enable ADC2 external trigger conversion (to synch with ADC1) */ /* Enable ADC2 external trigger conversion (to synch with ADC1) */
ADC_ExternalTrigConvCmd(ADC2, ENABLE); ADC_ExternalTrigConvCmd(ADC2, ENABLE);
#endif
/* Enable ADC1->DMA request */ /* Enable ADC1->DMA request */
ADC_DMACmd(ADC1, ENABLE); ADC_DMACmd(ADC1, ENABLE);
@ -109,12 +116,14 @@ void PIOS_ADC_Init(void)
ADC_StartCalibration(ADC1); ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1)); while(ADC_GetCalibrationStatus(ADC1));
#if (PIOS_ADC_USE_ADC2)
/* ADC2 calibration */ /* ADC2 calibration */
ADC_Cmd(ADC2, ENABLE); ADC_Cmd(ADC2, ENABLE);
ADC_ResetCalibration(ADC2); ADC_ResetCalibration(ADC2);
while(ADC_GetResetCalibrationStatus(ADC2)); while(ADC_GetResetCalibrationStatus(ADC2));
ADC_StartCalibration(ADC2); ADC_StartCalibration(ADC2);
while(ADC_GetCalibrationStatus(ADC2)); while(ADC_GetCalibrationStatus(ADC2));
#endif
/* Enable DMA1 clock */ /* Enable DMA1 clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
@ -126,7 +135,7 @@ void PIOS_ADC_Init(void)
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&adc_conversion_values; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&adc_conversion_values;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 2; /* Number of conversions depends on number of used channels */ DMA_InitStructure.DMA_BufferSize = PIOS_ADC_NUM_ADC_CHANNELS; /* Number of conversions depends on number of used channels */
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
@ -143,7 +152,7 @@ void PIOS_ADC_Init(void)
/* Configure and enable DMA interrupt */ /* Configure and enable DMA interrupt */
NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn; NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ADC_IRQ_PRIO; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PIOS_ADC_IRQ_PRIO;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); NVIC_Init(&NVIC_InitStructure);
@ -162,7 +171,7 @@ void PIOS_ADC_Init(void)
int32_t PIOS_ADC_PinGet(uint32_t pin) int32_t PIOS_ADC_PinGet(uint32_t pin)
{ {
/* Check if pin exists */ /* Check if pin exists */
if(pin >= NUM_ADC_PINS) { if(pin >= PIOS_ADC_NUM_CHANNELS) {
return -1; return -1;
} }
@ -170,47 +179,6 @@ int32_t PIOS_ADC_PinGet(uint32_t pin)
return adc_pin_values[pin]; return adc_pin_values[pin];
} }
/**
* Checks for pin changes, and calls given callback function with following parameters on pin changes:
* \code
* void ADCNotifyChanged(uint32_t pin, uint16_t value)
* \endcode
* \param[in] _callback pointer to callback function
* \return < 0 on errors
*/
int32_t PIOS_ADC_Handler(void *_callback)
{
/* No callback function? */
if(_callback == NULL) {
return -1;
}
int pin;
void (*callback)(int32_t pin, uint32_t value) = _callback;
/* Check for changed ADC conversion values */
for(pin = 0; pin < NUM_ADC_PINS; pin++) {
PIOS_IRQ_Disable();
uint32_t pin_value = adc_pin_values[pin];
PIOS_IRQ_Enable();
/* Call application hook */
/* Note that due to dual conversion approach, we have to convert the pin number */
/* If an uneven number of channels selected */
if(adc_pin_changed[pin] == 1) {
callback(pin, pin_value);
}
}
/* Start next scan */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
/* No error */
return 0;
}
/** /**
* DMA channel interrupt is triggered when all ADC channels have been converted * DMA channel interrupt is triggered when all ADC channels have been converted
* \note shouldn't be called directly from application * \note shouldn't be called directly from application
@ -218,41 +186,17 @@ int32_t PIOS_ADC_Handler(void *_callback)
void DMA1_Channel1_IRQHandler(void) void DMA1_Channel1_IRQHandler(void)
{ {
int32_t i; int32_t i;
uint16_t *src_ptr, *dst_ptr, *changed_ptr; uint16_t *src_ptr;
/* Clear the pending flag(s) */ /* Clear the pending flag(s) */
DMA_ClearFlag(DMA1_FLAG_TC1 | DMA1_FLAG_TE1 | DMA1_FLAG_HT1 | DMA1_FLAG_GL1); DMA_ClearFlag(DMA1_FLAG_TC1 | DMA1_FLAG_TE1 | DMA1_FLAG_HT1 | DMA1_FLAG_GL1);
/* Copy conversion values to adc_pin_values */
// src_ptr = (uint16_t *)adc_conversion_values;
// dst_ptr = (uint16_t *)&adc_pin_values[NUM_ADC_PINS];
// changed_ptr = (uint16_t *)&adc_pin_changed[NUM_ADC_PINS];
//
// for(i = 0; i < NUM_ADC_PINS; ++i) {
// /* Takeover new value */
// if(*dst_ptr != *src_ptr) {
// *dst_ptr = *src_ptr;
// *changed_ptr = 1;
// } else {
// *changed_ptr = 0;
// }
//
// /* Switch to next results */
// ++dst_ptr;
// ++src_ptr;
// ++changed_ptr;
// }
src_ptr = (uint16_t *)adc_conversion_values; src_ptr = (uint16_t *)adc_conversion_values;
for(i = 0; i < NUM_ADC_PINS; ++i) { /* Copy conversion values to adc_pin_values */
for(i = 0; i < PIOS_ADC_NUM_CHANNELS; ++i) {
/* Takeover new value */ /* Takeover new value */
if(adc_pin_values[i] != *src_ptr) { adc_pin_values[i] = *src_ptr;
adc_pin_values[i] = *src_ptr;
adc_pin_changed[i] = 1;
} else {
adc_pin_changed[i] = 0;
}
++src_ptr; ++src_ptr;
} }

View File

@ -30,6 +30,5 @@
/* Public Functions */ /* Public Functions */
extern void PIOS_ADC_Init(void); extern void PIOS_ADC_Init(void);
extern int32_t PIOS_ADC_PinGet(uint32_t pin); extern int32_t PIOS_ADC_PinGet(uint32_t pin);
extern int32_t PIOS_ADC_Handler(void *_callback);
#endif /* PIOS_ADC_H */ #endif /* PIOS_ADC_H */