export BOARD = inemo
TARGET = multitouchglove.bin
-TARGET_OBJS = lib/spi.o lib/uart.o lib/HAL_L3Gx.o lib/L3Gx/src/L3Gx.o
+TARGET_OBJS = lib/spi.o lib/uart.o lib/i2c.o lib/HAL_L3Gx.o lib/L3Gx/src/L3Gx.o lib/LSM303DLHC/src/LSM303DLHC.o
+
+#lib/HAL_LSM303DLHC.o
LIBDEPS = uC-sdk/FreeRTOS/libFreeRTOS.a uC-sdk/arch/libarch.a uC-sdk/os/libos.a uC-sdk/libc/libc.a uC-sdk/libm/libm.a uC-sdk/acorn/libacorn.a
LIBS = -Wl,--start-group $(LIBDEPS) -Wl,--end-group
+/*\r
+ Hardware Abstraction Layer for L3Gx gyroscopes\r
+*/\r
+\r
#ifndef __HAL_L3GX__\r
#define __HAL_L3GX__\r
\r
-/**\r
- * @file HAL_LSM303DLHC.h\r
- * @author ART Team IMS-Systems Lab\r
- * @version V2.3.0\r
- * @date 12 April 2012\r
- * @brief Hardware Abstraction Layer for LSM303DLHC.\r
- * @details\r
- *\r
- * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS\r
- * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE\r
- * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY\r
- * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING\r
- * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE\r
- * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.\r
- *\r
- * THIS SOURCE CODE IS PROTECTED BY A LICENSE.\r
- * FOR MORE INFORMATION PLEASE CAREFULLY READ THE LICENSE AGREEMENT FILE LOCATED\r
- * IN THE ROOT DIRECTORY OF THIS FIRMWARE PACKAGE.\r
- *\r
- * <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2>\r
- */\r
+/*\r
+ Hardware Abstraction Layer for LSM303DLHC accelerometer + magnetometer\r
+*/\r
\r
-\r
-/* Define to prevent recursive inclusion*/\r
#ifndef __HAL_LSM303DLHC_H\r
#define __HAL_LSM303DLHC_H\r
\r
-/* Includes */\r
#include "stm32f10x.h"\r
#include "i2c.h"\r
\r
-\r
-#ifdef __cplusplus\r
- extern "C" {\r
-#endif\r
-\r
-/**\r
-* @addtogroup iNemo_Sensor_Drivers iNemo Sensor Drivers\r
-* @{\r
-*/ \r
- \r
-/**\r
- * @addtogroup HAL_LSM303DLHC HAL LSM303DLHC\r
- * @brief This is an adapter header to join the platform indipendent @ref Sensor_Libraries for the LSM303DLHC 6 axis sensor\r
- * to the low level driver on the microcontroller side.\r
- * @{\r
- */\r
-\r
-/**\r
- * @addtogroup HAL_LSM303DLHC_Exported_Constants HAL LSM303DLHC Exported Constants\r
- * @{\r
- */\r
-\r
- \r
-#define LSM_I2C I2C2\r
\r
+#define LSM_I2C I2C2 \r
#define LSM_I2C_Speed 400000\r
\r
-\r
-\r
-/**\r
- * @addtogroup HAL_LSM303DLHC_Interrupt_Pin_Define HAL LSM303DLHC Interrupt Pin Define\r
- * @{\r
- */\r
-\r
#define LSM_A_INT1_Pin GPIO_Pin_2\r
#define LSM_A_INT1_Port GPIOD\r
#define LSM_A_INT1_RCC_Port RCC_APB2Periph_GPIOD\r
#define LSM_A_INT2_Pin GPIO_Pin_5\r
#define LSM_A_INT2_Port GPIOB\r
#define LSM_A_INT2_RCC_Port RCC_APB2Periph_GPIOB\r
-\r
-\r
-/** \r
- *@}\r
- */\r
- \r
-/**\r
- *@}\r
- */\r
-\r
-/**\r
- * @addtogroup HAL_LSM303DLHC_Exported_Macros HAL LSM303DLHC Exported Macros\r
- * @{\r
- */\r
\r
-#define Lsm303dlhcI2CInit() iNemoI2C2Init(LSM_I2C_Speed)\r
-#define Lsm303dlhcI2CBufferRead(cDevAddress,pVal,cAddress,nBytes) iNemoI2C2BufferRead(cDevAddress,pVal,cAddress,nBytes)\r
-#define Lsm303dlhcI2CBufferWrite(cDevAddress,pVal,cAddress,nBytes) iNemoI2C2BufferWrite(cDevAddress,pVal,cAddress,nBytes)\r
-\r
-/**\r
- *@}\r
- */\r
+#define Lsm303dlhcI2CInit() i2c_init(2, LSM_I2C_Speed)\r
+#define Lsm303dlhcI2CBufferRead(cDevAddress,pVal,cAddress,nBytes) iNemoI2CBufferRead(cDevAddress,pVal,cAddress,nBytes)\r
+#define Lsm303dlhcI2CBufferWrite(cDevAddress,pVal,cAddress,nBytes) iNemoI2CBufferWrite(cDevAddress,pVal,cAddress,nBytes)\r
\r
-/**\r
- *@}\r
- */\r
- \r
-/**\r
- *@}\r
- */\r
-\r
-#ifdef __cplusplus\r
-}\r
#endif\r
-\r
-#endif\r
-\r
-/******************* (C) COPYRIGHT 2012 STMicroelectronics *****END OF FILE****/\r
/* check in the control register4 the data alignment*/\r
if(!(ctrlx[0] & 0x40) || (ctrlx[1] & 0x40)) /* Little Endian Mode or FIFO mode */\r
{\r
- for(int i=0; i<3; i++)\r
+ int i;\r
+ for(i=0; i<3; i++)\r
{\r
pnRawData[i]=((int16_t)((uint16_t)buffer[2*i+1] << 8) + buffer[2*i])/cDivider;\r
}\r
}\r
else /* Big Endian Mode */\r
{\r
- for(uint8_t i=0; i<3; i++)\r
+ uint8_t i;\r
+ for(i=0; i<3; i++)\r
pnRawData[i]=((int16_t)((uint16_t)buffer[2*i] << 8) + buffer[2*i+1])/cDivider;\r
}\r
}\r
{\r
int16_t buffer[3];\r
uint8_t ctrlx[2];\r
- float LSM_Acc_Sensitivity;\r
+ float LSM_Acc_Sensitivity = 0.0;\r
\r
/* Read the raw data */\r
Lsm303dlhcAccReadRawData(buffer);\r
}\r
\r
/* Obtain the mg value for the three axis */\r
- for(uint8_t i=0; i<3; i++)\r
+ uint8_t i;\r
+ for(i=0; i<3; i++)\r
{\r
pfData[i]=(float)buffer[i]/LSM_Acc_Sensitivity;\r
}\r
Lsm303dlhcAccI2CBufferRead(pcBuffer, LSM_A_OUT_X_L_REG_ADDR, cDataToRead*6);\r
\r
/* convert all data to signed int16 */\r
- for(uint16_t i=0 ; i<cDataToRead*3 ; i++)\r
+ uint16_t i;\r
+ for(i=0 ; i<cDataToRead*3 ; i++)\r
{\r
pnData[i] = (int16_t)(((uint16_t)pcBuffer[j+1]<<8)+(uint16_t)pcBuffer[j])/16;\r
j+=2;\r
return 0.75;\r
case LSM_ODR_1_5_HZ:\r
return 1.5;\r
+ case LSM_ODR_3_0_HZ:\r
+ return 3.0;\r
case LSM_ODR_7_5_HZ:\r
return 7.5;\r
case LSM_ODR_15_HZ:\r
{\r
uint8_t buffer[6];\r
uint8_t CTRLB;\r
- uint16_t LSM_Magn_Sensitivity_XY, LSM_Magn_Sensitivity_Z;\r
+ uint16_t LSM_Magn_Sensitivity_XY = 0.0, LSM_Magn_Sensitivity_Z = 0.0;\r
uint8_t aux[2];\r
\r
Lsm303dlhcMagI2CByteRead(&CTRLB, LSM_M_CRB_REG_ADDR);\r
break;\r
}\r
\r
- for(int i=0; i<2; i++)\r
+ int i;\r
+ for(i=0; i<2; i++)\r
{\r
pfData[i]=(float)((int16_t)(((uint16_t)buffer[2*i] << 8) + buffer[2*i+1])*1000)/LSM_Magn_Sensitivity_XY;\r
}\r
buffer[4]=aux[0];\r
buffer[5]=aux[1];\r
\r
- for(uint8_t i=0; i<3; i++)\r
+ uint8_t i;\r
+ for(i=0; i<3; i++)\r
pnRawData[i]=(int16_t)(((uint16_t)buffer[2*i] << 8) + buffer[2*i+1]);\r
}\r
\r
include $(ROOTDIR)/FreeRTOS/config.mk
#include ../uC-sdk/arch/config.mk
-TARGET_SRCS += spi.c
TARGET_SRCS += uart.c
+TARGET_SRCS += spi.c
+TARGET_SRCS += i2c.c
TARGET_SRCS += HAL_L3Gx.c
#TARGET_SRCS += i2c.c
#TARGET_SRCS = iNEMO_Compass/src/iNEMO_Compass.c
#TARGET_SRCS += iNEMO_M1_SensorDrivers/src/iNemo_SPI_Driver.c
TARGET_SRCS += L3Gx/src/L3Gx.c
#TARGET_SRCS += LPS331AP/src/LPS331AP.c
-#TARGET_SRCS += LSM303DLHC/src/LSM303DLHC.c
+TARGET_SRCS += LSM303DLHC/src/LSM303DLHC.c
#TARGET_SRCS += STMF1_VirtualCom/src/STM32F1_VC_Desc.c
#TARGET_SRCS += STMF1_VirtualCom/src/STM32F1_VC_Endp.c
#TARGET_SRCS += STMF1_VirtualCom/src/STM32F1_VC_General.c
TARGET_INCLUDES += $(MAINDIR)/lib
-TARGET_INCLUDES += $(MAINDIR)/lib/iNEMO_Compass/inc
TARGET_INCLUDES += $(MAINDIR)/lib/L3Gx/inc
-TARGET_INCLUDES += $(MAINDIR)/lib/LPS331AP/inc
TARGET_INCLUDES += $(MAINDIR)/lib/LSM303DLHC/inc
ifeq ($(USE_MPU),true)
#include "i2c.h"
-#include "FreeRTOS.h"
+#include "task.h"
+#include <stm32f10x.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_i2c.h>
+#include <stdio.h>
+
#define FORCE_CRITICAL_SEC
#define I2C1_DR_Address 0x40005410
#define DMA_BUFFER_SIZE 196
+struct i2cInitDef_t {
+ // scl / sda
+ I2C_TypeDef * id;
+ GPIO_TypeDef * tdef[2];
+ GPIO_InitTypeDef gpiodef[2];
+ // i2c / gpio
+ volatile uint32_t * bridge[2];
+ uint32_t peripheral[2];
+};
+
+static struct i2cInitDef_t i2cInitDefs[2] = {
+ { I2C1, { GPIOB, GPIOB}, { // I2C1
+ { GPIO_Pin_6, GPIO_Speed_50MHz, GPIO_Mode_AF_OD }, // SCL
+ { GPIO_Pin_7, GPIO_Speed_50MHz, GPIO_Mode_AF_OD }, // SDA
+ }, {&RCC->APB1ENR, &RCC->APB2ENR}, {RCC_APB1Periph_I2C1, RCC_APB2Periph_GPIOB } },
+ { I2C2, { GPIOB, GPIOB}, { // I2C2
+ { GPIO_Pin_10, GPIO_Speed_50MHz, GPIO_Mode_AF_OD }, // SCL
+ { GPIO_Pin_11, GPIO_Speed_50MHz, GPIO_Mode_AF_OD }, // SDA
+ }, {&RCC->APB1ENR, &RCC->APB2ENR}, {RCC_APB1Periph_I2C2, RCC_APB2Periph_GPIOB } },
+};
+
+
+
+
+
+
+
+void i2c_init(uint8_t id, uint32_t speed)
+{
+ if (!((id >= 1) && (id <= 3)))
+ return;
+
+ struct i2cInitDef_t * i2cInitDef = i2cInitDefs + id - 1;
+
+ //clock AFIO
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
+
+ int i;
+ for (i = 0; i < 2; i++)
+ *(i2cInitDef->bridge[i]) |= i2cInitDef->peripheral[i];
+
+ for (i = 0; i < 2; i++)
+ GPIO_Init(i2cInitDef->tdef[i], &i2cInitDef->gpiodef[i]);
+
+ //Init SPI
+ I2C_InitTypeDef i2cdef;
+ i2cdef.I2C_Mode = I2C_Mode_I2C;
+ i2cdef.I2C_DutyCycle = I2C_DutyCycle_2;
+ i2cdef.I2C_OwnAddress1 = 0x00;
+ i2cdef.I2C_Ack = I2C_Ack_Enable;
+ i2cdef.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
+ i2cdef.I2C_ClockSpeed = speed;
+
+ I2C_Init(i2cInitDef->id, &i2cdef);
+ I2C_Cmd(i2cInitDef->id, ENABLE);
+
+#if (defined(I2C1_USE_DMA_TX) || defined(I2C1_USE_DMA_RX) || defined(I2C2_USE_DMA_TX) || defined(I2C2_USE_DMA_RX))
+ i2c_dma_init(id);
+#endif
+}
+
+void i2c_dma_init(uint8_t id)
+{
+
+}
+
+void uart_read_polling(uint8_t id, uint8_t *buffer, uint8_t nb)
+{
+
+}
+
+void uart_write_polling(uint8_t id, uint8_t *buffer, uint8_t nb)
+{
+
+}
+
+void uart_read_dma(uint8_t id, uint8_t *buffer, uint8_t nb)
+{
+
+}
+
+void uart_write_dma(uint8_t id, uint8_t *buffer, uint8_t nb)
+{
+
+}
+
+
+
+
+#if 0
+
+
/**
* @brief Reads a block of data from the device by DMA.
* @brief I2C2: I2C peripherial to use.
#endif
}
-
+#endif
/**
* @brief Reads a block of data from the device by polling.
* @param nNumByteToRead: number of bytes to read.
* @retval None
*/
-void iNemoI2CBufferReadPolling(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cReadAddr, uint8_t cNumByteToRead)
+void iNemoI2CBufferRead(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cReadAddr, uint8_t cNumByteToRead)
{
/* Set the MSb of the register address in case of multiple readings */
if(cNumByteToRead>1)
}
-
+#if 0
/**
* @brief Writes a block of data to the device by DMA.
* @brief I2C2: I2C peripherial to use.
while ((I2C2->CR1 & 0x0200) == 0x0200);
}
-
+#endif
/**
* @brief Writes a block of data to the device by polling.
* @param nNumByteToWrite : number of bytes to write.
* @retval None
*/
-void iNemoI2CBufferWritePolling(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cWriteAddr, uint8_t cNumByteToWrite)
+void iNemoI2CBufferWrite(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cWriteAddr, uint8_t cNumByteToWrite)
{
/* Set to 1 the MSb of the register address in case of multiple byte writing */
if(cNumByteToWrite>1)
/* Test on EV8 and clear it */
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
- for(uint8_t i=0 ; i<cNumByteToWrite ; i++)
+ uint8_t i;
+ for(i=0 ; i<cNumByteToWrite ; i++)
{
/* Send the byte to be written */
I2C_SendData(I2C2, pcBuffer[i]);
+#ifndef __I2C__
+#define __I2C__
-void iNemoI2CBufferReadDma(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cReadAddr, uint8_t cNumByteToRead);
-void iNemoI2CBufferReadPolling(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cReadAddr, uint8_t cNumByteToRead);
-void iNemoI2CBufferWriteDma(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cWriteAddr, uint8_t cNumByteToWrite);
-void iNemoI2CBufferWritePolling(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cWriteAddr, uint8_t cNumByteToWrite);
+#include "FreeRTOS.h"
+
+void i2c_init(uint8_t id, uint32_t speed);
+void i2c_dma_init(uint8_t id);
+
+void uart_read_polling(uint8_t id, uint8_t *buffer, uint8_t nb);
+void uart_write_polling(uint8_t id, uint8_t *buffer, uint8_t nb);
+
+void uart_read_dma(uint8_t id, uint8_t *buffer, uint8_t nb);
+void uart_write_dma(uint8_t id, uint8_t *buffer, uint8_t nb);
+
+//void iNemoI2CBufferReadDma(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cReadAddr, uint8_t cNumByteToRead);
+void iNemoI2CBufferRead(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cReadAddr, uint8_t cNumByteToRead);
+//void iNemoI2CBufferWriteDma(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cWriteAddr, uint8_t cNumByteToWrite);
+void iNemoI2CBufferWrite(uint8_t cAddr, uint8_t* pcBuffer, uint8_t cWriteAddr, uint8_t cNumByteToWrite);
+
+#endif
\ No newline at end of file
static struct spiInitDef_t spiInitDefs[3] = {
{ SPI1, { GPIOA, GPIOA, GPIOA, GPIOA}, { // SPI1
- { GPIO_Pin_5 , GPIO_Speed_50MHz, GPIO_Mode_AF_PP }, // SCK
+ { GPIO_Pin_5, GPIO_Speed_50MHz, GPIO_Mode_AF_PP }, // SCK
{ GPIO_Pin_7, GPIO_Speed_50MHz, GPIO_Mode_AF_PP }, // MOSI
{ GPIO_Pin_6, GPIO_Speed_50MHz, GPIO_Mode_IN_FLOATING }, // MISO
- { GPIO_Pin_4, GPIO_Speed_50MHz, GPIO_Mode_Out_PP }, // CS
- }, {&RCC->APB2ENR, &RCC->APB2ENR}, {RCC_APB2Periph_SPI1, RCC_APB2Periph_GPIOA} },
+ { GPIO_Pin_4, GPIO_Speed_50MHz, GPIO_Mode_Out_PP }, // CS
+ }, {&RCC->APB2ENR, &RCC->APB2ENR}, {RCC_APB2Periph_SPI1, RCC_APB2Periph_GPIOA } },
{ SPI2, { GPIOB, GPIOB, GPIOB, GPIOB}, { // SPI2
- { GPIO_Pin_13 , GPIO_Speed_50MHz, GPIO_Mode_AF_PP }, // SCK
+ { GPIO_Pin_13, GPIO_Speed_50MHz, GPIO_Mode_AF_PP }, // SCK
{ GPIO_Pin_15, GPIO_Speed_50MHz, GPIO_Mode_AF_PP }, // MOSI
{ GPIO_Pin_14, GPIO_Speed_50MHz, GPIO_Mode_IN_FLOATING }, // MISO
- { GPIO_Pin_12, GPIO_Speed_50MHz, GPIO_Mode_Out_PP }, // CS
- }, {&RCC->APB1ENR, &RCC->APB2ENR}, {RCC_APB1Periph_SPI2, RCC_APB2Periph_GPIOB} },
+ { GPIO_Pin_12, GPIO_Speed_50MHz, GPIO_Mode_Out_PP }, // CS
+ }, {&RCC->APB1ENR, &RCC->APB2ENR}, {RCC_APB1Periph_SPI2, RCC_APB2Periph_GPIOB } },
{ SPI3, { GPIOB, GPIOB, GPIOB, GPIOA}, { // SPI3
- { GPIO_Pin_3 , GPIO_Speed_50MHz, GPIO_Mode_AF_PP }, // SCK
+ { GPIO_Pin_3, GPIO_Speed_50MHz, GPIO_Mode_AF_PP }, // SCK
{ GPIO_Pin_5, GPIO_Speed_50MHz, GPIO_Mode_AF_PP }, // MOSI
{ GPIO_Pin_4, GPIO_Speed_50MHz, GPIO_Mode_IN_FLOATING }, // MISO
- { GPIO_Pin_15, GPIO_Speed_50MHz, GPIO_Mode_Out_PP }, // CS
- }, {&RCC->APB1ENR, &RCC->APB2ENR}, {RCC_APB1Periph_SPI3, RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB} },
+ { GPIO_Pin_15, GPIO_Speed_50MHz, GPIO_Mode_Out_PP }, // CS
+ }, {&RCC->APB1ENR, &RCC->APB2ENR}, {RCC_APB1Periph_SPI3, RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB } },
};
void spi_init(uint8_t id)
}, {&RCC->APB1ENR, &RCC->APB2ENR}, {RCC_APB1Periph_UART5, RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD } },
};
-void uart_init(uint8_t id)
+void uart_init(uint8_t id, uint32_t baudrate)
{
if (!((id >= 1) && (id <= 3)))
return;
USART_InitTypeDef usartdef;
- usartdef.USART_BaudRate = 115200;
+ usartdef.USART_BaudRate = baudrate;
usartdef.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
usartdef.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
usartdef.USART_WordLength = USART_WordLength_8b;
USART_Cmd(uartInitDef->id, ENABLE);
}
+void uart_deinit(uint8_t id)
+{
+ if (!((id >= 1) && (id <= 3)))
+ return;
+
+ struct uartInitDef_t * uartInitDef = uartInitDefs + id - 1;
+
+ USART_DeInit(uartInitDef->id);
+}
+
void uart_send_char(uint8_t id, uint8_t c)
{
if (!((id >= 1) && (id <= 3)))
#include "FreeRTOS.h"
-void uart_init(uint8_t id);
+void uart_init(uint8_t id, uint32_t baudrate);
+void uart_deinit(uint8_t id);
void uart_send_char(uint8_t id, uint8_t c);
uint8_t uart_receive_char(uint8_t id);
#include <stm32f10x_i2c.h>
#include <spi.h>
+#include <i2c.h>
#include <L3Gx.h>
+#include <LSM303DLHC.h>
+#define LEDS
+#define GYRO
+#define ACCELERO
+#ifdef LEDS
void initLed()
{
//set Pin22 (PA4) to output mode
GPIO_Init(GPIOA, &pin22def);
}
+
+void setLed()
+{
+ GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
+}
+
+void resetLed()
+{
+ GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
+}
+
+static void blinkerTask(void *p)
+{
+ printf("Start blinker task\n");
+ while (1)
+ {
+ setLed();
+ vTaskDelay(1357);
+ resetLed();
+ vTaskDelay(1357);
+ }
+}
+#endif
+
+#ifdef GYRO
void initGyro()
{
- L3GInit L3GInitStructure;
+ L3GInit gyrodef;
/* Fill the gyro structure */
- L3GInitStructure.xPowerMode = L3G_NORMAL_SLEEP_MODE;
- L3GInitStructure.xOutputDataRate = L3G_ODR_190_HZ_CUTOFF_12_5;
- L3GInitStructure.xEnabledAxes = L3G_ALL_AXES_EN;
- L3GInitStructure.xFullScale = L3G_FS_500_DPS;
- L3GInitStructure.xDataUpdate = L3G_BLOCK_UPDATE;
- L3GInitStructure.xEndianness = L3G_BIG_ENDIAN;
+ gyrodef.xPowerMode = L3G_NORMAL_SLEEP_MODE;
+ gyrodef.xOutputDataRate = L3G_ODR_190_HZ_CUTOFF_12_5;
+ gyrodef.xEnabledAxes = L3G_ALL_AXES_EN;
+ gyrodef.xFullScale = L3G_FS_500_DPS;
+ gyrodef.xDataUpdate = L3G_BLOCK_UPDATE;
+ gyrodef.xEndianness = L3G_BIG_ENDIAN;
/* Configure the gyro main parameters */
- L3gd20Config(&L3GInitStructure);
+ L3gd20Config(&gyrodef);
}
void getGyroInfo()
printf("Endianness: %02x\n", L3GInitStructure.xEndianness);
}
-void setLed()
+static void gyroTask(void *p)
{
- GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
+ printf("Start gyro task\n");
+ float *values = (float *) malloc(3 * sizeof(float));
+ if (values == NULL)
+ return;
+ while (1)
+ {
+ L3gxReadAngRate(values);
+ printf("Gyro: x=%.4f y=%.4f z=%.4f\n", values[0], values[1], values[2]);
+ vTaskDelay(1000);
+ }
+ free(values);
}
+#endif
-void resetLed()
+#ifdef ACCELERO
+void initAccelero()
{
- GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
-}
+ LSMAccInit accelerodef;
-static void blinkerTask(void *p)
-{
- printf("Start blinker task\n");
- while (1)
- {
- setLed();
- vTaskDelay(1357);
- resetLed();
- vTaskDelay(1357);
- }
+ /* Fill the gyro structure */
+ accelerodef.xPowerMode = LSM_NORMAL_MODE;
+ accelerodef.xOutputDataRate = LSM_ODR_400_HZ;
+ accelerodef.xEnabledAxes = LSM_ALL_AXES_EN;
+ accelerodef.xFullScale = LSM_FS_2G;
+ accelerodef.xDataUpdate = LSM_CONTINUOS_UPDATE;
+ accelerodef.xEndianness = LSM_BIG_ENDIAN;
+ accelerodef.xHighResolution = LSM_ENABLE;
+
+ /* Configure the gyro main parameters */
+ Lsm303dlhcAccConfig(&accelerodef);
}
-static void gyroTask(void *p)
+static void acceleroTask(void *p)
{
- printf("Start gyro task\n");
+ printf("Start accelero task\n");
float *values = (float *) malloc(3 * sizeof(float));
if (values == NULL)
return;
while (1)
{
- L3gxReadAngRate(values);
- printf("x=%.4f y=%.4f z=%.4f\n", values[0], values[1], values[2]);
+ Lsm303dlhcAccReadAcc(values);
+ printf("Accelero: x=%.4f y=%.4f z=%.4f\n", values[0], values[1], values[2]);
vTaskDelay(1000);
}
free(values);
}
+#endif
int main()
{
init_malloc_wrapper();
+
+
+#ifdef LEDS
printf("Init led\n");
initLed();
+ printf("Start blinkerTask\n");
+ xTaskCreate(blinkerTask, (const signed char *)NULL, configMINIMAL_STACK_SIZE, (void *)NULL, tskIDLE_PRIORITY, NULL);
+#endif
+
+#ifdef GYRO
printf("Init SPI 2\n");
spi_init(2);
+ getGyroInfo();
printf("Init Gyro\n");
initGyro();
-
- getGyroInfo();
-
- printf("Start blinkerTask\n");
- //start a task
- xTaskCreate(blinkerTask, (const signed char *)NULL, configMINIMAL_STACK_SIZE, (void *)NULL, tskIDLE_PRIORITY, NULL);
-
printf("Start gyroTask\n");
- //start a task
xTaskCreate(gyroTask, (const signed char *)NULL, configMINIMAL_STACK_SIZE, (void *)NULL, tskIDLE_PRIORITY, NULL);
+#endif
+
+#ifdef ACCELERO
+ printf("Init I2C2 2\n");
+ i2c_init(2, 400000);
+ printf("Init Accelero\n");
+ initAccelero();
+ printf("Start acceleroTask\n");
+ xTaskCreate(acceleroTask, (const signed char *)NULL, configMINIMAL_STACK_SIZE, (void *)NULL, tskIDLE_PRIORITY, NULL);
+#endif
//start task scheduler
vTaskStartScheduler();