i2cexample master
authorThomas Pietrzak <thomas.pietrzak@gmail.com>
Fri, 26 Dec 2014 11:53:27 +0000 (12:53 +0100)
committerThomas Pietrzak <thomas.pietrzak@gmail.com>
Fri, 26 Dec 2014 11:53:27 +0000 (12:53 +0100)
Makefile [new file with mode: 0644]
i2cexample.c [new file with mode: 0644]
lib/Makefile [new file with mode: 0644]
lib/config.mk [new file with mode: 0644]
lib/i2c.c [new file with mode: 0644]
lib/i2c.h [new file with mode: 0644]
lib/stm32f4_discovery.c [new file with mode: 0755]
lib/stm32f4_discovery.h [new file with mode: 0755]
lib/stm32f4_discovery_lis302dl.c [new file with mode: 0755]
lib/stm32f4_discovery_lis302dl.h [new file with mode: 0755]

diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..6a6c87b
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,55 @@
+export NODEMO = true
+ROOTDIR = $(CURDIR)/uC-sdk
+export BOARD = stm32f4discovery
+
+TARGET = i2cexample.bin
+TARGET_OBJS = lib/i2c.o lib/stm32f4_discovery.o lib/stm32f4_discovery_lis302dl.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
+TARGET_INCLUDES = include
+
+export MAINDIR = $(CURDIR)
+export ROOTDIR = $(MAINDIR)/uC-sdk/
+
+include $(MAINDIR)/lib/config.mk
+include $(ROOTDIR)/common.mk
+
+all: deps uC-sdk lib $(TARGET)
+
+clean: clean-generic
+       $(Q)rm -f $(TARGET)
+       $(Q)$(MAKE) $(MAKE_OPTS) -C uC-sdk clean
+       $(Q)$(MAKE) $(MAKE_OPTS) -C lib clean
+
+.PHONY: uC-sdk lib
+
+uC-sdk/FreeRTOS/libFreeRTOS.a: uC-sdk
+uC-sdk/arch/libarch.a: uC-sdk
+uC-sdk/os/libos.a: uC-sdk
+uC-sdk/libc/libc.a: uC-sdk
+uC-sdk/libm/libm.a: uC-sdk
+uC-sdk/acorn/libacorn.a: uC-sdk
+
+lib:
+       $(E) "[MAKE]   Entering lib"
+       $(Q)$(MAKE) $(MAKE_OPTS) -C lib
+
+uC-sdk:
+       $(E) "[MAKE]   Entering uC-sdk"
+       $(Q)$(MAKE) $(MAKE_OPTS) -C uC-sdk
+
+deps: ldeps
+       $(E) "[DEPS]   Creating dependency tree for uC-sdk"
+       $(Q)$(MAKE) $(MAKE_OPTS) -C uC-sdk ldeps
+       $(E) "[DEPS]   Creating dependency tree for lib"
+       $(Q)$(MAKE) $(MAKE_OPTS) -C lib ldeps
+
+include $(ROOTDIR)/FreeRTOS/config.mk
+include $(ROOTDIR)/arch/config.mk
+include $(ROOTDIR)/os/config.mk
+include $(ROOTDIR)/libc/config.mk
+include $(ROOTDIR)/libm/config.mk
+include $(ROOTDIR)/acorn/config.mk
+include $(ROOTDIR)/target-rules.mk
+
diff --git a/i2cexample.c b/i2cexample.c
new file mode 100644 (file)
index 0000000..e6111d0
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+st-util:
+openocd -f board/stm32f4discovery.cfg
+
+arm-none-eabi-gdbtui -ex "target extended-remote :3333" i2cexample.elf
+monitor reset halt
+load 
+continue
+*/
+
+
+
+#include <FreeRTOS.h>
+#include <task.h>
+#include <stdio.h>
+#include <malloc_wrapper.h>
+
+
+#include <stm32f4xx.h>
+#include <stm32f4xx_gpio.h>
+
+//Accelerometer
+#include <stm32f4_discovery_lis302dl.h>
+
+uint32_t pins[] = {GPIO_Pin_12, GPIO_Pin_13, GPIO_Pin_14, GPIO_Pin_15};
+
+void initLed()
+{
+    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
+    //set led gpio to output mode
+    GPIO_InitTypeDef pindef;
+    pindef.GPIO_Mode = GPIO_Mode_OUT;
+    pindef.GPIO_Speed = GPIO_Speed_50MHz;
+    pindef.GPIO_OType = GPIO_OType_PP;
+    pindef.GPIO_PuPd = GPIO_PuPd_UP;
+
+    int i;
+    for (i = 0 ; i < 4 ; i++)
+    {
+        pindef.GPIO_Pin = pins[i];
+        GPIO_Init(GPIOD, &pindef);
+    }
+}
+
+
+void setLed(int n)
+{
+    GPIO_WriteBit(GPIOD, pins[n], Bit_SET);
+}
+
+void resetLed(int n)
+{
+    GPIO_WriteBit(GPIOD, pins[n], Bit_RESET);
+}
+
+#define THRESHOLD 200
+
+void accelerometerTask()
+{
+    LIS302DL_InitTypeDef init;
+    init.Power_Mode = LIS302DL_LOWPOWERMODE_ACTIVE;
+    init.Output_DataRate = LIS302DL_DATARATE_100;
+    init.Axes_Enable = LIS302DL_XYZ_ENABLE;
+    init.Full_Scale = LIS302DL_FULLSCALE_2_3;
+    init.Self_Test = LIS302DL_SELFTEST_NORMAL;
+    LIS302DL_Init(&init);
+    
+    LIS302DL_InterruptConfigTypeDef initinterrupt;
+    initinterrupt.Latch_Request = LIS302DL_INTERRUPTREQUEST_LATCHED;
+    initinterrupt.SingleClick_Axes = LIS302DL_CLICKINTERRUPT_Z_ENABLE;
+    initinterrupt.DoubleClick_Axes = LIS302DL_DOUBLECLICKINTERRUPT_Z_ENABLE;
+    LIS302DL_InterruptConfig(&initinterrupt);
+
+    vTaskDelay(30 / portTICK_RATE_MS);
+
+    int32_t acceleration[3];
+
+    while (1)
+    {
+        LIS302DL_ReadACC(acceleration);
+        if (acceleration[0] > THRESHOLD)
+        {
+            setLed(1);
+            resetLed(3);
+        }
+        else if (acceleration[0] < -THRESHOLD)
+        {
+            resetLed(1);
+            setLed(3);
+        }
+        else
+        {
+            resetLed(1);
+            resetLed(3);
+        }
+        if (acceleration[1] > THRESHOLD)
+        {
+            setLed(0);
+            resetLed(2);
+        }
+        else if (acceleration[1] < -THRESHOLD)
+        {
+            resetLed(0);
+            setLed(2);
+        }
+        else
+        {
+            resetLed(0);
+            resetLed(2);
+        }
+    }
+}
+
+void sleep(int duration)
+{
+    volatile unsigned int i;
+    for(i = 0 ; i < 1000 * duration ; i++);
+}
+
+/*
+static void blinkerTask(void *p) 
+{
+    int i = 0;
+    printf("Start blinker task\n");
+    while (1) 
+    {
+        setLed(i);
+        vTaskDelay(500 / portTICK_RATE_MS);
+        resetLed(i); 
+        vTaskDelay(500 / portTICK_RATE_MS);
+        i = (i + 1) % 4;
+    }
+}*/
+
+int main() 
+{
+    init_malloc_wrapper();
+
+    printf("Init led\n");
+    initLed();
+    int cl = SystemCoreClock;
+
+    //while (1) 
+    int i;
+    for (i = 0 ; i < 4 ; i++)
+    {
+        setLed(i);
+        sleep(100);
+    }
+    for (i = 0 ; i < 4 ; i++)
+    {
+        resetLed(i);
+        sleep(100);
+    }
+    cl++;
+
+    printf("Start blinkerTask\n");
+    //xTaskCreate(blinkerTask, (const signed char *)NULL, configMINIMAL_STACK_SIZE, (void *)NULL, tskIDLE_PRIORITY, NULL);
+    xTaskCreate(accelerometerTask, (const signed char *)NULL, configMINIMAL_STACK_SIZE, (void *)NULL, tskIDLE_PRIORITY, NULL);
+
+    //start task scheduler
+    vTaskStartScheduler();
+
+    return 0;
+}
diff --git a/lib/Makefile b/lib/Makefile
new file mode 100644 (file)
index 0000000..fb62ec7
--- /dev/null
@@ -0,0 +1,16 @@
+all:  $(TARGET_OBJ)
+
+export BOARD = stm32f4discovery
+
+include $(ROOTDIR)/common.mk
+include config.mk
+include $(ROOTDIR)/arch/config.mk
+include $(ROOTDIR)/FreeRTOS/config.mk
+
+TARGET_SRCS += i2c.c
+TARGET_SRCS += stm32f4_discovery.c
+TARGET_SRCS += stm32f4_discovery_lis302dl.c
+
+include $(ROOTDIR)/target-rules.mk
+
+clean: clean-generic
diff --git a/lib/config.mk b/lib/config.mk
new file mode 100644 (file)
index 0000000..10ef728
--- /dev/null
@@ -0,0 +1,5 @@
+TARGET_INCLUDES += $(MAINDIR)/lib
+
+ifeq ($(USE_MPU),true)
+TARGET_CPPFLAGS += -DportUSING_MPU_WRAPPERS=1
+endif
diff --git a/lib/i2c.c b/lib/i2c.c
new file mode 100644 (file)
index 0000000..0ae7fc5
--- /dev/null
+++ b/lib/i2c.c
@@ -0,0 +1,160 @@
+#include "i2c.h"
+#include "task.h"
+#include <stm32f4xx.h>
+#include <stm32f4xx_gpio.h>
+#include <stm32f4xx_rcc.h>
+#include <stm32f4xx_i2c.h>
+
+#include <stdio.h>
+
+
+struct i2cInitDef_t {
+    // scl / sda
+    I2C_TypeDef * id;
+    uint8_t afid;
+    GPIO_TypeDef * tdef[2];
+    GPIO_InitTypeDef gpiodef[2];
+    uint16_t gpiopinsource[2];
+    // i2c / gpio
+    volatile uint32_t * bridge[2];
+    uint32_t peripheral[2];
+};
+
+static struct i2cInitDef_t i2cInitDefs[2] = {
+    { I2C1, GPIO_AF_I2C1, { GPIOB, GPIOB }, {   // I2C1
+        { GPIO_Pin_6, GPIO_Mode_AF, GPIO_Speed_50MHz, GPIO_OType_OD, GPIO_PuPd_UP },        // SCL
+        { GPIO_Pin_7, GPIO_Mode_AF, GPIO_Speed_50MHz, GPIO_OType_OD, GPIO_PuPd_UP },        // SDA
+    }, {GPIO_PinSource6, GPIO_PinSource7}, {&RCC->APB1ENR, &RCC->AHB1ENR}, {RCC_APB1Periph_I2C1, RCC_AHB1Periph_GPIOB } },
+    { I2C2, GPIO_AF_I2C2, { GPIOB, GPIOB }, {   // I2C2
+        { GPIO_Pin_10, GPIO_Mode_AF, GPIO_Speed_50MHz, GPIO_OType_OD, GPIO_PuPd_UP },       // SCL
+        { GPIO_Pin_11, GPIO_Mode_AF, GPIO_Speed_50MHz, GPIO_OType_OD, GPIO_PuPd_UP },       // SDA
+    }, {GPIO_PinSource10, GPIO_PinSource11}, {&RCC->APB1ENR, &RCC->AHB1ENR}, {RCC_APB1Periph_I2C2, RCC_AHB1Periph_GPIOB } },
+};
+
+
+void i2c_init(uint8_t id, uint32_t speed)
+{
+    if (!((id >= 1) && (id <= 3)))
+        return;
+
+    struct i2cInitDef_t * i2cInitDef = i2cInitDefs + id - 1;
+
+    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]);
+
+    for (i = 0; i < 2; i++)
+        GPIO_PinAFConfig(i2cInitDef->tdef[i], i2cInitDef->gpiopinsource[i], i2cInitDef->afid);
+
+    //Init I2C
+    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 i2c_start_read(uint8_t id, uint8_t destination)
+{
+    if (!((id >= 1) && (id <= 3)))
+        return;
+
+    struct i2cInitDef_t * i2cInitDef = i2cInitDefs + id - 1;
+
+       I2C_GenerateSTART(i2cInitDef->id, ENABLE);
+    while (!I2C_CheckEvent(i2cInitDef->id, I2C_EVENT_MASTER_MODE_SELECT));
+    I2C_Send7bitAddress(i2cInitDef->id, destination, I2C_Direction_Receiver);
+    while (!I2C_CheckEvent(i2cInitDef->id, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
+}
+
+void i2c_start_write(uint8_t id, uint8_t destination)
+{
+    if (!((id >= 1) && (id <= 3)))
+        return;
+
+    struct i2cInitDef_t * i2cInitDef = i2cInitDefs + id - 1;
+
+    I2C_GenerateSTART(i2cInitDef->id, ENABLE);
+    while (!I2C_CheckEvent(i2cInitDef->id, I2C_EVENT_MASTER_MODE_SELECT));
+    I2C_Send7bitAddress(i2cInitDef->id, destination, I2C_Direction_Transmitter);
+    while (!I2C_CheckEvent(i2cInitDef->id, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
+}
+
+void i2c_stop(uint8_t id)
+{
+    if (!((id >= 1) && (id <= 3)))
+        return;
+
+    struct i2cInitDef_t * i2cInitDef = i2cInitDefs + id - 1;
+
+    I2C_GenerateSTOP(i2cInitDef->id, ENABLE);
+}
+
+
+void i2c_read_polling(uint8_t id, uint8_t *buffer, uint8_t nb)
+{
+    if (!((id >= 1) && (id <= 3)))
+        return;
+
+    struct i2cInitDef_t * i2cInitDef = i2cInitDefs + id - 1;
+    taskENTER_CRITICAL();
+
+    while (nb--)
+    {
+        if (nb == 0)
+            I2C_AcknowledgeConfig(i2cInitDef->id, DISABLE);
+      
+      while (!I2C_CheckEvent(i2cInitDef->id, I2C_EVENT_MASTER_BYTE_RECEIVED));
+      *buffer++ = I2C_ReceiveData(i2cInitDef->id);
+    }
+    
+    I2C_AcknowledgeConfig(i2cInitDef->id, ENABLE);
+
+    taskEXIT_CRITICAL();
+}
+
+void i2c_write_polling(uint8_t id, uint8_t *buffer, uint8_t nb)
+{
+    if (!((id >= 1) && (id <= 3)))
+        return;
+
+    struct i2cInitDef_t * i2cInitDef = i2cInitDefs + id - 1;
+
+    taskENTER_CRITICAL();
+
+    while (nb--)
+    {
+        I2C_SendData(i2cInitDef->id, *buffer++);
+        while(!I2C_CheckEvent(i2cInitDef->id, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
+    }
+    taskEXIT_CRITICAL();
+}
+
+void i2c_read_dma(uint8_t id, uint8_t *buffer, uint8_t nb)
+{
+
+}
+
+void i2c_write_dma(uint8_t id, uint8_t *buffer, uint8_t nb)
+{
+
+}
+
diff --git a/lib/i2c.h b/lib/i2c.h
new file mode 100644 (file)
index 0000000..212e0c0
--- /dev/null
+++ b/lib/i2c.h
@@ -0,0 +1,22 @@
+#ifndef __I2C__
+#define __I2C__
+
+#include "FreeRTOS.h"
+
+void i2c_init(uint8_t id, uint32_t speed);
+void i2c_dma_init(uint8_t id);
+
+//call before initiating a read communication
+void i2c_start_read(uint8_t id, uint8_t destination);
+//call before initiating a write communication
+void i2c_start_write(uint8_t id, uint8_t destination);
+//call after communication ended
+void i2c_stop(uint8_t id);
+
+void i2c_read_polling(uint8_t id, uint8_t *buffer, uint8_t nb);
+void i2c_write_polling(uint8_t id, uint8_t *buffer, uint8_t nb);
+
+void i2c_read_dma(uint8_t id, uint8_t *buffer, uint8_t nb);
+void i2c_write_dma(uint8_t id, uint8_t *buffer, uint8_t nb);
+
+#endif
\ No newline at end of file
diff --git a/lib/stm32f4_discovery.c b/lib/stm32f4_discovery.c
new file mode 100755 (executable)
index 0000000..fa76d3a
--- /dev/null
@@ -0,0 +1,253 @@
+/**\r
+  ******************************************************************************\r
+  * @file    stm32f4_discovery.c\r
+  * @author  MCD Application Team\r
+  * @version V1.1.0\r
+  * @date    28-October-2011\r
+  * @brief   This file provides set of firmware functions to manage Leds and\r
+  *          push-button available on STM32F4-Discovery Kit from STMicroelectronics.\r
+  ******************************************************************************\r
+  * @attention\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
+  * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>\r
+  ******************************************************************************\r
+  */ \r
+  \r
+/* Includes ------------------------------------------------------------------*/\r
+#include "stm32f4_discovery.h"\r
+\r
+/** @addtogroup Utilities\r
+  * @{\r
+  */ \r
+\r
+/** @addtogroup STM32F4_DISCOVERY\r
+  * @{\r
+  */   \r
+    \r
+/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL \r
+  * @brief This file provides set of firmware functions to manage Leds and push-button\r
+  *        available on STM32F4-Discovery Kit from STMicroelectronics.\r
+  * @{\r
+  */ \r
+\r
+/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL_Private_TypesDefinitions\r
+  * @{\r
+  */ \r
+/**\r
+  * @}\r
+  */ \r
+\r
+\r
+/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL_Private_Defines\r
+  * @{\r
+  */ \r
+/**\r
+  * @}\r
+  */ \r
+\r
+\r
+/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL_Private_Macros\r
+  * @{\r
+  */ \r
+/**\r
+  * @}\r
+  */ \r
+\r
+\r
+/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL_Private_Variables\r
+  * @{\r
+  */ \r
+GPIO_TypeDef* GPIO_PORT[LEDn] = {LED4_GPIO_PORT, LED3_GPIO_PORT, LED5_GPIO_PORT,\r
+                                 LED6_GPIO_PORT};\r
+const uint16_t GPIO_PIN[LEDn] = {LED4_PIN, LED3_PIN, LED5_PIN,\r
+                                 LED6_PIN};\r
+const uint32_t GPIO_CLK[LEDn] = {LED4_GPIO_CLK, LED3_GPIO_CLK, LED5_GPIO_CLK,\r
+                                 LED6_GPIO_CLK};\r
+\r
+GPIO_TypeDef* BUTTON_PORT[BUTTONn] = {USER_BUTTON_GPIO_PORT }; \r
+\r
+const uint16_t BUTTON_PIN[BUTTONn] = {USER_BUTTON_PIN }; \r
+\r
+const uint32_t BUTTON_CLK[BUTTONn] = {USER_BUTTON_GPIO_CLK };\r
+\r
+const uint16_t BUTTON_EXTI_LINE[BUTTONn] = {USER_BUTTON_EXTI_LINE };\r
+\r
+const uint8_t BUTTON_PORT_SOURCE[BUTTONn] = {USER_BUTTON_EXTI_PORT_SOURCE};\r
+                                                                \r
+const uint8_t BUTTON_PIN_SOURCE[BUTTONn] = {USER_BUTTON_EXTI_PIN_SOURCE }; \r
+const uint8_t BUTTON_IRQn[BUTTONn] = {USER_BUTTON_EXTI_IRQn };\r
+\r
+NVIC_InitTypeDef   NVIC_InitStructure;\r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+\r
+/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL_Private_FunctionPrototypes\r
+  * @{\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL_Private_Functions\r
+  * @{\r
+  */ \r
+\r
+/**\r
+  * @brief  Configures LED GPIO.\r
+  * @param  Led: Specifies the Led to be configured. \r
+  *   This parameter can be one of following parameters:\r
+  *     @arg LED4\r
+  *     @arg LED3\r
+  *     @arg LED5\r
+  *     @arg LED6\r
+  * @retval None\r
+  */\r
+void STM_EVAL_LEDInit(Led_TypeDef Led)\r
+{\r
+  GPIO_InitTypeDef  GPIO_InitStructure;\r
+  \r
+  /* Enable the GPIO_LED Clock */\r
+  RCC_AHB1PeriphClockCmd(GPIO_CLK[Led], ENABLE);\r
+\r
+  /* Configure the GPIO_LED pin */\r
+  GPIO_InitStructure.GPIO_Pin = GPIO_PIN[Led];\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;\r
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;\r
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+  GPIO_Init(GPIO_PORT[Led], &GPIO_InitStructure);\r
+}\r
+\r
+/**\r
+  * @brief  Turns selected LED On.\r
+  * @param  Led: Specifies the Led to be set on. \r
+  *   This parameter can be one of following parameters:\r
+  *     @arg LED4\r
+  *     @arg LED3\r
+  *     @arg LED5\r
+  *     @arg LED6  \r
+  * @retval None\r
+  */\r
+void STM_EVAL_LEDOn(Led_TypeDef Led)\r
+{\r
+  GPIO_PORT[Led]->BSRRL = GPIO_PIN[Led];\r
+}\r
+\r
+/**\r
+  * @brief  Turns selected LED Off.\r
+  * @param  Led: Specifies the Led to be set off. \r
+  *   This parameter can be one of following parameters:\r
+  *     @arg LED4\r
+  *     @arg LED3\r
+  *     @arg LED5\r
+  *     @arg LED6 \r
+  * @retval None\r
+  */\r
+void STM_EVAL_LEDOff(Led_TypeDef Led)\r
+{\r
+  GPIO_PORT[Led]->BSRRH = GPIO_PIN[Led];  \r
+}\r
+\r
+/**\r
+  * @brief  Toggles the selected LED.\r
+  * @param  Led: Specifies the Led to be toggled. \r
+  *   This parameter can be one of following parameters:\r
+  *     @arg LED4\r
+  *     @arg LED3\r
+  *     @arg LED5\r
+  *     @arg LED6  \r
+  * @retval None\r
+  */\r
+void STM_EVAL_LEDToggle(Led_TypeDef Led)\r
+{\r
+  GPIO_PORT[Led]->ODR ^= GPIO_PIN[Led];\r
+}\r
+\r
+/**\r
+  * @brief  Configures Button GPIO and EXTI Line.\r
+  * @param  Button: Specifies the Button to be configured.\r
+  *   This parameter should be: BUTTON_USER\r
+  * @param  Button_Mode: Specifies Button mode.\r
+  *   This parameter can be one of following parameters:   \r
+  *     @arg BUTTON_MODE_GPIO: Button will be used as simple IO \r
+  *     @arg BUTTON_MODE_EXTI: Button will be connected to EXTI line with interrupt\r
+  *                            generation capability  \r
+  * @retval None\r
+  */\r
+void STM_EVAL_PBInit(Button_TypeDef Button, ButtonMode_TypeDef Button_Mode)\r
+{\r
+  GPIO_InitTypeDef GPIO_InitStructure;\r
+  EXTI_InitTypeDef EXTI_InitStructure;\r
+  NVIC_InitTypeDef myNVIC_InitStructure;\r
+\r
+  /* Enable the BUTTON Clock */\r
+  RCC_AHB1PeriphClockCmd(BUTTON_CLK[Button], ENABLE);\r
+  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);\r
+\r
+  /* Configure Button pin as input */\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;\r
+  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
+  GPIO_InitStructure.GPIO_Pin = BUTTON_PIN[Button];\r
+  GPIO_Init(BUTTON_PORT[Button], &GPIO_InitStructure);\r
+\r
+  if (Button_Mode == BUTTON_MODE_EXTI)\r
+  {\r
+    /* Connect Button EXTI Line to Button GPIO Pin */\r
+    SYSCFG_EXTILineConfig(BUTTON_PORT_SOURCE[Button], BUTTON_PIN_SOURCE[Button]);\r
+\r
+    /* Configure Button EXTI line */\r
+    EXTI_InitStructure.EXTI_Line = BUTTON_EXTI_LINE[Button];\r
+    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;\r
+    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  \r
+    EXTI_InitStructure.EXTI_LineCmd = ENABLE;\r
+    EXTI_Init(&EXTI_InitStructure);\r
+\r
+    /* Enable and set Button EXTI Interrupt to the lowest priority */\r
+    myNVIC_InitStructure.NVIC_IRQChannel = BUTTON_IRQn[Button];\r
+    myNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;\r
+    myNVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;\r
+    myNVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;\r
+\r
+    NVIC_Init(&myNVIC_InitStructure); \r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Returns the selected Button state.\r
+  * @param  Button: Specifies the Button to be checked.\r
+  *   This parameter should be: BUTTON_USER  \r
+  * @retval The Button GPIO pin value.\r
+  */\r
+uint32_t STM_EVAL_PBGetState(Button_TypeDef Button)\r
+{\r
+  return GPIO_ReadInputDataBit(BUTTON_PORT[Button], BUTTON_PIN[Button]);\r
+}\r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */   \r
+\r
+/**\r
+  * @}\r
+  */ \r
+    \r
+/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/\r
diff --git a/lib/stm32f4_discovery.h b/lib/stm32f4_discovery.h
new file mode 100755 (executable)
index 0000000..b93b11a
--- /dev/null
@@ -0,0 +1,158 @@
+/**\r
+  ******************************************************************************\r
+  * @file    stm32f4_discovery.h\r
+  * @author  MCD Application Team\r
+  * @version V1.1.0\r
+  * @date    28-October-2011\r
+  * @brief   This file contains definitions for STM32F4-Discovery Kit's Leds and \r
+  *          push-button hardware resources.\r
+  ******************************************************************************\r
+  * @attention\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
+  * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>\r
+  ******************************************************************************  \r
+  */ \r
+  \r
+/* Define to prevent recursive inclusion -------------------------------------*/\r
+#ifndef __STM32F4_DISCOVERY_H\r
+#define __STM32F4_DISCOVERY_H\r
+\r
+#ifdef __cplusplus\r
+ extern "C" {\r
+#endif\r
+                                              \r
+/* Includes ------------------------------------------------------------------*/\r
+ #include "stm32f4xx.h"\r
+   \r
+/** @addtogroup Utilities\r
+  * @{\r
+  */\r
+  \r
+/** @addtogroup STM32F4_DISCOVERY\r
+  * @{\r
+  */\r
+      \r
+/** @addtogroup STM32F4_DISCOVERY_LOW_LEVEL\r
+  * @{\r
+  */ \r
+\r
+/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL_Exported_Types\r
+  * @{\r
+  */\r
+typedef enum \r
+{\r
+  LED4 = 0,\r
+  LED3 = 1,\r
+  LED5 = 2,\r
+  LED6 = 3\r
+} Led_TypeDef;\r
+\r
+typedef enum \r
+{  \r
+  BUTTON_USER = 0,\r
+} Button_TypeDef;\r
+\r
+typedef enum \r
+{  \r
+  BUTTON_MODE_GPIO = 0,\r
+  BUTTON_MODE_EXTI = 1\r
+} ButtonMode_TypeDef;     \r
+/**\r
+  * @}\r
+  */ \r
+\r
+/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL_Exported_Constants\r
+  * @{\r
+  */ \r
+\r
+/** @addtogroup STM32F4_DISCOVERY_LOW_LEVEL_LED\r
+  * @{\r
+  */\r
+#define LEDn                             4\r
+\r
+#define LED4_PIN                         GPIO_Pin_12\r
+#define LED4_GPIO_PORT                   GPIOD\r
+#define LED4_GPIO_CLK                    RCC_AHB1Periph_GPIOD  \r
+  \r
+#define LED3_PIN                         GPIO_Pin_13\r
+#define LED3_GPIO_PORT                   GPIOD\r
+#define LED3_GPIO_CLK                    RCC_AHB1Periph_GPIOD  \r
+  \r
+#define LED5_PIN                         GPIO_Pin_14\r
+#define LED5_GPIO_PORT                   GPIOD\r
+#define LED5_GPIO_CLK                    RCC_AHB1Periph_GPIOD  \r
+  \r
+#define LED6_PIN                         GPIO_Pin_15\r
+#define LED6_GPIO_PORT                   GPIOD\r
+#define LED6_GPIO_CLK                    RCC_AHB1Periph_GPIOD\r
+/**\r
+  * @}\r
+  */ \r
+  \r
+/** @addtogroup STM32F4_DISCOVERY_LOW_LEVEL_BUTTON\r
+  * @{\r
+  */  \r
+#define BUTTONn                          1  \r
+\r
+/**\r
+ * @brief Wakeup push-button\r
+ */\r
+#define USER_BUTTON_PIN                GPIO_Pin_0\r
+#define USER_BUTTON_GPIO_PORT          GPIOA\r
+#define USER_BUTTON_GPIO_CLK           RCC_AHB1Periph_GPIOA\r
+#define USER_BUTTON_EXTI_LINE          EXTI_Line0\r
+#define USER_BUTTON_EXTI_PORT_SOURCE   EXTI_PortSourceGPIOA\r
+#define USER_BUTTON_EXTI_PIN_SOURCE    EXTI_PinSource0\r
+#define USER_BUTTON_EXTI_IRQn          EXTI0_IRQn \r
+/**\r
+  * @}\r
+  */ \r
+  \r
+/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL_Exported_Macros\r
+  * @{\r
+  */  \r
+/**\r
+  * @}\r
+  */ \r
+\r
+\r
+/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL_Exported_Functions\r
+  * @{\r
+  */\r
+void STM_EVAL_LEDInit(Led_TypeDef Led);\r
+void STM_EVAL_LEDOn(Led_TypeDef Led);\r
+void STM_EVAL_LEDOff(Led_TypeDef Led);\r
+void STM_EVAL_LEDToggle(Led_TypeDef Led);\r
+void STM_EVAL_PBInit(Button_TypeDef Button, ButtonMode_TypeDef Button_Mode);\r
+uint32_t STM_EVAL_PBGetState(Button_TypeDef Button);\r
+/**\r
+  * @}\r
+  */\r
+  \r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* __STM32F4_DISCOVERY_H */\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
\r
+\r
+/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/\r
diff --git a/lib/stm32f4_discovery_lis302dl.c b/lib/stm32f4_discovery_lis302dl.c
new file mode 100755 (executable)
index 0000000..4051fdd
--- /dev/null
@@ -0,0 +1,502 @@
+/**\r
+  ******************************************************************************\r
+  * @file    stm32f4_discovery_lis302dl.c\r
+  * @author  MCD Application Team\r
+  * @version V1.1.0\r
+  * @date    28-October-2011\r
+  * @brief   This file provides a set of functions needed to manage the LIS302DL\r
+  *          MEMS accelerometer available on STM32F4-Discovery Kit.\r
+  ******************************************************************************\r
+  * @attention\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
+  * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>\r
+  ******************************************************************************  \r
+  */\r
+\r
+/* Includes ------------------------------------------------------------------*/\r
+#include "stm32f4_discovery_lis302dl.h"\r
+\r
+/** @addtogroup Utilities\r
+  * @{\r
+  */ \r
+\r
+/** @addtogroup STM32F4_DISCOVERY\r
+  * @{\r
+  */ \r
+\r
+/** @addtogroup STM32F4_DISCOVERY_LIS302DL\r
+  * @{\r
+  */\r
+\r
+\r
+/** @defgroup STM32F4_DISCOVERY_LIS302DL_Private_TypesDefinitions\r
+  * @{\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup STM32F4_DISCOVERY_LIS302DL_Private_Defines\r
+  * @{\r
+  */\r
+__IO uint32_t  LIS302DLTimeout = LIS302DL_FLAG_TIMEOUT;   \r
+\r
+/* Read/Write command */\r
+#define READWRITE_CMD              ((uint8_t)0x80) \r
+/* Multiple byte read/write command */ \r
+#define MULTIPLEBYTE_CMD           ((uint8_t)0x40)\r
+/* Dummy Byte Send by the SPI Master device in order to generate the Clock to the Slave device */\r
+#define DUMMY_BYTE                 ((uint8_t)0x00)\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup STM32F4_DISCOVERY_LIS302DL_Private_Macros\r
+  * @{\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */ \r
+  \r
+/** @defgroup STM32F4_DISCOVERY_LIS302DL_Private_Variables\r
+  * @{\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup STM32F4_DISCOVERY_LIS302DL_Private_FunctionPrototypes\r
+  * @{\r
+  */\r
+static uint8_t LIS302DL_SendByte(uint8_t byte);\r
+static void LIS302DL_LowLevel_Init(void);\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup STM32F4_DISCOVERY_LIS302DL_Private_Functions\r
+  * @{\r
+  */\r
+\r
+\r
+/**\r
+  * @brief  Set LIS302DL Initialization.\r
+  * @param  LIS302DL_Config_Struct: pointer to a LIS302DL_Config_TypeDef structure \r
+  *         that contains the configuration setting for the LIS302DL.\r
+  * @retval None\r
+  */\r
+void LIS302DL_Init(LIS302DL_InitTypeDef *LIS302DL_InitStruct)\r
+{\r
+  uint8_t ctrl = 0x00;\r
+  \r
+  /* Configure the low level interface ---------------------------------------*/\r
+  LIS302DL_LowLevel_Init();\r
+  \r
+  /* Configure MEMS: data rate, power mode, full scale, self test and axes */\r
+  ctrl = (uint8_t) (LIS302DL_InitStruct->Output_DataRate | LIS302DL_InitStruct->Power_Mode | \\r
+                    LIS302DL_InitStruct->Full_Scale | LIS302DL_InitStruct->Self_Test | \\r
+                    LIS302DL_InitStruct->Axes_Enable);\r
+  \r
+  /* Write value to MEMS CTRL_REG1 regsister */\r
+  LIS302DL_Write(&ctrl, LIS302DL_CTRL_REG1_ADDR, 1);\r
+}\r
+\r
+/**\r
+  * @brief  Set LIS302DL Internal High Pass Filter configuration.\r
+  * @param  LIS302DL_Filter_ConfigTypeDef: pointer to a LIS302DL_FilterConfig_TypeDef \r
+  *         structure that contains the configuration setting for the LIS302DL Filter.\r
+  * @retval None\r
+  */\r
+void LIS302DL_FilterConfig(LIS302DL_FilterConfigTypeDef *LIS302DL_FilterConfigStruct)\r
+{\r
+  uint8_t ctrl = 0x00;\r
+  \r
+  /* Read CTRL_REG2 register */\r
+  LIS302DL_Read(&ctrl, LIS302DL_CTRL_REG2_ADDR, 1);\r
+  \r
+  /* Clear high pass filter cut-off level, interrupt and data selection bits*/\r
+  ctrl &= (uint8_t)~(LIS302DL_FILTEREDDATASELECTION_OUTPUTREGISTER | \\r
+                     LIS302DL_HIGHPASSFILTER_LEVEL_3 | \\r
+                     LIS302DL_HIGHPASSFILTERINTERRUPT_1_2);\r
+  /* Configure MEMS high pass filter cut-off level, interrupt and data selection bits */                     \r
+  ctrl |= (uint8_t)(LIS302DL_FilterConfigStruct->HighPassFilter_Data_Selection | \\r
+                    LIS302DL_FilterConfigStruct->HighPassFilter_CutOff_Frequency | \\r
+                    LIS302DL_FilterConfigStruct->HighPassFilter_Interrupt);\r
+  \r
+  /* Write value to MEMS CTRL_REG2 register */\r
+  LIS302DL_Write(&ctrl, LIS302DL_CTRL_REG2_ADDR, 1);\r
+}\r
+\r
+/**\r
+  * @brief Set LIS302DL Interrupt configuration\r
+  * @param  LIS302DL_InterruptConfig_TypeDef: pointer to a LIS302DL_InterruptConfig_TypeDef \r
+  *         structure that contains the configuration setting for the LIS302DL Interrupt.\r
+  * @retval None\r
+  */\r
+void LIS302DL_InterruptConfig(LIS302DL_InterruptConfigTypeDef *LIS302DL_IntConfigStruct)\r
+{\r
+  uint8_t ctrl = 0x00;\r
+  \r
+  /* Read CLICK_CFG register */\r
+  LIS302DL_Read(&ctrl, LIS302DL_CLICK_CFG_REG_ADDR, 1);\r
+  \r
+  /* Configure latch Interrupt request, click interrupts and double click interrupts */                   \r
+  ctrl = (uint8_t)(LIS302DL_IntConfigStruct->Latch_Request| \\r
+                   LIS302DL_IntConfigStruct->SingleClick_Axes | \\r
+                   LIS302DL_IntConfigStruct->DoubleClick_Axes);\r
+  \r
+  /* Write value to MEMS CLICK_CFG register */\r
+  LIS302DL_Write(&ctrl, LIS302DL_CLICK_CFG_REG_ADDR, 1);\r
+}\r
+\r
+/**\r
+  * @brief  Change the lowpower mode for LIS302DL\r
+  * @param  LowPowerMode: new state for the lowpower mode.\r
+  *   This parameter can be one of the following values:\r
+  *     @arg LIS302DL_LOWPOWERMODE_POWERDOWN: Power down mode\r
+  *     @arg LIS302DL_LOWPOWERMODE_ACTIVE: Active mode  \r
+  * @retval None\r
+  */\r
+void LIS302DL_LowpowerCmd(uint8_t LowPowerMode)\r
+{\r
+  uint8_t tmpreg;\r
+  \r
+  /* Read CTRL_REG1 register */\r
+  LIS302DL_Read(&tmpreg, LIS302DL_CTRL_REG1_ADDR, 1);\r
+  \r
+  /* Set new low power mode configuration */\r
+  tmpreg &= (uint8_t)~LIS302DL_LOWPOWERMODE_ACTIVE;\r
+  tmpreg |= LowPowerMode;\r
+  \r
+  /* Write value to MEMS CTRL_REG1 regsister */\r
+  LIS302DL_Write(&tmpreg, LIS302DL_CTRL_REG1_ADDR, 1);\r
+}\r
+\r
+/**\r
+  * @brief  Data Rate command \r
+  * @param  DataRateValue: Data rate value\r
+  *   This parameter can be one of the following values:\r
+  *     @arg LIS302DL_DATARATE_100: 100 Hz output data rate \r
+  *     @arg LIS302DL_DATARATE_400: 400 Hz output data rate    \r
+  * @retval None\r
+  */\r
+void LIS302DL_DataRateCmd(uint8_t DataRateValue)\r
+{\r
+  uint8_t tmpreg;\r
+  \r
+  /* Read CTRL_REG1 register */\r
+  LIS302DL_Read(&tmpreg, LIS302DL_CTRL_REG1_ADDR, 1);\r
+  \r
+  /* Set new Data rate configuration */\r
+  tmpreg &= (uint8_t)~LIS302DL_DATARATE_400;\r
+  tmpreg |= DataRateValue;\r
+  \r
+  /* Write value to MEMS CTRL_REG1 regsister */\r
+  LIS302DL_Write(&tmpreg, LIS302DL_CTRL_REG1_ADDR, 1);\r
+}\r
+\r
+/**\r
+  * @brief  Change the Full Scale of LIS302DL\r
+  * @param  FS_value: new full scale value. \r
+  *   This parameter can be one of the following values:\r
+  *     @arg LIS302DL_FULLSCALE_2_3: +-2.3g\r
+  *     @arg LIS302DL_FULLSCALE_9_2: +-9.2g   \r
+  * @retval None\r
+  */\r
+void LIS302DL_FullScaleCmd(uint8_t FS_value)\r
+{\r
+  uint8_t tmpreg;\r
+  \r
+  /* Read CTRL_REG1 register */\r
+  LIS302DL_Read(&tmpreg, LIS302DL_CTRL_REG1_ADDR, 1);\r
+  \r
+  /* Set new full scale configuration */\r
+  tmpreg &= (uint8_t)~LIS302DL_FULLSCALE_9_2;\r
+  tmpreg |= FS_value;\r
+  \r
+  /* Write value to MEMS CTRL_REG1 regsister */\r
+  LIS302DL_Write(&tmpreg, LIS302DL_CTRL_REG1_ADDR, 1);\r
+}\r
+\r
+/**\r
+  * @brief  Reboot memory content of LIS302DL\r
+  * @param  None\r
+  * @retval None\r
+  */\r
+void LIS302DL_RebootCmd(void)\r
+{\r
+  uint8_t tmpreg;\r
+  /* Read CTRL_REG2 register */\r
+  LIS302DL_Read(&tmpreg, LIS302DL_CTRL_REG2_ADDR, 1);\r
+  \r
+  /* Enable or Disable the reboot memory */\r
+  tmpreg |= LIS302DL_BOOT_REBOOTMEMORY;\r
+  \r
+  /* Write value to MEMS CTRL_REG2 regsister */\r
+  LIS302DL_Write(&tmpreg, LIS302DL_CTRL_REG2_ADDR, 1);\r
+}\r
+\r
+/**\r
+  * @brief  Writes one byte to the LIS302DL.\r
+  * @param  pBuffer : pointer to the buffer  containing the data to be written to the LIS302DL.\r
+  * @param  WriteAddr : LIS302DL's internal address to write to.\r
+  * @param  NumByteToWrite: Number of bytes to write.\r
+  * @retval None\r
+  */\r
+void LIS302DL_Write(uint8_t* pBuffer, uint8_t WriteAddr, uint16_t NumByteToWrite)\r
+{\r
+  /* Configure the MS bit: \r
+       - When 0, the address will remain unchanged in multiple read/write commands.\r
+       - When 1, the address will be auto incremented in multiple read/write commands.\r
+  */\r
+  if(NumByteToWrite > 0x01)\r
+  {\r
+    WriteAddr |= (uint8_t)MULTIPLEBYTE_CMD;\r
+  }\r
+  /* Set chip select Low at the start of the transmission */\r
+  LIS302DL_CS_LOW();\r
+  \r
+  /* Send the Address of the indexed register */\r
+  LIS302DL_SendByte(WriteAddr);\r
+  /* Send the data that will be written into the device (MSB First) */\r
+  while(NumByteToWrite >= 0x01)\r
+  {\r
+    LIS302DL_SendByte(*pBuffer);\r
+    NumByteToWrite--;\r
+    pBuffer++;\r
+  }\r
+  \r
+  /* Set chip select High at the end of the transmission */ \r
+  LIS302DL_CS_HIGH();\r
+}\r
+\r
+/**\r
+  * @brief  Reads a block of data from the LIS302DL.\r
+  * @param  pBuffer : pointer to the buffer that receives the data read from the LIS302DL.\r
+  * @param  ReadAddr : LIS302DL's internal address to read from.\r
+  * @param  NumByteToRead : number of bytes to read from the LIS302DL.\r
+  * @retval None\r
+  */\r
+void LIS302DL_Read(uint8_t* pBuffer, uint8_t ReadAddr, uint16_t NumByteToRead)\r
+{  \r
+  if(NumByteToRead > 0x01)\r
+  {\r
+    ReadAddr |= (uint8_t)(READWRITE_CMD | MULTIPLEBYTE_CMD);\r
+  }\r
+  else\r
+  {\r
+    ReadAddr |= (uint8_t)READWRITE_CMD;\r
+  }\r
+  /* Set chip select Low at the start of the transmission */\r
+  LIS302DL_CS_LOW();\r
+  \r
+  /* Send the Address of the indexed register */\r
+  LIS302DL_SendByte(ReadAddr);\r
+  \r
+  /* Receive the data that will be read from the device (MSB First) */\r
+  while(NumByteToRead > 0x00)\r
+  {\r
+    /* Send dummy byte (0x00) to generate the SPI clock to LIS302DL (Slave device) */\r
+    *pBuffer = LIS302DL_SendByte(DUMMY_BYTE);\r
+    NumByteToRead--;\r
+    pBuffer++;\r
+  }\r
+  \r
+  /* Set chip select High at the end of the transmission */ \r
+  LIS302DL_CS_HIGH();\r
+}\r
+\r
+/**\r
+  * @brief  Read LIS302DL output register, and calculate the acceleration \r
+  *         ACC[mg]=SENSITIVITY* (out_h*256+out_l)/16 (12 bit rappresentation)\r
+  * @param  s16 buffer to store data\r
+  * @retval None\r
+  */\r
+void LIS302DL_ReadACC(int32_t* out)\r
+{\r
+  uint8_t buffer[6];\r
+  uint8_t crtl, i = 0x00;\r
+   \r
+  LIS302DL_Read(&crtl, LIS302DL_CTRL_REG1_ADDR, 1);  \r
+  LIS302DL_Read(buffer, LIS302DL_OUT_X_ADDR, 6);\r
+  \r
+  switch(crtl & 0x20) \r
+    {\r
+    /* FS bit = 0 ==> Sensitivity typical value = 18milligals/digit*/ \r
+    case 0x00:\r
+      for(i=0; i<0x03; i++)\r
+      {\r
+        *out =(int32_t)(LIS302DL_SENSITIVITY_2_3G *  (int8_t)buffer[2*i]);\r
+        out++;\r
+      }\r
+      break;\r
+    /* FS bit = 1 ==> Sensitivity typical value = 72milligals/digit*/ \r
+    case 0x20:\r
+      for(i=0; i<0x03; i++)\r
+      {\r
+        *out =(int32_t)(LIS302DL_SENSITIVITY_9_2G * (int8_t)buffer[2*i]);\r
+        out++;\r
+      }         \r
+      break;\r
+    default:\r
+      break;\r
+    }\r
+ }\r
+\r
+/**\r
+  * @brief  Initializes the low level interface used to drive the LIS302DL\r
+  * @param  None\r
+  * @retval None\r
+  */\r
+static void LIS302DL_LowLevel_Init(void)\r
+{\r
+  GPIO_InitTypeDef GPIO_InitStructure;\r
+  SPI_InitTypeDef  SPI_InitStructure;\r
+\r
+  /* Enable the SPI periph */\r
+  RCC_APB2PeriphClockCmd(LIS302DL_SPI_CLK, ENABLE);\r
+\r
+  /* Enable SCK, MOSI and MISO GPIO clocks */\r
+  RCC_AHB1PeriphClockCmd(LIS302DL_SPI_SCK_GPIO_CLK | LIS302DL_SPI_MISO_GPIO_CLK | LIS302DL_SPI_MOSI_GPIO_CLK, ENABLE);\r
+\r
+  /* Enable CS  GPIO clock */\r
+  RCC_AHB1PeriphClockCmd(LIS302DL_SPI_CS_GPIO_CLK, ENABLE);\r
+  \r
+  /* Enable INT1 GPIO clock */\r
+  RCC_AHB1PeriphClockCmd(LIS302DL_SPI_INT1_GPIO_CLK, ENABLE);\r
+  \r
+  /* Enable INT2 GPIO clock */\r
+  RCC_AHB1PeriphClockCmd(LIS302DL_SPI_INT2_GPIO_CLK, ENABLE);\r
+\r
+  GPIO_PinAFConfig(LIS302DL_SPI_SCK_GPIO_PORT, LIS302DL_SPI_SCK_SOURCE, LIS302DL_SPI_SCK_AF);\r
+  GPIO_PinAFConfig(LIS302DL_SPI_MISO_GPIO_PORT, LIS302DL_SPI_MISO_SOURCE, LIS302DL_SPI_MISO_AF);\r
+  GPIO_PinAFConfig(LIS302DL_SPI_MOSI_GPIO_PORT, LIS302DL_SPI_MOSI_SOURCE, LIS302DL_SPI_MOSI_AF);\r
+\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;\r
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+\r
+  /* SPI SCK pin configuration */\r
+  GPIO_InitStructure.GPIO_Pin = LIS302DL_SPI_SCK_PIN;\r
+  GPIO_Init(LIS302DL_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  /* SPI  MOSI pin configuration */\r
+  GPIO_InitStructure.GPIO_Pin =  LIS302DL_SPI_MOSI_PIN;\r
+  GPIO_Init(LIS302DL_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  /* SPI MISO pin configuration */\r
+  GPIO_InitStructure.GPIO_Pin = LIS302DL_SPI_MISO_PIN;\r
+  GPIO_Init(LIS302DL_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  /* SPI configuration -------------------------------------------------------*/\r
+  SPI_I2S_DeInit(LIS302DL_SPI);\r
+  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;\r
+  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;\r
+  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;\r
+  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;\r
+  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;\r
+  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;\r
+  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;\r
+  SPI_InitStructure.SPI_CRCPolynomial = 7;\r
+  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;\r
+  SPI_Init(LIS302DL_SPI, &SPI_InitStructure);\r
+\r
+  /* Enable SPI1  */\r
+  SPI_Cmd(LIS302DL_SPI, ENABLE);\r
+\r
+  /* Configure GPIO PIN for Lis Chip select */\r
+  GPIO_InitStructure.GPIO_Pin = LIS302DL_SPI_CS_PIN;\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;\r
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+  GPIO_Init(LIS302DL_SPI_CS_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  /* Deselect : Chip Select high */\r
+  GPIO_SetBits(LIS302DL_SPI_CS_GPIO_PORT, LIS302DL_SPI_CS_PIN);\r
+  \r
+  /* Configure GPIO PINs to detect Interrupts */\r
+  GPIO_InitStructure.GPIO_Pin = LIS302DL_SPI_INT1_PIN;\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;\r
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;\r
+  GPIO_Init(LIS302DL_SPI_INT1_GPIO_PORT, &GPIO_InitStructure);\r
+  \r
+  GPIO_InitStructure.GPIO_Pin = LIS302DL_SPI_INT2_PIN;\r
+  GPIO_Init(LIS302DL_SPI_INT2_GPIO_PORT, &GPIO_InitStructure);\r
+}\r
+\r
+/**\r
+  * @brief  Sends a Byte through the SPI interface and return the Byte received \r
+  *         from the SPI bus.\r
+  * @param  Byte : Byte send.\r
+  * @retval The received byte value\r
+  */\r
+static uint8_t LIS302DL_SendByte(uint8_t byte)\r
+{\r
+  /* Loop while DR register in not emplty */\r
+  LIS302DLTimeout = LIS302DL_FLAG_TIMEOUT;\r
+  while (SPI_I2S_GetFlagStatus(LIS302DL_SPI, SPI_I2S_FLAG_TXE) == RESET)\r
+  {\r
+    if((LIS302DLTimeout--) == 0) return LIS302DL_TIMEOUT_UserCallback();\r
+  }\r
+  \r
+  /* Send a Byte through the SPI peripheral */\r
+  SPI_I2S_SendData(LIS302DL_SPI, byte);\r
+  \r
+  /* Wait to receive a Byte */\r
+  LIS302DLTimeout = LIS302DL_FLAG_TIMEOUT;\r
+  while (SPI_I2S_GetFlagStatus(LIS302DL_SPI, SPI_I2S_FLAG_RXNE) == RESET)\r
+  {\r
+    if((LIS302DLTimeout--) == 0) return LIS302DL_TIMEOUT_UserCallback();\r
+  }\r
+  \r
+  /* Return the Byte read from the SPI bus */\r
+  return (uint8_t)SPI_I2S_ReceiveData(LIS302DL_SPI);\r
+}\r
+\r
+#ifdef USE_DEFAULT_TIMEOUT_CALLBACK\r
+/**\r
+  * @brief  Basic management of the timeout situation.\r
+  * @param  None.\r
+  * @retval None.\r
+  */\r
+uint32_t LIS302DL_TIMEOUT_UserCallback(void)\r
+{\r
+  /* Block communication and all processes */\r
+  while (1)\r
+  {   \r
+  }\r
+}\r
+#endif /* USE_DEFAULT_TIMEOUT_CALLBACK */\r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */ \r
+  \r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */ \r
+  \r
+\r
+/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/\r
diff --git a/lib/stm32f4_discovery_lis302dl.h b/lib/stm32f4_discovery_lis302dl.h
new file mode 100755 (executable)
index 0000000..e73a241
--- /dev/null
@@ -0,0 +1,772 @@
+/**\r
+  ******************************************************************************\r
+  * @file    stm32f4_discovery_lis302dl.h\r
+  * @author  MCD Application Team\r
+  * @version V1.1.0\r
+  * @date    28-October-2011\r
+  * @brief   This file contains all the functions prototypes for the stm32f4_discovery_lis302dl.c\r
+  *          firmware driver.\r
+  ******************************************************************************\r
+  * @attention\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
+  * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>\r
+  ******************************************************************************  \r
+  */ \r
+\r
+/* Define to prevent recursive inclusion -------------------------------------*/\r
+#ifndef __STM32F4_DISCOVERY_LIS302DL_H\r
+#define __STM32F4_DISCOVERY_LIS302DL_H\r
+\r
+#ifdef __cplusplus\r
+ extern "C" {\r
+#endif\r
+\r
+/* Includes ------------------------------------------------------------------*/\r
+ #include "stm32f4xx.h"\r
+\r
+/** @addtogroup Utilities\r
+  * @{\r
+  */\r
+  \r
+/** @addtogroup STM32F4_DISCOVERY\r
+  * @{\r
+  */ \r
+\r
+/** @addtogroup STM32F4_DISCOVERY_LIS302DL\r
+  * @{\r
+  */\r
+  \r
+\r
+/** @defgroup STM32F4_DISCOVERY_LIS302DL_Exported_Types\r
+  * @{\r
+  */\r
+   \r
+/* LIS302DL struct */\r
+typedef struct\r
+{\r
+  uint8_t Power_Mode;                         /* Power-down/Active Mode */\r
+  uint8_t Output_DataRate;                    /* OUT data rate 100 Hz / 400 Hz */\r
+  uint8_t Axes_Enable;                        /* Axes enable */\r
+  uint8_t Full_Scale;                         /* Full scale */\r
+  uint8_t Self_Test;                          /* Self test */\r
+}LIS302DL_InitTypeDef;\r
+\r
+/* LIS302DL High Pass Filter struct */\r
+typedef struct\r
+{\r
+  uint8_t HighPassFilter_Data_Selection;      /* Internal filter bypassed or data from internal filter send to output register*/\r
+  uint8_t HighPassFilter_CutOff_Frequency;    /* High pass filter cut-off frequency */\r
+  uint8_t HighPassFilter_Interrupt;           /* High pass filter enabled for Freefall/WakeUp #1 or #2 */ \r
+}LIS302DL_FilterConfigTypeDef;  \r
+\r
+/* LIS302DL Interrupt struct */\r
+typedef struct\r
+{\r
+  uint8_t Latch_Request;                      /* Latch interrupt request into CLICK_SRC register*/\r
+  uint8_t SingleClick_Axes;                   /* Single Click Axes Interrupts */\r
+  uint8_t DoubleClick_Axes;                   /* Double Click Axes Interrupts */ \r
+}LIS302DL_InterruptConfigTypeDef;  \r
+\r
+/**\r
+  * @}\r
+  */\r
+  \r
+/** @defgroup STM32F4_DISCOVERY_LIS302DL_Exported_Constants\r
+  * @{\r
+  */\r
+\r
+/* Uncomment the following line to use the default LIS302DL_TIMEOUT_UserCallback() \r
+   function implemented in stm32f4_discovery_lis302dl.c file.\r
+   LIS302DL_TIMEOUT_UserCallback() function is called whenever a timeout condition \r
+   occure during communication (waiting transmit data register empty flag(TXE)\r
+   or waiting receive data register is not empty flag (RXNE)). */   \r
+#define USE_DEFAULT_TIMEOUT_CALLBACK\r
+\r
+/* Maximum Timeout values for flags waiting loops. These timeouts are not based\r
+   on accurate values, they just guarantee that the application will not remain\r
+   stuck if the SPI communication is corrupted.\r
+   You may modify these timeout values depending on CPU frequency and application\r
+   conditions (interrupts routines ...). */   \r
+#define LIS302DL_FLAG_TIMEOUT         ((uint32_t)0x1000)\r
+\r
+/**\r
+  * @brief  LIS302DL SPI Interface pins\r
+  */\r
+#define LIS302DL_SPI                       SPI1\r
+#define LIS302DL_SPI_CLK                   RCC_APB2Periph_SPI1\r
+\r
+#define LIS302DL_SPI_SCK_PIN               GPIO_Pin_5                  /* PA.05 */\r
+#define LIS302DL_SPI_SCK_GPIO_PORT         GPIOA                       /* GPIOA */\r
+#define LIS302DL_SPI_SCK_GPIO_CLK          RCC_AHB1Periph_GPIOA\r
+#define LIS302DL_SPI_SCK_SOURCE            GPIO_PinSource5\r
+#define LIS302DL_SPI_SCK_AF                GPIO_AF_SPI1\r
+\r
+#define LIS302DL_SPI_MISO_PIN              GPIO_Pin_6                  /* PA.6 */\r
+#define LIS302DL_SPI_MISO_GPIO_PORT        GPIOA                       /* GPIOA */\r
+#define LIS302DL_SPI_MISO_GPIO_CLK         RCC_AHB1Periph_GPIOA\r
+#define LIS302DL_SPI_MISO_SOURCE           GPIO_PinSource6\r
+#define LIS302DL_SPI_MISO_AF               GPIO_AF_SPI1\r
+\r
+#define LIS302DL_SPI_MOSI_PIN              GPIO_Pin_7                  /* PA.7 */\r
+#define LIS302DL_SPI_MOSI_GPIO_PORT        GPIOA                       /* GPIOA */\r
+#define LIS302DL_SPI_MOSI_GPIO_CLK         RCC_AHB1Periph_GPIOA\r
+#define LIS302DL_SPI_MOSI_SOURCE           GPIO_PinSource7\r
+#define LIS302DL_SPI_MOSI_AF               GPIO_AF_SPI1\r
+\r
+#define LIS302DL_SPI_CS_PIN                GPIO_Pin_3                  /* PE.03 */\r
+#define LIS302DL_SPI_CS_GPIO_PORT          GPIOE                       /* GPIOE */\r
+#define LIS302DL_SPI_CS_GPIO_CLK           RCC_AHB1Periph_GPIOE\r
+\r
+#define LIS302DL_SPI_INT1_PIN              GPIO_Pin_0                  /* PE.00 */\r
+#define LIS302DL_SPI_INT1_GPIO_PORT        GPIOE                       /* GPIOE */\r
+#define LIS302DL_SPI_INT1_GPIO_CLK         RCC_AHB1Periph_GPIOE\r
+#define LIS302DL_SPI_INT1_EXTI_LINE        EXTI_Line0\r
+#define LIS302DL_SPI_INT1_EXTI_PORT_SOURCE EXTI_PortSourceGPIOE\r
+#define LIS302DL_SPI_INT1_EXTI_PIN_SOURCE  EXTI_PinSource0\r
+#define LIS302DL_SPI_INT1_EXTI_IRQn        EXTI0_IRQn \r
+\r
+#define LIS302DL_SPI_INT2_PIN              GPIO_Pin_1                  /* PE.01 */\r
+#define LIS302DL_SPI_INT2_GPIO_PORT        GPIOE                       /* GPIOE */\r
+#define LIS302DL_SPI_INT2_GPIO_CLK         RCC_AHB1Periph_GPIOE\r
+#define LIS302DL_SPI_INT2_EXTI_LINE        EXTI_Line1\r
+#define LIS302DL_SPI_INT2_EXTI_PORT_SOURCE EXTI_PortSourceGPIOE\r
+#define LIS302DL_SPI_INT2_EXTI_PIN_SOURCE  EXTI_PinSource1\r
+#define LIS302DL_SPI_INT2_EXTI_IRQn        EXTI1_IRQn \r
+\r
+\r
+/******************************************************************************/\r
+/*************************** START REGISTER MAPPING  **************************/\r
+/******************************************************************************/\r
+\r
+/*******************************************************************************\r
+*  WHO_AM_I Register: Device Identification Register\r
+*  Read only register\r
+*  Default value: 0x3B\r
+*******************************************************************************/\r
+#define LIS302DL_WHO_AM_I_ADDR                  0x0F\r
+\r
+/*******************************************************************************\r
+*  CTRL_REG1 Register: Control Register 1\r
+*  Read Write register\r
+*  Default value: 0x07\r
+*  7 DR: Data Rate selection.\r
+*        0 - 100 Hz output data rate\r
+*        1 - 400 Hz output data rate\r
+*  6 PD: Power Down control.\r
+*        0 - power down mode\r
+*        1 - active mode\r
+*  5 FS: Full Scale selection.\r
+*        0 - Typical measurement range 2.3\r
+*        1 - Typical measurement range 9.2\r
+*  4:3 STP-STM Self Test Enable:\r
+*              STP |  STM |   mode\r
+*            ----------------------------\r
+*               0  |  0   |   Normal mode\r
+*               0  |  1   |   Self Test M\r
+*               1  |  0   |   Self Test P\r
+*  2 Zen: Z axis enable.\r
+*         0 - Z axis disabled\r
+*         1- Z axis enabled\r
+*  1 Yen: Y axis enable.\r
+*         0 - Y axis disabled\r
+*         1- Y axis enabled\r
+*  0 Xen: X axis enable.\r
+*         0 - X axis disabled\r
+*         1- X axis enabled\r
+********************************************************************************/\r
+#define LIS302DL_CTRL_REG1_ADDR                 0x20\r
+\r
+/*******************************************************************************\r
+*  CTRL_REG2 Regsiter: Control Register 2\r
+*  Read Write register\r
+*  Default value: 0x00\r
+*  7 SIM: SPI Serial Interface Mode Selection. \r
+*         0 - 4 wire interface\r
+*         1 - 3 wire interface\r
+*  6 BOOT: Reboot memory content\r
+*          0 - normal mode \r
+*          1 - reboot memory content\r
+*  5 Reserved\r
+*  4 FDS: Filtered data selection.\r
+*         0 - internal filter bypassed\r
+*         1 - data from internal filter sent to output register\r
+*  3 HP FF_WU2: High pass filter enabled for FreeFall/WakeUp#2.\r
+*               0 - filter bypassed\r
+*               1 - filter enabled\r
+*  2 HP FF_WU1: High pass filter enabled for FreeFall/WakeUp#1.\r
+*               0 - filter bypassed\r
+*               1 - filter enabled\r
+*  1:0 HP coeff2-HP coeff1 High pass filter cut-off frequency (ft) configuration.\r
+*                 ft= ODR[hz]/6*HP coeff\r
+*            HP coeff2 | HP coeff1 |   HP coeff\r
+*            -------------------------------------------\r
+*                 0     |     0     |   8\r
+*                 0     |     1     |   16\r
+*                 1     |     0     |   32\r
+*                 1     |     1     |   64\r
+*            HP coeff |  ft[hz]   |  ft[hz]   |\r
+*                     |ODR 100Hz | ODR 400Hz  |\r
+*            --------------------------------------------\r
+*              00     |    2      |     8     |\r
+*              01     |    1      |     4     |\r
+*              10     |    0.5    |     2     |\r
+*              11     |    0.25   |     1     |\r
+*******************************************************************************/\r
+#define LIS302DL_CTRL_REG2_ADDR              0x21\r
+\r
+/*******************************************************************************\r
+*  CTRL_REG3 Register: Interrupt Control Register\r
+*  Read Write register\r
+*  Default value: 0x00\r
+*  7 IHL active: Interrupt active high/low.\r
+*                0 - active high\r
+*                1 - active low\r
+*  6 PP_OD: push-pull/open-drain.\r
+*           0 - push-pull\r
+*           1 - open-drain\r
+*  5:3 I2_CFG2 - I2_CFG0 Data signal on INT2 pad control bits\r
+*  2:0 I1_CFG2 - I1_CFG0 Data signal on INT1 pad control bits\r
+*        I1(2)_CFG2  |  I1(2)_CFG1  |  I1(2)_CFG0  | INT1(2) Pad\r
+*        ----------------------------------------------------------\r
+*              0     |      0       |       0      | GND\r
+*              0     |      0       |       1      | FreeFall/WakeUp#1\r
+*              0     |      1       |       0      | FreeFall/WakeUp#2\r
+*              0     |      1       |       1      | FreeFall/WakeUp#1 or FreeFall/WakeUp#2\r
+*              1     |      0       |       0      | Data ready\r
+*              1     |      1       |       1      | Click interrupt\r
+*******************************************************************************/\r
+#define LIS302DL_CTRL_REG3_ADDR              0x22\r
+\r
+/*******************************************************************************\r
+*  HP_FILTER_RESET Register: Dummy register. Reading at this address zeroes \r
+*  instantaneously the content of the internal high pass filter. If the high pass\r
+*  filter is enabled all three axes are instantaneously set to 0g.\r
+*  This allows to overcome the settling time of the high pass filter.\r
+*  Read only register\r
+*  Default value: Dummy\r
+*******************************************************************************/\r
+#define LIS302DL_HP_FILTER_RESET_REG_ADDR     0x23\r
+\r
+/*******************************************************************************\r
+*  STATUS_REG Register: Status Register\r
+*  Default value: 0x00\r
+*  7 ZYXOR: X, Y and Z axis data overrun.\r
+*           0: no overrun has occurred\r
+*           1: new data has overwritten the previous one before it was read\r
+*  6 ZOR: Z axis data overrun.\r
+*         0: no overrun has occurred \r
+*         1: new data for Z-axis has overwritten the previous one before it was read\r
+*  5 yOR: y axis data overrun.\r
+*         0: no overrun has occurred\r
+*         1: new data for y-axis has overwritten the previous one before it was read\r
+*  4 XOR: X axis data overrun.\r
+*         0: no overrun has occurred\r
+*         1: new data for X-axis has overwritten the previous one before it was read\r
+*  3 ZYXDA: X, Y and Z axis new data available\r
+*           0: a new set of data is not yet available\r
+*           1: a new set of data is available\r
+*  2 ZDA: Z axis new data available.\r
+*         0: a new set of data is not yet available\r
+*         1: a new data for Z axis is available\r
+*  1 YDA: Y axis new data available\r
+*         0: a new set of data is not yet available\r
+*         1: a new data for Y axis is available\r
+*  0 XDA: X axis new data available\r
+*         0: a new set of data is not yet available\r
+*         1: a new data for X axis is available\r
+*******************************************************************************/\r
+#define LIS302DL_STATUS_REG_ADDR             0x27\r
+\r
+/*******************************************************************************\r
+*  OUT_X Register: X-axis output Data\r
+*  Read only register\r
+*  Default value: output\r
+*  7:0 XD7-XD0: X-axis output Data\r
+*******************************************************************************/\r
+#define LIS302DL_OUT_X_ADDR                  0x29\r
+\r
+/*******************************************************************************\r
+*  OUT_Y Register: Y-axis output Data\r
+*  Read only register\r
+*  Default value: output\r
+*  7:0 YD7-YD0: Y-axis output Data\r
+*******************************************************************************/\r
+#define LIS302DL_OUT_Y_ADDR                  0x2B\r
+\r
+/*******************************************************************************\r
+*  OUT_Z Register: Z-axis output Data\r
+*  Read only register\r
+*  Default value: output\r
+*  7:0 ZD7-ZD0: Z-axis output Data\r
+*******************************************************************************/\r
+#define LIS302DL_OUT_Z_ADDR                  0x2D\r
+\r
+/*******************************************************************************\r
+*  FF_WW_CFG_1 Register: Configuration register for Interrupt 1 source.\r
+*  Read write register\r
+*  Default value: 0x00\r
+*  7 AOI: AND/OR combination of Interrupt events. \r
+*         0: OR combination of interrupt events\r
+*         1: AND combination of interrupt events \r
+*  6 LIR: Latch/not latch interrupt request\r
+*         0: interrupt request not latched\r
+*         1: interrupt request latched\r
+*  5 ZHIE: Enable interrupt generation on Z high event.\r
+*          0: disable interrupt request\r
+*          1: enable interrupt request on measured accel. value higher than preset threshold\r
+*  4 ZLIE: Enable interrupt generation on Z low event.\r
+*          0: disable interrupt request\r
+*          1: enable interrupt request on measured accel. value lower than preset threshold\r
+*  3 YHIE: Enable interrupt generation on Y high event.\r
+*          0: disable interrupt request\r
+*          1: enable interrupt request on measured accel. value higher than preset threshold\r
+*  2 YLIE: Enable interrupt generation on Y low event. \r
+*          0: disable interrupt request\r
+*          1: enable interrupt request on measured accel. value lower than preset threshold\r
+*  1 XHIE: Enable interrupt generation on X high event.\r
+*          0: disable interrupt request\r
+*          1: enable interrupt request on measured accel. value higher than preset threshold\r
+*  0 XLIE: Enable interrupt generation on X low event.\r
+*          0: disable interrupt request\r
+*          1: enable interrupt request on measured accel. value lower than preset threshold\r
+*******************************************************************************/\r
+#define LIS302DL_FF_WU_CFG1_REG_ADDR         0x30\r
+\r
+/*******************************************************************************\r
+*  FF_WU_SRC_1 Register: Interrupt 1 source register.\r
+*  Reading at this address clears FF_WU_SRC_1 register and the FF, WU 1 interrupt\r
+*  and allow the refreshment of data in the FF_WU_SRC_1 register if the latched option\r
+*  was chosen.\r
+*  Read only register\r
+*  Default value: 0x00\r
+*  7 Reserved\r
+*  6 IA: Interrupt active.\r
+*        0: no interrupt has been generated\r
+*        1: one or more interrupts have been generated\r
+*  5 ZH: Z high. \r
+*        0: no interrupt\r
+*        1: ZH event has occurred \r
+*  4 ZL: Z low.\r
+*        0: no interrupt\r
+*        1: ZL event has occurred\r
+*  3 YH: Y high.\r
+*        0: no interrupt\r
+*        1: YH event has occurred \r
+*  2 YL: Y low.\r
+*        0: no interrupt\r
+*        1: YL event has occurred\r
+*  1 YH: X high.\r
+*        0: no interrupt\r
+*        1: XH event has occurred \r
+*  0 YL: X low.\r
+*        0: no interrupt\r
+*        1: XL event has occurred\r
+*******************************************************************************/\r
+#define LIS302DL_FF_WU_SRC1_REG_ADDR           0x31\r
+\r
+/*******************************************************************************\r
+*  FF_WU_THS_1 Register: Threshold register\r
+*  Read Write register\r
+*  Default value: 0x00\r
+*  7 DCRM: Reset mode selection.\r
+*          0 - counter resetted\r
+*          1 - counter decremented\r
+*  6 THS6-THS0: Free-fall/wake-up threshold value.\r
+*******************************************************************************/\r
+#define LIS302DL_FF_WU_THS1_REG_ADDR          0x32\r
+\r
+/*******************************************************************************\r
+*  FF_WU_DURATION_1 Register: duration Register\r
+*  Read Write register\r
+*  Default value: 0x00\r
+*  7:0 D7-D0 Duration value. (Duration steps and maximum values depend on the ODR chosen)\r
+ ******************************************************************************/\r
+#define LIS302DL_FF_WU_DURATION1_REG_ADDR     0x33\r
+\r
+/*******************************************************************************\r
+*  FF_WW_CFG_2 Register: Configuration register for Interrupt 2 source.\r
+*  Read write register\r
+*  Default value: 0x00\r
+*  7 AOI: AND/OR combination of Interrupt events. \r
+*         0: OR combination of interrupt events\r
+*         1: AND combination of interrupt events \r
+*  6 LIR: Latch/not latch interrupt request\r
+*         0: interrupt request not latched\r
+*         1: interrupt request latched\r
+*  5 ZHIE: Enable interrupt generation on Z high event.\r
+*          0: disable interrupt request\r
+*          1: enable interrupt request on measured accel. value higher than preset threshold\r
+*  4 ZLIE: Enable interrupt generation on Z low event.\r
+*          0: disable interrupt request\r
+*          1: enable interrupt request on measured accel. value lower than preset threshold\r
+*  3 YHIE: Enable interrupt generation on Y high event.\r
+*          0: disable interrupt request\r
+*          1: enable interrupt request on measured accel. value higher than preset threshold\r
+*  2 YLIE: Enable interrupt generation on Y low event. \r
+*          0: disable interrupt request\r
+*          1: enable interrupt request on measured accel. value lower than preset threshold\r
+*  1 XHIE: Enable interrupt generation on X high event.\r
+*          0: disable interrupt request\r
+*          1: enable interrupt request on measured accel. value higher than preset threshold\r
+*  0 XLIE: Enable interrupt generation on X low event.\r
+*          0: disable interrupt request\r
+*          1: enable interrupt request on measured accel. value lower than preset threshold\r
+*******************************************************************************/\r
+#define LIS302DL_FF_WU_CFG2_REG_ADDR         0x34\r
+\r
+/*******************************************************************************\r
+*  FF_WU_SRC_2 Register: Interrupt 2 source register.\r
+*  Reading at this address clears FF_WU_SRC_2 register and the FF, WU 2 interrupt\r
+*  and allow the refreshment of data in the FF_WU_SRC_2 register if the latched option\r
+*  was chosen.\r
+*  Read only register\r
+*  Default value: 0x00\r
+*  7 Reserved\r
+*  6 IA: Interrupt active.\r
+*        0: no interrupt has been generated\r
+*        1: one or more interrupts have been generated\r
+*  5 ZH: Z high. \r
+*        0: no interrupt\r
+*        1: ZH event has occurred \r
+*  4 ZL: Z low.\r
+*        0: no interrupt\r
+*        1: ZL event has occurred\r
+*  3 YH: Y high.\r
+*        0: no interrupt\r
+*        1: YH event has occurred \r
+*  2 YL: Y low.\r
+*        0: no interrupt\r
+*        1: YL event has occurred\r
+*  1 YH: X high.\r
+*        0: no interrupt\r
+*        1: XH event has occurred \r
+*  0 YL: X low.\r
+*        0: no interrupt\r
+*        1: XL event has occurred\r
+*******************************************************************************/\r
+#define LIS302DL_FF_WU_SRC2_REG_ADDR           0x35\r
+\r
+/*******************************************************************************\r
+*  FF_WU_THS_2 Register: Threshold register\r
+*  Read Write register\r
+*  Default value: 0x00\r
+*  7 DCRM: Reset mode selection.\r
+*          0 - counter resetted\r
+*          1 - counter decremented\r
+*  6 THS6-THS0: Free-fall/wake-up threshold value.\r
+*******************************************************************************/\r
+#define LIS302DL_FF_WU_THS2_REG_ADDR          0x36\r
+\r
+/*******************************************************************************\r
+*  FF_WU_DURATION_2 Register: duration Register\r
+*  Read Write register\r
+*  Default value: 0x00\r
+*  7:0 D7-D0 Duration value. (Duration steps and maximum values depend on the ODR chosen)\r
+ ******************************************************************************/\r
+#define LIS302DL_FF_WU_DURATION2_REG_ADDR     0x37\r
+\r
+/******************************************************************************\r
+*  CLICK_CFG Register: click Register\r
+*  Read Write register\r
+*  Default value: 0x00\r
+*  7 Reserved\r
+*  6 LIR: Latch Interrupt request.\r
+*         0: interrupt request not latched\r
+*         1: interrupt request latched\r
+*  5 Double_Z: Enable interrupt generation on double click event on Z axis.\r
+*              0: disable interrupt request\r
+*              1: enable interrupt request\r
+*  4 Single_Z: Enable interrupt generation on single click event on Z axis.\r
+*              0: disable interrupt request\r
+*              1: enable interrupt request\r
+*  3 Double_Y: Enable interrupt generation on double click event on Y axis.\r
+*              0: disable interrupt request\r
+*              1: enable interrupt request\r
+*  2 Single_Y: Enable interrupt generation on single click event on Y axis.\r
+*              0: disable interrupt request\r
+*              1: enable interrupt request\r
+*  1 Double_X: Enable interrupt generation on double click event on X axis.\r
+*              0: disable interrupt request\r
+*              1: enable interrupt request\r
+*  0 Single_y: Enable interrupt generation on single click event on X axis.\r
+*              0: disable interrupt request\r
+*              1: enable interrupt request\r
+ ******************************************************************************/\r
+#define LIS302DL_CLICK_CFG_REG_ADDR     0x38\r
+\r
+/******************************************************************************\r
+*  CLICK_SRC Register: click status Register\r
+*  Read only register\r
+*  Default value: 0x00\r
+*  7 Reserved\r
+*  6 IA: Interrupt active.\r
+*        0: no interrupt has been generated\r
+*        1: one or more interrupts have been generated\r
+*  5 Double_Z: Double click on Z axis event.\r
+*        0: no interrupt\r
+*        1: Double Z event has occurred \r
+*  4 Single_Z: Z low.\r
+*        0: no interrupt\r
+*        1: Single Z event has occurred \r
+*  3 Double_Y: Y high.\r
+*        0: no interrupt\r
+*        1: Double Y event has occurred \r
+*  2 Single_Y: Y low.\r
+*        0: no interrupt\r
+*        1: Single Y event has occurred \r
+*  1 Double_X: X high.\r
+*        0: no interrupt\r
+*        1: Double X event has occurred \r
+*  0 Single_X: X low.\r
+*        0: no interrupt\r
+*        1: Single X event has occurred \r
+*******************************************************************************/\r
+#define LIS302DL_CLICK_SRC_REG_ADDR        0x39\r
+\r
+/*******************************************************************************\r
+*  CLICK_THSY_X Register: Click threshold Y and X register\r
+*  Read Write register\r
+*  Default value: 0x00\r
+*  7:4 THSy3-THSy0: Click threshold on Y axis, step 0.5g\r
+*  3:0 THSx3-THSx0: Click threshold on X axis, step 0.5g\r
+*******************************************************************************/\r
+#define LIS302DL_CLICK_THSY_X_REG_ADDR        0x3B\r
+\r
+/*******************************************************************************\r
+*  CLICK_THSZ Register: Click threshold Z register\r
+*  Read Write register\r
+*  Default value: 0x00\r
+*  7:4 Reserved\r
+*  3:0 THSz3-THSz0: Click threshold on Z axis, step 0.5g\r
+*******************************************************************************/\r
+#define LIS302DL_CLICK_THSZ_REG_ADDR         0x3C\r
+\r
+/*******************************************************************************\r
+*  CLICK_TimeLimit Register: Time Limit register\r
+*  Read Write register\r
+*  Default value: 0x00\r
+*  7:0 Dur7-Dur0: Time Limit value, step 0.5g\r
+*******************************************************************************/\r
+#define LIS302DL_CLICK_TIMELIMIT_REG_ADDR        0x3D\r
+\r
+/*******************************************************************************\r
+*  CLICK_Latency Register: Latency register\r
+*  Read Write register\r
+*  Default value: 0x00\r
+*  7:0 Lat7-Lat0: Latency value, step 1msec\r
+*******************************************************************************/\r
+#define LIS302DL_CLICK_LATENCY_REG_ADDR        0x3E\r
+\r
+/*******************************************************************************\r
+*  CLICK_Window Register: Window register\r
+*  Read Write register\r
+*  Default value: 0x00\r
+*  7:0 Win7-Win0: Window value, step 1msec\r
+*******************************************************************************/\r
+#define LIS302DL_CLICK_WINDOW_REG_ADDR        0x3F\r
+\r
+/******************************************************************************/\r
+/**************************** END REGISTER MAPPING  ***************************/\r
+/******************************************************************************/\r
+\r
+#define LIS302DL_SENSITIVITY_2_3G                         18  /* 18 mg/digit*/\r
+#define LIS302DL_SENSITIVITY_9_2G                         72  /* 72 mg/digit*/\r
+\r
+/** @defgroup Data_Rate_selection                 \r
+  * @{\r
+  */\r
+#define LIS302DL_DATARATE_100                             ((uint8_t)0x00)\r
+#define LIS302DL_DATARATE_400                             ((uint8_t)0x80)\r
+/**\r
+  * @}\r
+  */\r
+  \r
+/** @defgroup Power_Mode_selection \r
+  * @{\r
+  */\r
+#define LIS302DL_LOWPOWERMODE_POWERDOWN                   ((uint8_t)0x00)\r
+#define LIS302DL_LOWPOWERMODE_ACTIVE                      ((uint8_t)0x40)\r
+/**\r
+  * @}\r
+  */\r
+  \r
+/** @defgroup Full_Scale_selection \r
+  * @{\r
+  */\r
+#define LIS302DL_FULLSCALE_2_3                            ((uint8_t)0x00)\r
+#define LIS302DL_FULLSCALE_9_2                            ((uint8_t)0x20)\r
+/**\r
+  * @}\r
+  */\r
+  \r
+/** @defgroup Self_Test_selection \r
+  * @{\r
+  */\r
+#define LIS302DL_SELFTEST_NORMAL                          ((uint8_t)0x00)\r
+#define LIS302DL_SELFTEST_P                               ((uint8_t)0x10)\r
+#define LIS302DL_SELFTEST_M                               ((uint8_t)0x08)\r
+/**\r
+  * @}\r
+  */  \r
+\r
+/** @defgroup Direction_XYZ_selection \r
+  * @{\r
+  */\r
+#define LIS302DL_X_ENABLE                                 ((uint8_t)0x01)\r
+#define LIS302DL_Y_ENABLE                                 ((uint8_t)0x02)\r
+#define LIS302DL_Z_ENABLE                                 ((uint8_t)0x04)\r
+#define LIS302DL_XYZ_ENABLE                               ((uint8_t)0x07)\r
+/**\r
+  * @}\r
+  */\r
\r
+ /** @defgroup SPI_Serial_Interface_Mode_selection \r
+  * @{\r
+  */\r
+#define LIS302DL_SERIALINTERFACE_4WIRE                    ((uint8_t)0x00)\r
+#define LIS302DL_SERIALINTERFACE_3WIRE                    ((uint8_t)0x80)\r
+/**\r
+  * @}\r
+  */ \r
+\r
+ /** @defgroup Boot_Mode_selection \r
+  * @{\r
+  */\r
+#define LIS302DL_BOOT_NORMALMODE                          ((uint8_t)0x00)\r
+#define LIS302DL_BOOT_REBOOTMEMORY                        ((uint8_t)0x40)\r
+/**\r
+  * @}\r
+  */   \r
+\r
+ /** @defgroup Filtered_Data_Selection_Mode_selection \r
+  * @{\r
+  */\r
+#define LIS302DL_FILTEREDDATASELECTION_BYPASSED           ((uint8_t)0x00)\r
+#define LIS302DL_FILTEREDDATASELECTION_OUTPUTREGISTER     ((uint8_t)0x20)\r
+/**\r
+  * @}\r
+  */ \r
+  \r
+ /** @defgroup High_Pass_Filter_Interrupt_selection \r
+  * @{\r
+  */  \r
+#define LIS302DL_HIGHPASSFILTERINTERRUPT_OFF              ((uint8_t)0x00)\r
+#define LIS302DL_HIGHPASSFILTERINTERRUPT_1                ((uint8_t)0x04)\r
+#define LIS302DL_HIGHPASSFILTERINTERRUPT_2                ((uint8_t)0x08)\r
+#define LIS302DL_HIGHPASSFILTERINTERRUPT_1_2              ((uint8_t)0x0C)\r
+/**\r
+  * @}\r
+  */ \r
+  \r
+ /** @defgroup High_Pass_Filter_selection \r
+  * @{\r
+  */\r
+#define LIS302DL_HIGHPASSFILTER_LEVEL_0                   ((uint8_t)0x00)\r
+#define LIS302DL_HIGHPASSFILTER_LEVEL_1                   ((uint8_t)0x01)\r
+#define LIS302DL_HIGHPASSFILTER_LEVEL_2                   ((uint8_t)0x02)\r
+#define LIS302DL_HIGHPASSFILTER_LEVEL_3                   ((uint8_t)0x03)\r
+/**\r
+  * @}\r
+  */\r
+\r
+\r
+/** @defgroup latch_Interrupt_Request_selection \r
+  * @{\r
+  */\r
+#define LIS302DL_INTERRUPTREQUEST_NOTLATCHED              ((uint8_t)0x00)\r
+#define LIS302DL_INTERRUPTREQUEST_LATCHED                 ((uint8_t)0x40)\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup Click_Interrupt_XYZ_selection \r
+  * @{\r
+  */\r
+#define LIS302DL_CLICKINTERRUPT_XYZ_DISABLE               ((uint8_t)0x00)\r
+#define LIS302DL_CLICKINTERRUPT_X_ENABLE                  ((uint8_t)0x01)\r
+#define LIS302DL_CLICKINTERRUPT_Y_ENABLE                  ((uint8_t)0x04)\r
+#define LIS302DL_CLICKINTERRUPT_Z_ENABLE                  ((uint8_t)0x10)\r
+#define LIS302DL_CLICKINTERRUPT_XYZ_ENABLE                ((uint8_t)0x15)\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup Double_Click_Interrupt_XYZ_selection \r
+  * @{\r
+  */\r
+#define LIS302DL_DOUBLECLICKINTERRUPT_XYZ_DISABLE         ((uint8_t)0x00)\r
+#define LIS302DL_DOUBLECLICKINTERRUPT_X_ENABLE            ((uint8_t)0x02)\r
+#define LIS302DL_DOUBLECLICKINTERRUPT_Y_ENABLE            ((uint8_t)0x08)\r
+#define LIS302DL_DOUBLECLICKINTERRUPT_Z_ENABLE            ((uint8_t)0x20)\r
+#define LIS302DL_DOUBLECLICKINTERRUPT_XYZ_ENABLE          ((uint8_t)0x2A)\r
+/**\r
+  * @}\r
+  */\r
+/**\r
+  * @}\r
+  */ \r
+  \r
+/** @defgroup STM32F4_DISCOVERY_LIS302DL_Exported_Macros\r
+  * @{\r
+  */\r
+#define LIS302DL_CS_LOW()       GPIO_ResetBits(LIS302DL_SPI_CS_GPIO_PORT, LIS302DL_SPI_CS_PIN)\r
+#define LIS302DL_CS_HIGH()      GPIO_SetBits(LIS302DL_SPI_CS_GPIO_PORT, LIS302DL_SPI_CS_PIN)\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/** @defgroup STM32F4_DISCOVERY_LIS302DL_Exported_Functions\r
+  * @{\r
+  */ \r
+void LIS302DL_Init(LIS302DL_InitTypeDef *LIS302DL_InitStruct);\r
+void LIS302DL_InterruptConfig(LIS302DL_InterruptConfigTypeDef *LIS302DL_InterruptConfigStruct);\r
+void LIS302DL_FilterConfig(LIS302DL_FilterConfigTypeDef *LIS302DL_FilterConfigStruct);\r
+void LIS302DL_LowpowerCmd(uint8_t LowPowerMode);\r
+void LIS302DL_FullScaleCmd(uint8_t FS_value);\r
+void LIS302DL_DataRateCmd(uint8_t DataRateValue);\r
+void LIS302DL_RebootCmd(void);\r
+void LIS302DL_ReadACC(int32_t* out);\r
+void LIS302DL_Write(uint8_t* pBuffer, uint8_t WriteAddr, uint16_t NumByteToWrite);\r
+void LIS302DL_Read(uint8_t* pBuffer, uint8_t ReadAddr, uint16_t NumByteToRead);\r
+\r
+/* USER Callbacks: This is function for which prototype only is declared in\r
+   MEMS accelerometre driver and that should be implemented into user applicaiton. */  \r
+/* LIS302DL_TIMEOUT_UserCallback() function is called whenever a timeout condition \r
+   occure during communication (waiting transmit data register empty flag(TXE)\r
+   or waiting receive data register is not empty flag (RXNE)).\r
+   You can use the default timeout callback implementation by uncommenting the \r
+   define USE_DEFAULT_TIMEOUT_CALLBACK in stm32f4_discovery_lis302dl.h file.\r
+   Typically the user implementation of this callback should reset MEMS peripheral\r
+   and re-initialize communication or in worst case reset all the application. */\r
+uint32_t LIS302DL_TIMEOUT_UserCallback(void);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* __STM32F4_DISCOVERY_LIS302DL_H */\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+\r
+/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/\r