diff --git a/flight/INS/Makefile b/flight/INS/Makefile index 527bc7eb0..5980a936c 100644 --- a/flight/INS/Makefile +++ b/flight/INS/Makefile @@ -55,10 +55,10 @@ PIOS = ../PiOS PIOSINC = $(PIOS)/inc FLIGHTLIB = ../Libraries FLIGHTLIBINC = ../Libraries/inc -PIOSSTM32FXX = $(PIOS)/STM32F2xx +PIOSSTM32F2XX = $(PIOS)/STM32F2xx PIOSCOMMON = $(PIOS)/Common PIOSBOARDS = $(PIOS)/Boards -APPLIBDIR = $(PIOSSTM32FXX)/Libraries +APPLIBDIR = $(PIOSSTM32F2XX)/Libraries STMLIBDIR = $(APPLIBDIR) STMSPDDIR = $(STMLIBDIR)/STM32F2xx_StdPeriph_Driver STMSPDSRCDIR = $(STMSPDDIR)/src @@ -89,25 +89,26 @@ SRC += $(BOOT)/ahrs_slave_test.c SRC += $(BOOT)/ahrs_spi_program.c ## PIOS Hardware (STM32F2xx) -SRC += $(PIOSSTM32FXX)/pios_sys.c -SRC += $(PIOSSTM32FXX)/pios_led.c -SRC += $(PIOSSTM32FXX)/pios_delay.c -SRC += $(PIOSSTM32FXX)/pios_usart.c -SRC += $(PIOSSTM32FXX)/pios_irq.c -SRC += $(PIOSSTM32FXX)/pios_i2c.c -SRC += $(PIOSSTM32FXX)/pios_debug.c -SRC += $(PIOSSTM32FXX)/pios_gpio.c -SRC += $(PIOSSTM32FXX)/pios_spi.c -#SRC += $(PIOSSTM32FXX)/pios_exti.c -SRC += $(PIOSSTM32FXX)/pios_iap.c -SRC += $(PIOSSTM32FXX)/pios_bma180.c -SRC += $(PIOSSTM32FXX)/pios_hmc5883.c -SRC += $(PIOSSTM32FXX)/pios_bmp085.c +SRC += $(PIOSSTM32F2XX)/pios_sys.c +SRC += $(PIOSSTM32F2XX)/pios_led.c +SRC += $(PIOSSTM32F2XX)/pios_delay.c +SRC += $(PIOSSTM32F2XX)/pios_usart.c +SRC += $(PIOSSTM32F2XX)/pios_irq.c +SRC += $(PIOSSTM32F2XX)/pios_i2c.c +SRC += $(PIOSSTM32F2XX)/pios_debug.c +#SRC += $(PIOSSTM32F2XX)/pios_gpio.c +SRC += $(PIOSSTM32F2XX)/pios_spi.c +#SRC += $(PIOSSTM32F2XX)/pios_exti.c +SRC += $(PIOSSTM32F2XX)/pios_iap.c +SRC += $(PIOSSTM32F2XX)/pios_bma180.c +SRC += $(PIOSSTM32F2XX)/pios_hmc5883.c +SRC += $(PIOSSTM32F2XX)/pios_bmp085.c +SRC += $(PIOSSTM32F2XX)/pios_imu3000.c ## PIOS Hardware (Common) SRC += $(PIOSCOMMON)/pios_com.c SRC += $(PIOSCOMMON)/printf-stdarg.c -SRC += $(PIOSCOMMON)/pios_imu3000.c + SRC += $(PIOSCOMMON)/pios_bl_helper.c ## CMSIS for STM32 @@ -151,7 +152,7 @@ CPPSRCARM = # Even though the DOS/Win* filesystem matches both .s and .S the same, # it will preserve the spelling of the filenames, and gcc itself does # care about how the name is spelled on its command-line. -ASRC = $(PIOSSTM32FXX)/startup_stm32f2xx.S +ASRC = $(PIOSSTM32F2XX)/startup_stm32f2xx.S # List Assembler source files here which must be assembled in ARM-Mode.. ASRCARM = @@ -161,7 +162,7 @@ ASRCARM = EXTRAINCDIRS += $(PIOS) EXTRAINCDIRS += $(PIOSINC) EXTRAINCDIRS += $(FLIGHTLIBINC) -EXTRAINCDIRS += $(PIOSSTM32FXX) +EXTRAINCDIRS += $(PIOSSTM32F2XX) EXTRAINCDIRS += $(PIOSCOMMON) EXTRAINCDIRS += $(PIOSBOARDS) EXTRAINCDIRS += $(STMSPDINCDIR) diff --git a/flight/INS/pios_board.c b/flight/INS/pios_board.c index ca7f4be62..45d3e1609 100644 --- a/flight/INS/pios_board.c +++ b/flight/INS/pios_board.c @@ -616,6 +616,38 @@ static const struct pios_bma180_cfg pios_bma180_cfg = { }, }; +#include "pios_imu3000.h" +static const struct pios_imu3000_cfg pios_imu3000_cfg = { + .drdy = { + .gpio = GPIOB, + .init = { + .GPIO_Pin = GPIO_Pin_1, + .GPIO_Speed = GPIO_Speed_100MHz, + .GPIO_Mode = GPIO_Mode_IN, + .GPIO_OType = GPIO_OType_OD, + .GPIO_PuPd = GPIO_PuPd_NOPULL, + }, + }, + .eoc_exti = { + // .pin_source = GPIO_PinSource1, + // .port_source = GPIO_PortSourceGPIOB, + .init = { + .EXTI_Line = EXTI_Line1, // matches above GPIO pin + .EXTI_Mode = EXTI_Mode_Interrupt, + .EXTI_Trigger = EXTI_Trigger_Rising, + .EXTI_LineCmd = ENABLE, + }, + }, + .eoc_irq = { + .init = { + .NVIC_IRQChannel = EXTI1_IRQn, + .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGH, + .NVIC_IRQChannelSubPriority = 0, + .NVIC_IRQChannelCmd = ENABLE, + }, + }, +}; + #include "pios_bmp085.h" static const struct pios_bmp085_cfg pios_bmp085_cfg = { .drdy = { @@ -707,7 +739,7 @@ void PIOS_Board_Init(void) { if (PIOS_I2C_Init(&pios_i2c_gyro_adapter_id, &pios_i2c_gyro_adapter_cfg)) { PIOS_DEBUG_Assert(0); } - PIOS_IMU3000_Init(); + PIOS_IMU3000_Init(&pios_imu3000_cfg); /* Set up the SPI interface to the accelerometer*/ if (PIOS_SPI_Init(&pios_spi_accel_id, &pios_spi_accel_cfg)) { diff --git a/flight/PiOS/Boards/STM32F2xx_INS.h b/flight/PiOS/Boards/STM32F2xx_INS.h index 03b1c8037..a12388cca 100644 --- a/flight/PiOS/Boards/STM32F2xx_INS.h +++ b/flight/PiOS/Boards/STM32F2xx_INS.h @@ -143,32 +143,6 @@ extern uint32_t pios_com_aux_id; //------------------------- -//------------------------- -// GPIO -// Not used, but pios_gpio.c expects something -//------------------------- -#define PIOS_GPIO_1_PORT GPIOA -#define PIOS_GPIO_1_PIN GPIO_Pin_1 -#define PIOS_GPIO_1_GPIO_CLK RCC_APB2Periph_GPIOA - -#define PIOS_GPIO_PORTS { PIOS_GPIO_1_PORT } -#define PIOS_GPIO_PINS { PIOS_GPIO_1_PIN } -#define PIOS_GPIO_CLKS { PIOS_GPIO_1_GPIO_CLK } -#define PIOS_GPIO_NUM 1 - -//------------------------ -// PIOS_IMU3000 -//------------------------ -#define PIOS_IMU3000_INT_GPIO_PORT GPIOB -#define PIOS_IMU3000_INT_GPIO_PIN GPIO_Pin_1 -#define PIOS_IMU3000_INT_PORT_SOURCE GPIO_PortSourceGPIOB -#define PIOS_IMU3000_INT_PIN_SOURCE GPIO_PinSource1 -#define PIOS_IMU3000_INT_CLK RCC_APB2Periph_GPIOB -#define PIOS_IMU3000_INT_EXTI_LINE EXTI_Line1 -#define PIOS_IMU3000_INT_IRQn EXTI1_IRQn -#define PIOS_IMU3000_INT_PRIO PIOS_IRQ_PRIO_HIGH - - #endif /* STM3210E_INS_H_ */ diff --git a/flight/PiOS/Common/pios_imu3000.c b/flight/PiOS/STM32F2xx/pios_imu3000.c similarity index 88% rename from flight/PiOS/Common/pios_imu3000.c rename to flight/PiOS/STM32F2xx/pios_imu3000.c index e9774fc98..087227a24 100644 --- a/flight/PiOS/Common/pios_imu3000.c +++ b/flight/PiOS/STM32F2xx/pios_imu3000.c @@ -57,34 +57,17 @@ static int32_t PIOS_IMU3000_Write(uint8_t address, uint8_t buffer); * @brief Initialize the IMU3000 3-axis gyro sensor. * @return none */ -void PIOS_IMU3000_Init(void) +void PIOS_IMU3000_Init(const struct pios_imu3000_cfg * cfg) { - GPIO_InitTypeDef GPIO_InitStructure; - EXTI_InitTypeDef EXTI_InitStructure; - NVIC_InitTypeDef NVIC_InitStructure; - - /* Enable INT GPIO clock */ - RCC_APB2PeriphClockCmd(PIOS_IMU3000_INT_CLK | RCC_APB2Periph_AFIO, ENABLE); - - /* Configure IMU3000 interrupt pin as input floating */ - GPIO_InitStructure.GPIO_Pin = PIOS_IMU3000_INT_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; - GPIO_Init(PIOS_IMU3000_INT_GPIO_PORT, &GPIO_InitStructure); - + /* Configure EOC pin as input floating */ + GPIO_Init(cfg->drdy.gpio, &cfg->drdy.init); + /* Configure the End Of Conversion (EOC) interrupt */ - GPIO_EXTILineConfig(PIOS_IMU3000_INT_PORT_SOURCE, PIOS_IMU3000_INT_PIN_SOURCE); - EXTI_InitStructure.EXTI_Line = PIOS_IMU3000_INT_EXTI_LINE; - EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; - EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; - EXTI_InitStructure.EXTI_LineCmd = ENABLE; - EXTI_Init(&EXTI_InitStructure); - + //GPIO_EXTILineConfig(cfg->eoc_exit.port_source, cfg->eoc_exit.pin_source); + EXTI_Init(&cfg->eoc_exti.init); + /* Enable and set EOC EXTI Interrupt to the lowest priority */ - NVIC_InitStructure.NVIC_IRQChannel = PIOS_IMU3000_INT_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PIOS_IMU3000_INT_PRIO; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); + NVIC_Init(&cfg->eoc_irq.init); /* Configure the IMU3000 Sensor */ PIOS_IMU3000_ConfigTypeDef IMU3000_InitStructure; diff --git a/flight/PiOS/inc/pios_imu3000.h b/flight/PiOS/inc/pios_imu3000.h index 2676ca799..d59534e69 100644 --- a/flight/PiOS/inc/pios_imu3000.h +++ b/flight/PiOS/inc/pios_imu3000.h @@ -33,6 +33,8 @@ #ifndef PIOS_IMU3000_H #define PIOS_IMU3000_H +#include "pios.h" + /* IMU3000 Addresses */ #define PIOS_IMU3000_I2C_ADDR 0x69 #define PIOS_IMU3000_I2C_READ_ADDR 0xD2 @@ -116,8 +118,14 @@ struct pios_imu3000_data { int16_t z; }; +struct pios_imu3000_cfg { + struct stm32_gpio drdy; + struct stm32_exti eoc_exti; + struct stm32_irq eoc_irq; +}; + /* Public Functions */ -extern void PIOS_IMU3000_Init(void); +extern void PIOS_IMU3000_Init(const struct pios_imu3000_cfg * cfg); extern bool PIOS_IMU3000_NewDataAvailable(void); extern int32_t PIOS_IMU3000_ReadFifo(uint8_t * buffer, uint16_t len); extern int32_t PIOS_IMU3000_ReadGyros(int16_t * data); diff --git a/flight/Project/OpenPilotOSX/OpenPilotOSX.xcodeproj/project.pbxproj b/flight/Project/OpenPilotOSX/OpenPilotOSX.xcodeproj/project.pbxproj index fb19c2803..f83759e13 100644 --- a/flight/Project/OpenPilotOSX/OpenPilotOSX.xcodeproj/project.pbxproj +++ b/flight/Project/OpenPilotOSX/OpenPilotOSX.xcodeproj/project.pbxproj @@ -2861,6 +2861,8 @@ 65D1FBD613F50CD5006374A6 /* pios_hmc5883.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_hmc5883.c; sourceTree = ""; }; 65D1FBD713F5146F006374A6 /* pios_bmp085.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_bmp085.c; sourceTree = ""; }; 65D1FBD813F51865006374A6 /* pios_bmp085.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_bmp085.c; sourceTree = ""; }; + 65D1FBD913F51AB7006374A6 /* pios_imu3000.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_imu3000.c; sourceTree = ""; }; + 65D1FBDA13F51AE1006374A6 /* pios_imu3000.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_imu3000.h; sourceTree = ""; }; 65D2CA841248F9A400B1E7D6 /* mixersettings.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = mixersettings.xml; sourceTree = ""; }; 65D2CA851248F9A400B1E7D6 /* mixerstatus.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = mixerstatus.xml; sourceTree = ""; }; 65DEA78513F0FE6000095B06 /* stm32f2xx_conf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stm32f2xx_conf.h; sourceTree = ""; }; @@ -3734,6 +3736,7 @@ 6560A38013EE26B700105DA5 /* pios_gpio.c */, 65D1FBD613F50CD5006374A6 /* pios_hmc5883.c */, 6560A38113EE26B700105DA5 /* pios_i2c.c */, + 65D1FBD913F51AB7006374A6 /* pios_imu3000.c */, 6560A38213EE26B700105DA5 /* pios_iap.c */, 6560A38313EE26B700105DA5 /* pios_irq.c */, 6560A38413EE26B700105DA5 /* pios_led.c */, @@ -4056,11 +4059,11 @@ 65632DF41251650300469B77 /* Boards */ = { isa = PBXGroup; children = ( - 65D1FBD313F4FF1D006374A6 /* STM32F2xx_INS.h */, 65632DF51251650300469B77 /* pios_board.h */, 65632DF71251650300469B77 /* STM3210E_OP.h */, 65632DF61251650300469B77 /* STM32103CB_AHRS.h */, 65E6E06112E031E300058553 /* STM32103CB_CC_Rev1.h */, + 65D1FBD313F4FF1D006374A6 /* STM32F2xx_INS.h */, 65E6E06212E031E300058553 /* STM32103CB_PIPXTREME_Rev1.h */, ); path = Boards; @@ -8206,6 +8209,7 @@ 65D1FBD413F504C9006374A6 /* pios_hmc5883.h */, 65E8F04311EFF25C00BBF654 /* pios_i2c.h */, 6526645A122DF972006F9A3C /* pios_i2c_priv.h */, + 65D1FBDA13F51AE1006374A6 /* pios_imu3000.h */, 65E8F04411EFF25C00BBF654 /* pios_irq.h */, 65E8F04511EFF25C00BBF654 /* pios_led.h */, 65E8F04611EFF25C00BBF654 /* pios_opahrs.h */,