STM32L476G-Discovery BSP User Manual: stm32l476g_discovery.c Source File

STM32L476G-Discovery BSP

stm32l476g_discovery.c
Go to the documentation of this file.
00001 /**
00002   ******************************************************************************
00003   * @file    stm32l476g_discovery.c
00004   * @author  MCD Application Team
00005   * @version $VERSION$
00006   * @date    $DATE$
00007   * @brief   This file provides a set of firmware functions to manage Leds, 
00008   *          push-button and joystick of STM32L476G-Discovery board (MB1184)
00009   ******************************************************************************
00010   * @attention
00011   *
00012   * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
00013   *
00014   * Redistribution and use in source and binary forms, with or without modification,
00015   * are permitted provided that the following conditions are met:
00016   *   1. Redistributions of source code must retain the above copyright notice,
00017   *      this list of conditions and the following disclaimer.
00018   *   2. Redistributions in binary form must reproduce the above copyright notice,
00019   *      this list of conditions and the following disclaimer in the documentation
00020   *      and/or other materials provided with the distribution.
00021   *   3. Neither the name of STMicroelectronics nor the names of its contributors
00022   *      may be used to endorse or promote products derived from this software
00023   *      without specific prior written permission.
00024   *
00025   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00026   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00028   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
00029   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00030   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
00031   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00032   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00033   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00034   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00035   *
00036   ******************************************************************************
00037   */
00038   
00039 /* Includes ------------------------------------------------------------------*/
00040 #include "stm32l476g_discovery.h"
00041 
00042 /** @addtogroup BSP
00043   * @{
00044   */
00045 
00046 /** @defgroup STM32L476G_DISCOVERY STM32L476G-DISCOVERY
00047   * @{
00048   */
00049 
00050 /** @defgroup STM32L476G_DISCOVERY_Common STM32L476G-DISCOVERY Common
00051   * @{
00052   */
00053 
00054 /** @defgroup STM32L476G_DISCOVERY_Private_TypesDefinitions Private Types Definitions
00055   * @brief This file provides firmware functions to manage Leds, push-buttons, 
00056   *        COM ports, SD card on SPI and temperature sensor (TS751) available on 
00057   *        STM32L476G-DISCOVERY discoveryuation board from STMicroelectronics.
00058   * @{
00059   */
00060 
00061 /**
00062   * @}
00063   */
00064 
00065 /** @defgroup STM32L476G_DISCOVERY_Private_Defines Private Defines
00066   * @{
00067   */
00068 
00069 /**
00070  * @brief STM32L476G DISCOVERY BSP Driver version number $VERSION$
00071    */
00072 #define __STM32L476G_DISCOVERY_BSP_VERSION_MAIN       (0x00) /*!< [31:24] main version */
00073 #define __STM32L476G_DISCOVERY_BSP_VERSION_SUB1       (0x00) /*!< [23:16] sub1 version */
00074 #define __STM32L476G_DISCOVERY_BSP_VERSION_SUB2       (0x00) /*!< [15:8]  sub2 version */
00075 #define __STM32L476G_DISCOVERY_BSP_VERSION_RC         (0x01) /*!< [7:0]  release candidate */
00076 #define __STM32L476G_DISCOVERY_BSP_VERSION            ((__STM32L476G_DISCOVERY_BSP_VERSION_MAIN << 24)\
00077                                                       |(__STM32L476G_DISCOVERY_BSP_VERSION_SUB1 << 16)\
00078                                                       |(__STM32L476G_DISCOVERY_BSP_VERSION_SUB2 << 8 )\
00079                                                       |(__STM32L476G_DISCOVERY_BSP_VERSION_RC))
00080 /**
00081   * @}
00082   */
00083 
00084 
00085 /** @defgroup STM32L476G_DISCOVERY_Private_Macros Private Macros
00086   * @{
00087   */
00088 
00089 /**
00090   * @}
00091   */
00092 
00093 
00094 /** @defgroup STM32L476G_DISCOVERY_Exported_Variables Exported Variables
00095   * @{
00096   */
00097 
00098 /**
00099  * @brief LED variables
00100  */
00101 #if defined (USE_STM32L476G_DISCO_REVC) || defined (USE_STM32L476G_DISCO_REVB)
00102 GPIO_TypeDef*   LED_PORT[LEDn] =  {LED4_GPIO_PORT,
00103                                   LED5_GPIO_PORT};
00104 
00105 const uint16_t  LED_PIN[LEDn] =   {LED4_PIN,
00106                                   LED5_PIN};
00107 #elif defined (USE_STM32L476G_DISCO_REVA)
00108 GPIO_TypeDef*   LED_PORT[LEDn] =  {LED3_GPIO_PORT,
00109                                   LED4_GPIO_PORT};
00110 
00111 const uint16_t  LED_PIN[LEDn] =   {LED3_PIN,
00112                                   LED4_PIN};
00113 #endif
00114 
00115 
00116 /**
00117  * @brief JOYSTICK variables
00118  */
00119  GPIO_TypeDef* JOY_PORT[JOYn] =  {SEL_JOY_GPIO_PORT,
00120                                   DOWN_JOY_GPIO_PORT,
00121                                   LEFT_JOY_GPIO_PORT,
00122                                   RIGHT_JOY_GPIO_PORT,
00123                                   UP_JOY_GPIO_PORT};
00124 
00125 const uint16_t JOY_PIN[JOYn] =   {SEL_JOY_PIN,
00126                                   LEFT_JOY_PIN,
00127                                   RIGHT_JOY_PIN,
00128                                   DOWN_JOY_PIN,
00129                                   UP_JOY_PIN};
00130 
00131 const uint8_t JOY_IRQn[JOYn] =   {SEL_JOY_EXTI_IRQn,
00132                                   LEFT_JOY_EXTI_IRQn,
00133                                   RIGHT_JOY_EXTI_IRQn,
00134                                   DOWN_JOY_EXTI_IRQn,
00135                                   UP_JOY_EXTI_IRQn};
00136 
00137 /**
00138  * @brief BUS variables
00139  */
00140 #if defined(HAL_I2C_MODULE_ENABLED)
00141 uint32_t I2c1Timeout = DISCOVERY_I2C2_TIMEOUT_MAX;  /*<! Value of Timeout when I2C1 communication fails */
00142 uint32_t I2c2Timeout = DISCOVERY_I2C2_TIMEOUT_MAX;  /*<! Value of Timeout when I2C2 communication fails */
00143 static I2C_HandleTypeDef I2c1Handle;
00144 static I2C_HandleTypeDef I2c2Handle;
00145 #endif /* HAL_I2C_MODULE_ENABLED */
00146 
00147 #if defined(HAL_SPI_MODULE_ENABLED)
00148 
00149 /* LL definition */
00150 #define __SPI_DIRECTION_2LINES(__HANDLE__)   do{\
00151                                              CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_RXONLY | SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE);\
00152                                              }while(0);
00153 
00154 #define __SPI_DIRECTION_2LINES_RXONLY(__HANDLE__)   do{\
00155                                                    CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_RXONLY | SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE);\
00156                                                    SET_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_RXONLY);\
00157                                                    }while(0);
00158 
00159 #define __SPI_DIRECTION_1LINE_TX(__HANDLE__) do{\
00160                                              CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_RXONLY | SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE);\
00161                                              SET_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE);\
00162                                              }while(0);
00163 
00164 #define __SPI_DIRECTION_1LINE_RX(__HANDLE__) do {\
00165                                              CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_RXONLY | SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE);\
00166                                              SET_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_BIDIMODE);\
00167                                              } while(0);
00168 
00169 
00170 uint32_t SpixTimeout = SPIx_TIMEOUT_MAX;            /*<! Value of Timeout when SPI communication fails */
00171 static SPI_HandleTypeDef SpiHandle;
00172 #endif /* HAL_SPI_MODULE_ENABLED */
00173 
00174 /**
00175   * @}
00176   */
00177 
00178 /** @defgroup STM32L476G_DISCOVERY_Private_FunctionPrototypes Private Functions
00179   * @{
00180   */
00181 /**************************** Bus functions ************************************/
00182 /* I2C2 bus function */
00183 #if defined(HAL_I2C_MODULE_ENABLED)
00184 static void               I2C2_Init(void);
00185 static void               I2C2_MspInit(I2C_HandleTypeDef *hi2c);
00186 static void               I2C2_DeInit(void);
00187 static void               I2C2_MspDeInit(I2C_HandleTypeDef *hi2c);
00188 static void               I2C2_WriteData(uint16_t Addr, uint16_t Reg, uint16_t RegSize, uint8_t Value);
00189 static HAL_StatusTypeDef  I2C2_WriteBuffer(uint16_t Addr, uint16_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length);
00190 static uint8_t            I2C2_ReadData(uint16_t Addr, uint16_t Reg, uint16_t RegSize);
00191 static HAL_StatusTypeDef  I2C2_ReadBuffer(uint16_t Addr, uint16_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length);
00192 static void               I2C2_Error (void);
00193 
00194 static void               I2C1_Init(void);
00195 static void               I2C1_MspInit(I2C_HandleTypeDef *hi2c);
00196 static void               I2C1_DeInit(void);
00197 static void               I2C1_MspDeInit(I2C_HandleTypeDef *hi2c);
00198 static HAL_StatusTypeDef  I2C1_WriteBuffer(uint16_t Addr, uint16_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length);
00199 static HAL_StatusTypeDef  I2C1_ReadBuffer(uint16_t Addr, uint16_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length);
00200 static void               I2C1_Error (void);
00201 #endif/* HAL_I2C_MODULE_ENABLED */
00202 
00203 /* SPIx bus function */
00204 #if defined(HAL_SPI_MODULE_ENABLED)
00205 static void               SPIx_Init(void);
00206 static void               SPIx_MspInit(SPI_HandleTypeDef *hspi);
00207 static void               SPIx_DeInit(void);
00208 static void               SPIx_MspDeInit(void);
00209 static uint8_t            SPIx_WriteRead(uint8_t Byte);
00210 static void               SPIx_Write(uint8_t byte);
00211 static uint8_t            SPIx_Read(void);
00212 #endif
00213 
00214 /**************************** Link functions ***********************************/
00215 #if defined(HAL_I2C_MODULE_ENABLED)
00216 /* Link functions for EEPROM peripheral over I2C */
00217 void                      EEPROM_I2C_IO_Init(void);
00218 HAL_StatusTypeDef         EEPROM_I2C_IO_WriteData(uint16_t DevAddress, uint16_t MemAddress, uint8_t* pBuffer, uint32_t BufferSize);
00219 HAL_StatusTypeDef         EEPROM_I2C_IO_ReadData(uint16_t DevAddress, uint16_t MemAddress, uint8_t* pBuffer, uint32_t BufferSize);
00220 HAL_StatusTypeDef         EEPROM_I2C_IO_IsDeviceReady(uint16_t DevAddress, uint32_t Trials);
00221 
00222 /* Link functions for Audio Codec peripheral */
00223 void                      AUDIO_IO_Init(void);
00224 void                      AUDIO_IO_DeInit(void);
00225 void                      AUDIO_IO_Write(uint8_t Addr, uint8_t Reg, uint8_t Value);
00226 uint8_t                   AUDIO_IO_Read(uint8_t Addr, uint8_t Reg);
00227 void                      AUDIO_IO_Delay(uint32_t delay);
00228 #endif/* HAL_I2C_MODULE_ENABLED */
00229 
00230 #if defined(HAL_SPI_MODULE_ENABLED)
00231 /* Link function for COMPASS / ACCELERO peripheral */
00232 void                      ACCELERO_IO_Init(void);
00233 void                      ACCELERO_IO_DeInit(void);
00234 void                      ACCELERO_IO_ITConfig(void);
00235 void                      ACCELERO_IO_Write(uint8_t RegisterAddr, uint8_t Value);
00236 uint8_t                   ACCELERO_IO_Read(uint8_t RegisterAddr);
00237 
00238 void                      MAGNETO_IO_Init(void);
00239 void                      MAGNETO_IO_DeInit(void);
00240 void                      MAGNETO_IO_ITConfig(void);
00241 void                      MAGNETO_IO_Write(uint8_t RegisterAddr, uint8_t Value);
00242 uint8_t                   MAGNETO_IO_Read(uint8_t RegisterAddr);
00243 
00244 
00245 /* Link functions for GYRO peripheral */
00246 void                      GYRO_IO_Init(void);
00247 void                      GYRO_IO_DeInit(void);
00248 void                      GYRO_IO_Write(uint8_t* pBuffer, uint8_t WriteAddr, uint16_t NumByteToWrite);
00249 void                      GYRO_IO_Read(uint8_t* pBuffer, uint8_t ReadAddr, uint16_t NumByteToRead);
00250 
00251 #endif
00252 
00253 #if defined(HAL_I2C_MODULE_ENABLED)
00254 /*  Link functions IOExpander */
00255 void                      IOE_Init(void);
00256 void                      IOE_ITConfig(void);
00257 void                      IOE_Delay(uint32_t Delay);
00258 void                      IOE_Write(uint8_t Addr, uint8_t Reg, uint8_t Value);
00259 uint8_t                   IOE_Read(uint8_t Addr, uint8_t Reg);
00260 uint16_t                  IOE_ReadMultiple(uint8_t Addr, uint8_t Reg, uint8_t *Buffer, uint16_t Length);
00261 
00262 /* Link functions for IDD measurment */
00263 void                      MFX_IO_Init(void);
00264 void                      MFX_IO_DeInit(void);
00265 void                      MFX_IO_ITConfig (void);
00266 void                      MFX_IO_EnableWakeupPin(void);
00267 void                      MFX_IO_Wakeup(void);
00268 void                      MFX_IO_Delay(uint32_t delay);
00269 void                      MFX_IO_Write(uint16_t addr, uint8_t reg, uint8_t value);
00270 uint8_t                   MFX_IO_Read(uint16_t addr, uint8_t reg);
00271 void                      MFX_IO_WriteMultiple(uint16_t Addr, uint8_t Reg, uint8_t *Buffer, uint16_t Length);
00272 uint16_t                  MFX_IO_ReadMultiple(uint16_t addr, uint8_t reg, uint8_t *buffer, uint16_t length);
00273 #endif/* HAL_I2C_MODULE_ENABLED */
00274 /**
00275   * @}
00276   */
00277 
00278 /** @defgroup STM32L476G_DISCOVERY_Exported_Functions Exported Functions
00279   * @{
00280   */
00281 
00282 /**
00283   * @brief  This method returns the STM32L476 DISCOVERY BSP Driver revision
00284   * @retval version : 0xXYZR (8bits for each decimal, R for RC)
00285   */
00286 uint32_t BSP_GetVersion(void)
00287 {
00288   return __STM32L476G_DISCOVERY_BSP_VERSION;
00289 }
00290 
00291 /**
00292   * @brief  This method returns the STM32L476 DISCOVERY supply mode
00293   * @retval Code of current supply mode
00294   *          This code can be one of following:
00295   *     @arg SUPPLY_MODE_EXTERNAL
00296   *     @arg SUPPLY_MODE_BATTERY
00297   */
00298 SupplyMode_TypeDef BSP_SupplyModeDetection(void)
00299 {
00300   SupplyMode_TypeDef supplymode = SUPPLY_MODE_ERROR;
00301   GPIO_InitTypeDef GPIO_InitStruct;
00302 
00303   BATTERY_DETECTION_GPIO_CLK_ENABLE();
00304 
00305   /* COMP GPIO pin configuration */
00306   GPIO_InitStruct.Pin = BATTERY_DETECTION_PIN;
00307   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
00308   GPIO_InitStruct.Pull = GPIO_NOPULL;
00309   GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
00310   HAL_GPIO_Init(BATTERY_DETECTION_GPIO_PORT, &GPIO_InitStruct);
00311 
00312   HAL_Delay(400);
00313   if(HAL_GPIO_ReadPin(BATTERY_DETECTION_GPIO_PORT, GPIO_InitStruct.Pin) != GPIO_PIN_RESET)
00314   {
00315     supplymode = SUPPLY_MODE_EXTERNAL;
00316   }
00317   else
00318   {
00319     supplymode = SUPPLY_MODE_BATTERY;
00320   }
00321   
00322   HAL_GPIO_DeInit(BATTERY_DETECTION_GPIO_PORT, GPIO_InitStruct.Pin);
00323   
00324   return supplymode;
00325 }
00326 
00327 #if defined (USE_STM32L476G_DISCO_REVC) || defined (USE_STM32L476G_DISCO_REVB)
00328 /**
00329   * @brief  Configures LED GPIOs.
00330   * @param  Led: Specifies the Led to be configured. 
00331   *   This parameter can be one of following parameters:  
00332   *     @arg LED4
00333   *     @arg LED5
00334   * @retval None
00335   */
00336 #elif defined (USE_STM32L476G_DISCO_REVA)
00337 /**
00338   * @brief  Configures LED GPIOs.
00339   * @param  Led: Specifies the Led to be configured. 
00340   *   This parameter can be one of following parameters:  
00341   *     @arg LED3
00342   *     @arg LED4
00343   * @retval None
00344   */
00345 #endif
00346 void BSP_LED_Init(Led_TypeDef Led)
00347 {
00348   GPIO_InitTypeDef  GPIO_InitStructure;
00349 
00350   /* Enable the GPIO_LED clock */
00351   LEDx_GPIO_CLK_ENABLE(Led);
00352 
00353   /* Configure the GPIO_LED pin */
00354   GPIO_InitStructure.Pin = LED_PIN[Led];
00355   GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
00356   GPIO_InitStructure.Pull = GPIO_NOPULL;
00357   GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
00358 
00359   HAL_GPIO_Init(LED_PORT[Led], &GPIO_InitStructure);
00360 
00361   HAL_GPIO_WritePin(LED_PORT[Led], GPIO_InitStructure.Pin, GPIO_PIN_RESET);
00362 }
00363 
00364 #if defined (USE_STM32L476G_DISCO_REVC) || defined (USE_STM32L476G_DISCO_REVB)
00365 /**
00366   * @brief  Unconfigures LED GPIOs.
00367   * @param  Led: Specifies the Led to be unconfigured. 
00368   *   This parameter can be one of following parameters:
00369   *     @arg LED4
00370   *     @arg LED5
00371   * @retval None
00372   */
00373 #elif defined (USE_STM32L476G_DISCO_REVA)
00374 /**
00375   * @brief  Unconfigures LED GPIOs.
00376   * @param  Led: Specifies the Led to be unconfigured. 
00377   *   This parameter can be one of following parameters:
00378   *     @arg LED3
00379   *     @arg LED4
00380   * @retval None
00381   */
00382 #endif
00383 void BSP_LED_DeInit(Led_TypeDef Led)
00384 {
00385   /* Enable the GPIO_LED clock */
00386   LEDx_GPIO_CLK_ENABLE(Led);
00387 
00388   HAL_GPIO_DeInit(LED_PORT[Led], LED_PIN[Led]);
00389 }
00390 
00391 #if defined (USE_STM32L476G_DISCO_REVC) || defined (USE_STM32L476G_DISCO_REVB)
00392 /**
00393   * @brief  Turns selected LED On.
00394   * @param  Led: Specifies the Led to be set on. 
00395   *   This parameter can be one of following parameters:
00396   *     @arg LED4
00397   *     @arg LED5
00398   * @retval None
00399   */
00400 #elif defined (USE_STM32L476G_DISCO_REVA)
00401 /**
00402   * @brief  Turns selected LED On.
00403   * @param  Led: Specifies the Led to be set on. 
00404   *   This parameter can be one of following parameters:
00405   *     @arg LED3
00406   *     @arg LED4
00407   * @retval None
00408   */
00409 #endif
00410 void BSP_LED_On(Led_TypeDef Led)
00411 {
00412   HAL_GPIO_WritePin(LED_PORT[Led], LED_PIN[Led], GPIO_PIN_SET);
00413 }
00414 
00415 #if defined (USE_STM32L476G_DISCO_REVC) || defined (USE_STM32L476G_DISCO_REVB)
00416 /**
00417   * @brief  Turns selected LED Off.
00418   * @param  Led: Specifies the Led to be set off. 
00419   *   This parameter can be one of following parameters:
00420   *     @arg LED4
00421   *     @arg LED5
00422   * @retval None
00423   */
00424 #elif defined (USE_STM32L476G_DISCO_REVA)
00425 /**
00426   * @brief  Turns selected LED Off.
00427   * @param  Led: Specifies the Led to be set off. 
00428   *   This parameter can be one of following parameters:
00429   *     @arg LED3
00430   *     @arg LED4
00431   * @retval None
00432   */
00433 #endif
00434 void BSP_LED_Off(Led_TypeDef Led)
00435 {
00436   HAL_GPIO_WritePin(LED_PORT[Led], LED_PIN[Led], GPIO_PIN_RESET);
00437 }
00438 
00439 #if defined (USE_STM32L476G_DISCO_REVC) || defined (USE_STM32L476G_DISCO_REVB)
00440 /**
00441   * @brief  Toggles the selected LED.
00442   * @param  Led: Specifies the Led to be toggled. 
00443   *   This parameter can be one of following parameters:
00444   *     @arg LED4
00445   *     @arg LED5
00446   * @retval None
00447   */
00448 #elif defined (USE_STM32L476G_DISCO_REVA)
00449 /**
00450   * @brief  Toggles the selected LED.
00451   * @param  Led: Specifies the Led to be toggled. 
00452   *   This parameter can be one of following parameters:
00453   *     @arg LED3
00454   *     @arg LED4
00455   * @retval None
00456   */
00457 #endif
00458 void BSP_LED_Toggle(Led_TypeDef Led)
00459 {
00460   HAL_GPIO_TogglePin(LED_PORT[Led], LED_PIN[Led]);
00461 }
00462 
00463 /**
00464   * @brief  Configures all buttons of the joystick in GPIO or EXTI modes.
00465   * @param  Joy_Mode: Joystick mode.
00466   *    This parameter can be one of the following values:
00467   *     @arg  JOY_MODE_GPIO: Joystick pins will be used as simple IOs
00468   *     @arg  JOY_MODE_EXTI: Joystick pins will be connected to EXTI line 
00469   *                                 with interrupt generation capability  
00470   * @retval HAL_OK: if all initializations are OK. Other value if error.
00471   */
00472 uint8_t BSP_JOY_Init(JOYMode_TypeDef Joy_Mode)
00473 {
00474   JOYState_TypeDef joykey;
00475   GPIO_InitTypeDef GPIO_InitStruct;
00476   
00477   /* Initialized the Joystick. */
00478   for(joykey = JOY_SEL; joykey < (JOY_SEL + JOYn) ; joykey++)
00479   {
00480     /* Enable the JOY clock */
00481     JOYx_GPIO_CLK_ENABLE(joykey);
00482     
00483     GPIO_InitStruct.Pin = JOY_PIN[joykey];
00484     GPIO_InitStruct.Pull = GPIO_PULLDOWN;
00485     GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
00486     
00487     if (Joy_Mode == JOY_MODE_GPIO)
00488     {
00489       /* Configure Joy pin as input */
00490       GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
00491       HAL_GPIO_Init(JOY_PORT[joykey], &GPIO_InitStruct);
00492     }
00493     else if (Joy_Mode == JOY_MODE_EXTI)
00494     {
00495       /* Configure Joy pin as input with External interrupt */
00496       GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
00497       HAL_GPIO_Init(JOY_PORT[joykey], &GPIO_InitStruct);
00498       
00499       /* Enable and set Joy EXTI Interrupt to the lowest priority */
00500       HAL_NVIC_SetPriority((IRQn_Type)(JOY_IRQn[joykey]), 0x0F, 0x00);
00501       HAL_NVIC_EnableIRQ((IRQn_Type)(JOY_IRQn[joykey]));
00502     }
00503   }
00504   
00505   return HAL_OK;
00506 }
00507 
00508 /**
00509   * @brief  Unonfigures all GPIOs used as buttons of the joystick.
00510   * @retval None.
00511   */
00512 void BSP_JOY_DeInit(void)
00513 {
00514   JOYState_TypeDef joykey;
00515   
00516   /* Initialized the Joystick. */
00517   for(joykey = JOY_SEL; joykey < (JOY_SEL + JOYn) ; joykey++)
00518   {
00519     /* Enable the JOY clock */
00520     JOYx_GPIO_CLK_ENABLE(joykey);
00521     
00522     HAL_GPIO_DeInit(JOY_PORT[joykey], JOY_PIN[joykey]);
00523   }
00524 }
00525 
00526 /**
00527 * @brief  Returns the current joystick status.
00528 * @retval Code of the joystick key pressed
00529 *          This code can be one of the following values:
00530 *            @arg  JOY_NONE
00531 *            @arg  JOY_SEL
00532 *            @arg  JOY_DOWN
00533 *            @arg  JOY_LEFT
00534 *            @arg  JOY_RIGHT
00535 *            @arg  JOY_UP
00536 */
00537 JOYState_TypeDef BSP_JOY_GetState(void)
00538 {
00539   JOYState_TypeDef joykey;
00540   
00541   for (joykey = JOY_SEL; joykey < (JOY_SEL + JOYn) ; joykey++)
00542   {
00543     if (HAL_GPIO_ReadPin(JOY_PORT[joykey], JOY_PIN[joykey]) == GPIO_PIN_SET)
00544     {
00545       /* Return Code Joystick key pressed */
00546       return joykey;
00547     }
00548   }
00549   
00550   /* No Joystick key pressed */
00551   return JOY_NONE;
00552 }
00553 
00554 /**
00555   * @}
00556   */ 
00557 
00558 /** @defgroup STM32L476G_DISCOVERY_BusOperations_Functions Bus Operations Functions
00559   * @{
00560   */ 
00561 
00562 /*******************************************************************************
00563                             BUS OPERATIONS
00564 *******************************************************************************/
00565 #if defined(HAL_SPI_MODULE_ENABLED)
00566 /******************************* SPI Routines**********************************/
00567 /**
00568   * @brief SPIx Bus initialization
00569   * @retval None
00570   */
00571 static void SPIx_Init(void)
00572 {
00573   if(HAL_SPI_GetState(&SpiHandle) == HAL_SPI_STATE_RESET) 
00574   {
00575     /* SPI Config */
00576     SpiHandle.Instance = DISCOVERY_SPIx;
00577     /* SPI baudrate is set to 10 MHz (PCLK2/SPI_BaudRatePrescaler = 80/8 = 10 MHz) 
00578       to verify these constraints:
00579       lsm303c SPI interface max baudrate is 10MHz for write/read
00580       PCLK2 frequency is set to 80 MHz 
00581       */
00582     SpiHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
00583     SpiHandle.Init.Direction = SPI_DIRECTION_2LINES;
00584     SpiHandle.Init.CLKPhase = SPI_PHASE_1EDGE;
00585     SpiHandle.Init.CLKPolarity = SPI_POLARITY_LOW;
00586     SpiHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
00587     SpiHandle.Init.CRCPolynomial = 7;
00588     SpiHandle.Init.DataSize = SPI_DATASIZE_8BIT;
00589     SpiHandle.Init.FirstBit = SPI_FIRSTBIT_MSB;
00590     SpiHandle.Init.NSS = SPI_NSS_SOFT;
00591     SpiHandle.Init.TIMode = SPI_TIMODE_DISABLE;
00592     SpiHandle.Init.Mode = SPI_MODE_MASTER;
00593 
00594     SPIx_MspInit(&SpiHandle);
00595     HAL_SPI_Init(&SpiHandle);
00596   }
00597 }
00598 
00599 /**
00600   * @brief SPI MSP Init
00601   * @param hspi: SPI handle
00602   * @retval None
00603   */
00604 static void SPIx_MspInit(SPI_HandleTypeDef *hspi)
00605 {
00606   GPIO_InitTypeDef   GPIO_InitStructure;
00607 
00608   /* Enable SPIx clock  */
00609   DISCOVERY_SPIx_CLOCK_ENABLE();
00610 
00611   /* enable SPIx gpio clock */
00612   DISCOVERY_SPIx_GPIO_CLK_ENABLE();
00613   
00614   /* configure SPIx SCK, MOSI and MISO */
00615   GPIO_InitStructure.Pin = (DISCOVERY_SPIx_SCK_PIN | DISCOVERY_SPIx_MOSI_PIN | DISCOVERY_SPIx_MISO_PIN);
00616   GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
00617   GPIO_InitStructure.Pull  = GPIO_NOPULL; // GPIO_PULLDOWN;
00618   GPIO_InitStructure.Speed = GPIO_SPEED_FAST;
00619   GPIO_InitStructure.Alternate = DISCOVERY_SPIx_AF;
00620   HAL_GPIO_Init(DISCOVERY_SPIx_GPIO_PORT, &GPIO_InitStructure);
00621 }
00622 
00623 /**
00624   * @brief SPIx Bus Deinitialization
00625   * @retval None
00626   */
00627 void SPIx_DeInit(void)
00628 {
00629   if(HAL_SPI_GetState(&SpiHandle) != HAL_SPI_STATE_RESET) 
00630   {
00631     /* SPI Deinit */
00632     HAL_SPI_DeInit(&SpiHandle);
00633     SPIx_MspDeInit();
00634   }
00635 }
00636 
00637 /**
00638   * @brief SPI MSP DeInit
00639   * @retval None
00640   */
00641 static void SPIx_MspDeInit(void)
00642 {  
00643   /* enable SPIx gpio clock */
00644   DISCOVERY_SPIx_GPIO_CLK_ENABLE();
00645 
00646   /* Unconfigure SPIx SCK, MOSI and MISO */
00647   HAL_GPIO_DeInit(DISCOVERY_SPIx_GPIO_PORT, (DISCOVERY_SPIx_SCK_PIN | DISCOVERY_SPIx_MOSI_PIN | DISCOVERY_SPIx_MISO_PIN));
00648 
00649   DISCOVERY_SPIx_GPIO_FORCE_RESET();
00650   DISCOVERY_SPIx_GPIO_RELEASE_RESET();
00651 
00652   /* Disable SPIx clock  */
00653   DISCOVERY_SPIx_CLOCK_DISABLE();
00654 }
00655 
00656 /**
00657   * @brief  Sends a Byte through the SPI interface and return the Byte received 
00658   *         from the SPI bus.
00659   * @param  Byte : Byte send.
00660   * @retval none.
00661   */
00662 static uint8_t SPIx_WriteRead(uint8_t Byte)
00663 {
00664   uint8_t receivedbyte;
00665 
00666   /* Enable the SPI */
00667   __HAL_SPI_ENABLE(&SpiHandle);
00668   /* check TXE flag */
00669   while((SpiHandle.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE);
00670   
00671   /* Write the data */
00672   *((__IO uint8_t*)&SpiHandle.Instance->DR) = Byte;
00673   
00674   while((SpiHandle.Instance->SR & SPI_FLAG_RXNE) != SPI_FLAG_RXNE);
00675   receivedbyte = *((__IO uint8_t*)&SpiHandle.Instance->DR);
00676 
00677   /* Wait BSY flag */
00678   while((SpiHandle.Instance->SR & SPI_FLAG_FTLVL) != SPI_FTLVL_EMPTY);
00679   while((SpiHandle.Instance->SR & SPI_FLAG_BSY) == SPI_FLAG_BSY);
00680   
00681   /* disable the SPI */
00682   __HAL_SPI_DISABLE(&SpiHandle);
00683 
00684   return receivedbyte;
00685 }
00686 
00687 /**
00688   * @brief  Sends a Byte through the SPI interface.
00689   * @param  Byte : Byte to send.
00690   * @retval none.
00691   */
00692 static void SPIx_Write(uint8_t Byte)
00693 {
00694   /* Enable the SPI */
00695   __HAL_SPI_ENABLE(&SpiHandle);
00696   /* check TXE flag */
00697   while((SpiHandle.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE);
00698   
00699   /* Write the data */
00700   *((__IO uint8_t*)&SpiHandle.Instance->DR) = Byte;
00701   
00702   /* Wait BSY flag */
00703   while((SpiHandle.Instance->SR & SPI_FLAG_BSY) == SPI_FLAG_BSY);
00704   
00705   /* disable the SPI */
00706   __HAL_SPI_DISABLE(&SpiHandle);
00707 }
00708 
00709 #if defined(__ICCARM__)
00710 #pragma optimize=none
00711 #endif
00712 /**
00713   * @brief  Receives a Byte from the SPI bus.
00714   * @retval The received byte value
00715   */
00716 static uint8_t SPIx_Read(void)
00717 {
00718   uint8_t receivedbyte;
00719 
00720     __HAL_SPI_ENABLE(&SpiHandle);
00721     __DSB();
00722     __DSB();
00723     __DSB();
00724     __DSB();
00725     __DSB();
00726     __DSB();
00727     __DSB();
00728     __DSB();
00729      __HAL_SPI_DISABLE(&SpiHandle);
00730 
00731   while((SpiHandle.Instance->SR & SPI_FLAG_RXNE) != SPI_FLAG_RXNE);
00732   /* read the received data */
00733   receivedbyte = *(__IO uint8_t *)&SpiHandle.Instance->DR;
00734   
00735   /* Wait for the BSY flag reset */
00736   while((SpiHandle.Instance->SR & SPI_FLAG_BSY) == SPI_FLAG_BSY); 
00737 
00738   
00739   return receivedbyte;
00740 }
00741 #endif /* HAL_SPI_MODULE_ENABLED */
00742 
00743 
00744 #if defined(HAL_I2C_MODULE_ENABLED)
00745 /******************************* I2C Routines**********************************/
00746 /**
00747   * @brief Discovery I2C1 Bus initialization
00748   * @retval None
00749   */
00750 static void I2C1_Init(void)
00751 {
00752   if(HAL_I2C_GetState(&I2c1Handle) == HAL_I2C_STATE_RESET)
00753   {
00754     I2c1Handle.Instance              = DISCOVERY_I2C1;
00755     I2c1Handle.Init.Timing           = DISCOVERY_I2C1_TIMING;
00756     I2c1Handle.Init.OwnAddress1      = 0;
00757     I2c1Handle.Init.AddressingMode   = I2C_ADDRESSINGMODE_7BIT;
00758     I2c1Handle.Init.DualAddressMode  = I2C_DUALADDRESS_DISABLE;
00759     I2c1Handle.Init.OwnAddress2      = 0;
00760     I2c1Handle.Init.GeneralCallMode  = I2C_GENERALCALL_DISABLE;
00761     I2c1Handle.Init.NoStretchMode    = I2C_NOSTRETCH_DISABLE;  
00762 
00763     /* Init the I2C */
00764     I2C1_MspInit(&I2c1Handle);
00765     HAL_I2C_Init(&I2c1Handle);
00766   }
00767 }
00768 
00769 /**
00770   * @brief Discovery I2C1 MSP Initialization
00771   * @param hi2c: I2C handle
00772   * @retval None
00773   */
00774 static void I2C1_MspInit(I2C_HandleTypeDef *hi2c)
00775 {
00776   GPIO_InitTypeDef  GPIO_InitStructure;  
00777   RCC_PeriphCLKInitTypeDef  RCC_PeriphCLKInitStruct;
00778 
00779   /* IOSV bit MUST be set to access GPIO port G[2:15] */
00780   __HAL_RCC_PWR_CLK_ENABLE();
00781   HAL_PWREx_EnableVddIO2();
00782   
00783   if (hi2c->Instance == DISCOVERY_I2C1)
00784   {
00785     /*##-1- Configure the Discovery I2C clock source. The clock is derived from the SYSCLK #*/
00786     RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2C1;
00787     RCC_PeriphCLKInitStruct.I2c1ClockSelection = RCC_I2C1CLKSOURCE_SYSCLK;
00788     HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);
00789 
00790     /*##-2- Configure the GPIOs ################################################*/  
00791     /* Enable GPIO clock */
00792     DISCOVERY_I2C1_SDA_GPIO_CLK_ENABLE();
00793     DISCOVERY_I2C1_SCL_GPIO_CLK_ENABLE();
00794       
00795     /* Configure I2C Rx/Tx as alternate function  */
00796     GPIO_InitStructure.Pin       = DISCOVERY_I2C1_SCL_PIN | DISCOVERY_I2C1_SDA_PIN;
00797     GPIO_InitStructure.Mode      = GPIO_MODE_AF_OD;
00798     GPIO_InitStructure.Pull      = GPIO_PULLUP;
00799     GPIO_InitStructure.Speed     = GPIO_SPEED_HIGH;
00800     GPIO_InitStructure.Alternate = DISCOVERY_I2C1_SCL_SDA_AF;
00801     HAL_GPIO_Init(DISCOVERY_I2C1_SCL_GPIO_PORT, &GPIO_InitStructure);
00802       
00803     /*##-3- Configure the Discovery I2C1 peripheral #######################################*/ 
00804     /* Enable Discovery I2C1 clock */
00805     DISCOVERY_I2C1_CLK_ENABLE();
00806     
00807     /* Force and release the I2C Peripheral Clock Reset */
00808     DISCOVERY_I2C1_FORCE_RESET();
00809     DISCOVERY_I2C1_RELEASE_RESET();
00810     
00811     /* Enable and set Discovery I2C1 Interrupt to the highest priority */
00812     HAL_NVIC_SetPriority(DISCOVERY_I2C1_EV_IRQn, 0x00, 0);
00813     HAL_NVIC_EnableIRQ(DISCOVERY_I2C1_EV_IRQn);
00814     
00815     /* Enable and set Discovery I2C1 Interrupt to the highest priority */
00816     HAL_NVIC_SetPriority(DISCOVERY_I2C1_ER_IRQn, 0x00, 0);
00817     HAL_NVIC_EnableIRQ(DISCOVERY_I2C1_ER_IRQn); 
00818   }
00819 }
00820 
00821 /**
00822   * @brief Discovery I2C1 Bus Deitialization
00823   * @retval None
00824   */
00825 static void I2C1_DeInit(void)
00826 {
00827   if(HAL_I2C_GetState(&I2c1Handle) != HAL_I2C_STATE_RESET)
00828   {
00829     /* Deinit the I2C */
00830     HAL_I2C_DeInit(&I2c1Handle);
00831     I2C1_MspDeInit(&I2c1Handle);
00832   }
00833 }
00834 
00835 /**
00836   * @brief Discovery I2C1 MSP Deinitialization
00837   * @param hi2c: I2C handle
00838   * @retval None
00839   */
00840 static void I2C1_MspDeInit(I2C_HandleTypeDef *hi2c)
00841 {
00842   if(hi2c->Instance == DISCOVERY_I2C1)
00843   {
00844     /*##-1- Unconfigure the GPIOs ################################################*/
00845     /* Enable GPIO clock */
00846     DISCOVERY_I2C1_SDA_GPIO_CLK_ENABLE();
00847     DISCOVERY_I2C1_SCL_GPIO_CLK_ENABLE();
00848 
00849     /* Deinit Rx/Tx pins */
00850     HAL_GPIO_DeInit(DISCOVERY_I2C1_SCL_GPIO_PORT, (DISCOVERY_I2C1_SCL_PIN | DISCOVERY_I2C1_SDA_PIN));
00851 
00852     /*##-2- Unconfigure the Discovery I2C1 peripheral ############################*/
00853     /* Force & Release the I2C Peripheral Clock Reset */  
00854     DISCOVERY_I2C1_FORCE_RESET();
00855     DISCOVERY_I2C1_RELEASE_RESET();
00856 
00857     /* Disable Discovery I2C1 clock */
00858     DISCOVERY_I2C1_CLK_DISABLE();
00859 
00860     /* Disable Discovery I2C1 interrupts */
00861     HAL_NVIC_DisableIRQ(DISCOVERY_I2C1_EV_IRQn);
00862     HAL_NVIC_DisableIRQ(DISCOVERY_I2C1_ER_IRQn);
00863     
00864     __HAL_RCC_PWR_CLK_ENABLE();
00865     HAL_PWREx_DisableVddIO2();
00866   }
00867 }
00868 
00869 /**
00870   * @brief  Write a value in a register of the device through BUS.
00871   * @param  Addr: Device address on BUS Bus.  
00872   * @param  Reg: The target register address to write
00873   * @param  RegSize: The target register size (can be 8BIT or 16BIT)
00874   * @param  pBuffer: The target register value to be written 
00875   * @param  Length: buffer size to be written
00876   * @retval None
00877   */
00878 static HAL_StatusTypeDef I2C1_WriteBuffer(uint16_t Addr, uint16_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length)
00879 {
00880   HAL_StatusTypeDef status = HAL_OK;
00881   
00882   status = HAL_I2C_Mem_Write(&I2c1Handle, Addr, (uint16_t)Reg, RegSize, pBuffer, Length, I2c1Timeout); 
00883 
00884 /* Check the communication status */
00885   if(status != HAL_OK)
00886   {
00887     /* Re-Initiaize the BUS */
00888     I2C1_Error();
00889   }        
00890   return status;
00891 }
00892 
00893 /**
00894   * @brief  Reads multiple data on the BUS.
00895   * @param  Addr: I2C Address
00896   * @param  Reg: Reg Address 
00897   * @param  RegSize : The target register size (can be 8BIT or 16BIT)
00898   * @param  pBuffer: pointer to read data buffer
00899   * @param  Length: length of the data
00900   * @retval 0 if no problems to read multiple data
00901   */
00902 static HAL_StatusTypeDef I2C1_ReadBuffer(uint16_t Addr, uint16_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length)
00903 {
00904   HAL_StatusTypeDef status = HAL_OK;
00905 
00906   status = HAL_I2C_Mem_Read(&I2c1Handle, Addr, (uint16_t)Reg, RegSize, pBuffer, Length, I2c1Timeout);
00907   
00908 /* Check the communication status */
00909   if(status != HAL_OK)
00910   {
00911     /* Re-Initiaize the BUS */
00912     I2C1_Error();
00913   }        
00914   return status;
00915 }
00916 
00917 /**
00918   * @brief Discovery I2C1 error treatment function
00919   * @retval None
00920   */
00921 static void I2C1_Error (void)
00922 {
00923   /* De-initialize the I2C communication BUS */
00924   HAL_I2C_DeInit(&I2c1Handle);
00925   
00926   /* Re- Initiaize the I2C communication BUS */
00927   I2C1_Init();
00928 }
00929 
00930 /**
00931   * @brief Discovery I2C2 Bus initialization
00932   * @retval None
00933   */
00934 static void I2C2_Init(void)
00935 {
00936   if(HAL_I2C_GetState(&I2c2Handle) == HAL_I2C_STATE_RESET)
00937   {
00938     I2c2Handle.Instance              = DISCOVERY_I2C2;
00939     I2c2Handle.Init.Timing           = DISCOVERY_I2C2_TIMING;
00940     I2c2Handle.Init.OwnAddress1      = 0;
00941     I2c2Handle.Init.AddressingMode   = I2C_ADDRESSINGMODE_7BIT;
00942     I2c2Handle.Init.DualAddressMode  = I2C_DUALADDRESS_DISABLE;
00943     I2c2Handle.Init.OwnAddress2      = 0;
00944     I2c2Handle.Init.GeneralCallMode  = I2C_GENERALCALL_DISABLE;
00945     I2c2Handle.Init.NoStretchMode    = I2C_NOSTRETCH_DISABLE;
00946 
00947     /* Init the I2C */
00948     I2C2_MspInit(&I2c2Handle);
00949     HAL_I2C_Init(&I2c2Handle);
00950   }
00951 }
00952 
00953 /**
00954   * @brief Discovery I2C2 MSP Initialization
00955   * @param hi2c: I2C2 handle
00956   * @retval None
00957   */
00958 static void I2C2_MspInit(I2C_HandleTypeDef *hi2c)
00959 {
00960   GPIO_InitTypeDef  GPIO_InitStructure;
00961   RCC_PeriphCLKInitTypeDef  RCC_PeriphCLKInitStruct;
00962 
00963   if (hi2c->Instance == DISCOVERY_I2C2)
00964   {
00965     /*##-1- Configure the Discovery I2C2 clock source. The clock is derived from the SYSCLK #*/
00966     RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2C2;
00967     RCC_PeriphCLKInitStruct.I2c2ClockSelection = RCC_I2C2CLKSOURCE_SYSCLK;
00968     HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);
00969 
00970     /*##-2- Configure the GPIOs ################################################*/
00971     /* Enable GPIO clock */
00972     DISCOVERY_I2C2_SDA_GPIO_CLK_ENABLE();
00973     DISCOVERY_I2C2_SCL_GPIO_CLK_ENABLE();
00974 
00975     /* Configure I2C Rx/Tx as alternate function  */
00976     GPIO_InitStructure.Pin       = DISCOVERY_I2C2_SCL_PIN | DISCOVERY_I2C2_SDA_PIN;
00977     GPIO_InitStructure.Mode      = GPIO_MODE_AF_OD;
00978     GPIO_InitStructure.Pull      = GPIO_PULLUP;
00979     GPIO_InitStructure.Speed     = GPIO_SPEED_HIGH;
00980     GPIO_InitStructure.Alternate = DISCOVERY_I2C2_SCL_SDA_AF;
00981     HAL_GPIO_Init(DISCOVERY_I2C2_SCL_GPIO_PORT, &GPIO_InitStructure);
00982 
00983     /*##-3- Configure the Discovery I2C2 peripheral #############################*/
00984     /* Enable Discovery_I2C2 clock */
00985     DISCOVERY_I2C2_CLK_ENABLE();
00986 
00987     /* Force and release the I2C Peripheral Clock Reset */  
00988     DISCOVERY_I2C2_FORCE_RESET();
00989     DISCOVERY_I2C2_RELEASE_RESET(); 
00990 
00991     /* Enable and set Discovery I2C2 Interrupt to the highest priority */
00992     HAL_NVIC_SetPriority(DISCOVERY_I2C2_EV_IRQn, 0x00, 0);
00993     HAL_NVIC_EnableIRQ(DISCOVERY_I2C2_EV_IRQn);
00994 
00995     /* Enable and set Discovery I2C2 Interrupt to the highest priority */
00996     HAL_NVIC_SetPriority(DISCOVERY_I2C2_ER_IRQn, 0x00, 0);
00997     HAL_NVIC_EnableIRQ(DISCOVERY_I2C2_ER_IRQn); 
00998   }
00999 }
01000 
01001 /**
01002   * @brief Discovery I2C2 Bus Deinitialization
01003   * @retval None
01004   */
01005 static void I2C2_DeInit(void)
01006 {
01007   if(HAL_I2C_GetState(&I2c2Handle) != HAL_I2C_STATE_RESET)
01008   {
01009     /* DeInit the I2C */
01010     HAL_I2C_DeInit(&I2c2Handle);
01011     I2C2_MspDeInit(&I2c2Handle);
01012   }
01013 }
01014 
01015 /**
01016   * @brief Discovery I2C2 MSP DeInitialization
01017   * @param hi2c: I2C2 handle
01018   * @retval None
01019   */
01020 static void I2C2_MspDeInit(I2C_HandleTypeDef *hi2c)
01021 {
01022   if (hi2c->Instance == DISCOVERY_I2C2)
01023   {
01024     /*##-1- Unconfigure the GPIOs ################################################*/
01025     /* Enable GPIO clock */
01026     DISCOVERY_I2C2_SDA_GPIO_CLK_ENABLE();
01027     DISCOVERY_I2C2_SCL_GPIO_CLK_ENABLE();
01028       
01029     /* Configure I2C Rx/Tx as alternate function  */
01030     HAL_GPIO_DeInit(DISCOVERY_I2C2_SCL_GPIO_PORT, (DISCOVERY_I2C2_SCL_PIN | DISCOVERY_I2C2_SDA_PIN));
01031       
01032     /*##-2- Unconfigure the Discovery I2C2 peripheral ############################*/
01033     /* Force and release I2C Peripheral */
01034     DISCOVERY_I2C2_FORCE_RESET();
01035     DISCOVERY_I2C2_RELEASE_RESET();
01036 
01037     /* Disable Discovery I2C2 clock */
01038     DISCOVERY_I2C2_CLK_DISABLE();
01039 
01040     /* Disable Discovery I2C2 interrupts */
01041     HAL_NVIC_DisableIRQ(DISCOVERY_I2C2_EV_IRQn);
01042     HAL_NVIC_DisableIRQ(DISCOVERY_I2C2_ER_IRQn);
01043   }
01044 }
01045 
01046 /**
01047   * @brief  Write a value in a register of the device through BUS.
01048   * @param  Addr: Device address on BUS Bus.  
01049   * @param  Reg: The target register address to write
01050   * @param  RegSize: The target register size (can be 8BIT or 16BIT)
01051   * @param  Value: The target register value to be written 
01052   * @retval None 
01053   */
01054 static void I2C2_WriteData(uint16_t Addr, uint16_t Reg, uint16_t RegSize, uint8_t Value)
01055   {
01056   HAL_StatusTypeDef status = HAL_OK;
01057   
01058   status = HAL_I2C_Mem_Write(&I2c2Handle, Addr, (uint16_t)Reg, RegSize, &Value, 1, I2c2Timeout); 
01059   
01060   /* Check the communication status */
01061   if(status != HAL_OK)
01062   {
01063     /* Re-Initiaize the BUS */
01064     I2C2_Error();
01065   }
01066 }
01067 
01068 /**
01069   * @brief  Write a value in a register of the device through BUS.
01070   * @param  Addr: Device address on BUS Bus.  
01071   * @param  Reg: The target register address to write
01072   * @param  RegSize: The target register size (can be 8BIT or 16BIT)
01073   * @param  pBuffer: The target register value to be written 
01074   * @param  Length: buffer size to be written
01075   * @retval None
01076   */
01077 static HAL_StatusTypeDef I2C2_WriteBuffer(uint16_t Addr, uint16_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length)
01078 {
01079   HAL_StatusTypeDef status = HAL_OK;
01080   
01081   status = HAL_I2C_Mem_Write(&I2c2Handle, Addr, (uint16_t)Reg, RegSize, pBuffer, Length, I2c2Timeout); 
01082 
01083   /* Check the communication status */
01084   if(status != HAL_OK)
01085   {
01086     /* Re-Initiaize the BUS */
01087     I2C2_Error();
01088   }
01089   
01090   return status;
01091 }
01092 
01093 /**
01094   * @brief  Read a register of the device through BUS
01095   * @param  Addr: Device address on BUS
01096   * @param  Reg: The target register address to read
01097   * @param  RegSize: The target register size (can be 8BIT or 16BIT)
01098   * @retval read register value
01099   */
01100 static uint8_t I2C2_ReadData(uint16_t Addr, uint16_t Reg, uint16_t RegSize)
01101 {
01102   HAL_StatusTypeDef status = HAL_OK;
01103   uint8_t value = 0x0;
01104   
01105   status = HAL_I2C_Mem_Read(&I2c2Handle, Addr, Reg, RegSize, &value, 1, I2c2Timeout);
01106     
01107   /* Check the communication status */
01108   if(status != HAL_OK)
01109   {
01110     /* Re-Initiaize the BUS */
01111     I2C2_Error();
01112   }
01113   
01114   return value;
01115 }
01116 
01117 /**
01118   * @brief  Reads multiple data on the BUS.
01119   * @param  Addr: I2C Address
01120   * @param  Reg: Reg Address 
01121   * @param  RegSize : The target register size (can be 8BIT or 16BIT)
01122   * @param  pBuffer: pointer to read data buffer
01123   * @param  Length: length of the data
01124   * @retval 0 if no problems to read multiple data
01125   */
01126 static HAL_StatusTypeDef I2C2_ReadBuffer(uint16_t Addr, uint16_t Reg, uint16_t RegSize, uint8_t *pBuffer, uint16_t Length)
01127 {
01128   HAL_StatusTypeDef status = HAL_OK;
01129 
01130   status = HAL_I2C_Mem_Read(&I2c2Handle, Addr, (uint16_t)Reg, RegSize, pBuffer, Length, I2c2Timeout);
01131   
01132   /* Check the communication status */
01133   if(status != HAL_OK)
01134   {
01135     /* Re-Initiaize the BUS */
01136     I2C2_Error();
01137   }
01138   
01139   return status;
01140 }
01141 
01142 /**
01143   * @brief Discovery I2C2 error treatment function
01144   * @retval None
01145   */
01146 static void I2C2_Error (void)
01147 {
01148   /* De-initialize the I2C communication BUS */
01149   HAL_I2C_DeInit(&I2c2Handle);
01150   
01151   /* Re- Initiaize the I2C communication BUS */
01152   I2C2_Init();
01153 }
01154 #endif /*HAL_I2C_MODULE_ENABLED*/
01155 
01156 
01157 /*******************************************************************************
01158                             LINK OPERATIONS
01159 *******************************************************************************/
01160 #if defined(HAL_SPI_MODULE_ENABLED)
01161 /*********************** LINK ACCELEROMETER ***********************************/
01162 /**
01163   * @brief  Configures COMPASS/ACCELEROMETER io interface.
01164   * @retval None
01165   */
01166 void ACCELERO_IO_Init(void)
01167 {
01168   GPIO_InitTypeDef GPIO_InitStructure;
01169      
01170   /* Enable CS GPIO clock and  Configure GPIO PIN for Gyroscope Chip select */
01171   ACCELERO_CS_GPIO_CLK_ENABLE();
01172   GPIO_InitStructure.Pin = ACCELERO_CS_PIN;
01173   GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
01174   GPIO_InitStructure.Pull  = GPIO_NOPULL;
01175   GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
01176   HAL_GPIO_Init(ACCELERO_CS_GPIO_PORT, &GPIO_InitStructure);
01177 
01178   /* Deselect : Chip Select high */
01179   ACCELERO_CS_HIGH();
01180   
01181   SPIx_Init();
01182 }
01183 
01184 /**
01185   * @brief  De-Configures COMPASS/ACCELEROMETER io interface.
01186   * @retval None
01187   */
01188 void ACCELERO_IO_DeInit(void)
01189 {
01190   GPIO_InitTypeDef GPIO_InitStructure;
01191      
01192   /* Enable CS GPIO clock and  Configure GPIO PIN for Gyroscope Chip select */
01193   ACCELERO_CS_GPIO_CLK_ENABLE();
01194   GPIO_InitStructure.Pin = ACCELERO_CS_PIN;
01195   GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
01196   GPIO_InitStructure.Pull  = GPIO_NOPULL;
01197   GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
01198   HAL_GPIO_Init(ACCELERO_CS_GPIO_PORT, &GPIO_InitStructure);
01199 
01200   /* Deselect : Chip Select high */
01201   ACCELERO_CS_HIGH();
01202 
01203   /* Uninitialize SPI bus */
01204   SPIx_DeInit();
01205 }
01206 
01207 /**
01208   * @brief  Configures COMPASS / ACCELERO click IT
01209   * @retval None
01210   */
01211 void ACCELERO_IO_ITConfig(void)
01212 {
01213 }
01214 
01215 /**
01216   * @brief  Writes one byte to the COMPASS / ACCELEROMETER.
01217   * @param  RegisterAddr specifies the COMPASS / ACCELEROMETER register to be written.
01218   * @param  Value : Data to be written
01219   * @retval   None
01220  */
01221 void ACCELERO_IO_Write(uint8_t RegisterAddr, uint8_t Value)
01222 {
01223   ACCELERO_CS_LOW();
01224   __SPI_DIRECTION_1LINE_TX(&SpiHandle);
01225   /* call SPI Read data bus function */
01226   SPIx_Write(RegisterAddr);
01227   SPIx_Write(Value);
01228   ACCELERO_CS_HIGH();
01229 }
01230 
01231 /**
01232   * @brief  Reads a block of data from the COMPASS / ACCELEROMETER.
01233   * @param  RegisterAddr : specifies the COMPASS / ACCELEROMETER internal address register to read from
01234   * @retval ACCELEROMETER register value
01235   */ 
01236 uint8_t ACCELERO_IO_Read(uint8_t RegisterAddr)
01237 {
01238   RegisterAddr = RegisterAddr | ((uint8_t)0x80);
01239   ACCELERO_CS_LOW();
01240   __SPI_DIRECTION_1LINE_TX(&SpiHandle);
01241   SPIx_Write(RegisterAddr);
01242   __SPI_DIRECTION_1LINE_RX(&SpiHandle);
01243   uint8_t val = SPIx_Read();
01244   ACCELERO_CS_HIGH();
01245   return val;
01246 }
01247 
01248 /********************************* LINK MAGNETO *******************************/
01249 /**
01250   * @brief  Configures COMPASS/MAGNETO SPI interface.
01251   * @retval None
01252   */
01253 void MAGNETO_IO_Init(void)
01254 {
01255   GPIO_InitTypeDef GPIO_InitStructure;
01256   
01257   /* Enable CS GPIO clock and  Configure GPIO PIN for Gyroscope Chip select */  
01258   MAGNETO_CS_GPIO_CLK_ENABLE();  
01259   GPIO_InitStructure.Pin = MAGNETO_CS_PIN;
01260   GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
01261   GPIO_InitStructure.Pull  = GPIO_NOPULL;
01262   GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
01263   HAL_GPIO_Init(MAGNETO_CS_GPIO_PORT, &GPIO_InitStructure);
01264 
01265   /* Deselect : Chip Select high */
01266   MAGNETO_CS_HIGH();
01267   
01268   SPIx_Init();
01269 }
01270 
01271 /**
01272   * @brief  de-Configures COMPASS/MAGNETO SPI interface.
01273   * @retval None
01274   */
01275 void MAGNETO_IO_DeInit(void)
01276 {
01277   GPIO_InitTypeDef GPIO_InitStructure;
01278   
01279   /* Enable CS GPIO clock and  Configure GPIO PIN for Gyroscope Chip select */  
01280   MAGNETO_CS_GPIO_CLK_ENABLE();  
01281   GPIO_InitStructure.Pin = MAGNETO_CS_PIN;
01282   GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
01283   GPIO_InitStructure.Pull  = GPIO_NOPULL;
01284   GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
01285   HAL_GPIO_Init(MAGNETO_CS_GPIO_PORT, &GPIO_InitStructure);
01286 
01287   /* Deselect : Chip Select high */
01288   MAGNETO_CS_HIGH();
01289   
01290    HAL_GPIO_DeInit(MAGNETO_CS_GPIO_PORT, MAGNETO_INT1_PIN|MAGNETO_DRDY_PIN);
01291 
01292 
01293   /* Uninitialize SPI bus */
01294   SPIx_DeInit();
01295 }
01296 
01297 /**
01298   * @brief  Writes one byte to the COMPASS/MAGNETO.
01299   * @param  RegisterAddr specifies the COMPASS/MAGNETO register to be written.
01300   * @param  Value : Data to be written
01301   * @retval   None
01302  */
01303 void MAGNETO_IO_Write(uint8_t RegisterAddr, uint8_t Value)
01304 {
01305   MAGNETO_CS_LOW();
01306   __SPI_DIRECTION_1LINE_TX(&SpiHandle);
01307   /* call SPI Read data bus function */
01308   SPIx_Write(RegisterAddr);
01309   SPIx_Write(Value);
01310   MAGNETO_CS_HIGH();
01311 }
01312 
01313 /**
01314   * @brief  Reads a block of data from the COMPASS/MAGNETO.
01315   * @param  RegisterAddr : specifies the COMPASS/MAGNETO internal address register to read from
01316   * @retval ACCELEROMETER register value
01317   */ 
01318 uint8_t MAGNETO_IO_Read(uint8_t RegisterAddr)
01319 {
01320   MAGNETO_CS_LOW();
01321   __SPI_DIRECTION_1LINE_TX(&SpiHandle);
01322   SPIx_Write(RegisterAddr | 0x80);
01323   __SPI_DIRECTION_1LINE_RX(&SpiHandle);
01324   uint8_t val = SPIx_Read();
01325   MAGNETO_CS_HIGH();
01326   return val;
01327 }
01328 
01329 /********************************* LINK GYRO *****************************/
01330 /**
01331   * @brief  Configures the GYRO SPI interface.
01332   * @retval None
01333   */
01334 void GYRO_IO_Init(void)
01335 {
01336   GPIO_InitTypeDef GPIO_InitStructure;
01337   
01338     
01339   /* Case GYRO not used in the demonstration software except being set in
01340      low power mode.
01341      To avoid access conflicts with accelerometer and magnetometer, 
01342      initialize  XL_CS and MAG_CS pins then deselect these I/O */
01343   ACCELERO_CS_GPIO_CLK_ENABLE();
01344   GPIO_InitStructure.Pin = ACCELERO_CS_PIN;
01345   GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
01346   GPIO_InitStructure.Pull  = GPIO_NOPULL;
01347   GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
01348   HAL_GPIO_Init(ACCELERO_CS_GPIO_PORT, &GPIO_InitStructure);
01349 
01350   /* Deselect : Chip Select high */
01351   ACCELERO_CS_HIGH();    
01352   
01353    /* Enable CS GPIO clock and  Configure GPIO PIN for Gyroscope Chip select */  
01354   MAGNETO_CS_GPIO_CLK_ENABLE();  
01355   GPIO_InitStructure.Pin = MAGNETO_CS_PIN;
01356   GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
01357   GPIO_InitStructure.Pull  = GPIO_NOPULL;
01358   GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
01359   HAL_GPIO_Init(MAGNETO_CS_GPIO_PORT, &GPIO_InitStructure);
01360 
01361   /* Deselect : Chip Select high */
01362   MAGNETO_CS_HIGH();
01363     
01364   
01365   /* Configure the Gyroscope Control pins ---------------------------------*/
01366   /* Enable CS GPIO clock and  Configure GPIO PIN for Gyroscope Chip select */  
01367   GYRO_CS_GPIO_CLK_ENABLE();  
01368   GPIO_InitStructure.Pin = GYRO_CS_PIN;
01369   GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
01370   GPIO_InitStructure.Pull  = GPIO_NOPULL;
01371   GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
01372   HAL_GPIO_Init(GYRO_CS_GPIO_PORT, &GPIO_InitStructure);
01373 
01374   /* Deselect : Chip Select high */
01375   GYRO_CS_HIGH();
01376 
01377   /* Enable INT1, INT2 GPIO clock and Configure GPIO PINs to detect Interrupts */
01378   GYRO_INT1_GPIO_CLK_ENABLE();
01379   GPIO_InitStructure.Pin = GYRO_INT1_PIN;
01380   GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
01381   GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
01382   GPIO_InitStructure.Pull= GPIO_NOPULL;
01383   HAL_GPIO_Init(GYRO_INT1_GPIO_PORT, &GPIO_InitStructure);
01384   
01385   GYRO_INT2_GPIO_CLK_ENABLE();
01386   GPIO_InitStructure.Pin = GYRO_INT2_PIN;
01387   HAL_GPIO_Init(GYRO_INT2_GPIO_PORT, &GPIO_InitStructure);
01388   
01389   SPIx_Init();
01390   
01391 }
01392 
01393 
01394 /**
01395   * @brief  de-Configures GYRO SPI interface.
01396   * @retval None
01397   */
01398 void GYRO_IO_DeInit(void)
01399 {
01400  GPIO_InitTypeDef GPIO_InitStructure;
01401   /* Enable CS GPIO clock */
01402   GYRO_CS_GPIO_CLK_ENABLE();
01403    
01404   GPIO_InitStructure.Pin = GYRO_CS_PIN;
01405   GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
01406   GPIO_InitStructure.Pull  = GPIO_NOPULL;
01407   GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
01408   HAL_GPIO_Init(GYRO_CS_GPIO_PORT, &GPIO_InitStructure);
01409 
01410   /* Deselect : Chip Select high */
01411   GYRO_CS_HIGH();
01412   
01413   GYRO_INT1_GPIO_CLK_ENABLE();
01414   GYRO_INT2_GPIO_CLK_ENABLE();
01415 
01416   /* Uninitialize the INT1/INT2 Pins */
01417   HAL_GPIO_DeInit(GYRO_INT1_GPIO_PORT, GYRO_INT1_PIN);
01418   HAL_GPIO_DeInit(GYRO_INT2_GPIO_PORT, GYRO_INT2_PIN);
01419 
01420   /* Uninitialize SPI bus */
01421   SPIx_DeInit();
01422 }
01423 
01424 /**
01425   * @brief  Writes one byte to the GYRO.
01426   * @param  pBuffer : pointer to the buffer  containing the data to be written to the GYRO.
01427   * @param  WriteAddr : GYRO's internal address to write to.
01428   * @param  NumByteToWrite: Number of bytes to write.
01429   * @retval None
01430   */
01431 void GYRO_IO_Write(uint8_t* pBuffer, uint8_t WriteAddr, uint16_t NumByteToWrite)
01432 {
01433   /* Configure the MS bit: 
01434        - When 0, the address will remain unchanged in multiple read/write commands.
01435        - When 1, the address will be auto incremented in multiple read/write commands.
01436   */
01437   if(NumByteToWrite > 0x01)
01438   {
01439     WriteAddr |= (uint8_t)MULTIPLEBYTE_CMD;
01440   }
01441   /* Set chip select Low at the start of the transmission */
01442   GYRO_CS_LOW();
01443   __SPI_DIRECTION_2LINES(&SpiHandle);
01444   
01445   /* Send the Address of the indexed register */
01446   SPIx_WriteRead(WriteAddr);
01447   
01448   /* Send the data that will be written into the device (MSB First) */
01449   while(NumByteToWrite >= 0x01)
01450   {
01451     SPIx_WriteRead(*pBuffer);
01452     NumByteToWrite--;
01453     pBuffer++;
01454   }
01455   
01456   /* Set chip select High at the end of the transmission */ 
01457   GYRO_CS_HIGH();
01458 }
01459 
01460 /**
01461   * @brief  Reads a block of data from the GYROSCOPE.
01462   * @param  pBuffer : pointer to the buffer that receives the data read from the GYROSCOPE.
01463   * @param  ReadAddr : GYROSCOPE's internal address to read from.
01464   * @param  NumByteToRead : number of bytes to read from the GYROSCOPE.
01465   * @retval None
01466   */
01467 void GYRO_IO_Read(uint8_t* pBuffer, uint8_t ReadAddr, uint16_t NumByteToRead)
01468 {  
01469   if(NumByteToRead > 0x01)
01470   {
01471     ReadAddr |= (uint8_t)(READWRITE_CMD | MULTIPLEBYTE_CMD);
01472   }
01473   else
01474   {
01475     ReadAddr |= (uint8_t)READWRITE_CMD;
01476   }
01477   /* Set chip select Low at the start of the transmission */
01478   GYRO_CS_LOW();
01479   __SPI_DIRECTION_2LINES(&SpiHandle);
01480   /* Send the Address of the indexed register */
01481   SPIx_WriteRead(ReadAddr);
01482   
01483   /* Receive the data that will be read from the device (MSB First) */
01484   while(NumByteToRead > 0x00)
01485   {
01486     /* Send dummy byte (0x00) to generate the SPI clock to GYROSCOPE (Slave device) */
01487     *pBuffer = SPIx_WriteRead(0x00);
01488     NumByteToRead--;
01489     pBuffer++;
01490   }
01491   
01492   /* Set chip select High at the end of the transmission */ 
01493   GYRO_CS_HIGH();
01494 }
01495 #endif /* HAL_SPI_MODULE_ENABLED */
01496 
01497 #if defined(HAL_I2C_MODULE_ENABLED)
01498 /********************************* LINK MFX ***********************************/
01499 /**
01500   * @brief  Initializes MFX low level.
01501   * @retval None
01502   */
01503 void MFX_IO_Init(void)
01504 {
01505   /* I2C2 init */
01506   I2C2_Init();
01507 }
01508 /**
01509   * @brief  Deinitializes MFX low level.
01510   * @retval None
01511   */
01512 void MFX_IO_DeInit(void)
01513 {
01514   GPIO_InitTypeDef  GPIO_InitStruct;
01515 
01516   /* Enable wakeup gpio clock */
01517   IDD_WAKEUP_GPIO_CLK_ENABLE();
01518   
01519   /* MFX wakeup pin configuration */
01520   GPIO_InitStruct.Pin   = IDD_WAKEUP_PIN;
01521   GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
01522   GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
01523   GPIO_InitStruct.Pull  = GPIO_PULLDOWN;
01524   HAL_GPIO_Init(IDD_WAKEUP_GPIO_PORT, &GPIO_InitStruct);
01525 
01526   /* DeInit interrupt pin : disable IRQ before to avoid spurious interrupt */
01527   HAL_NVIC_DisableIRQ((IRQn_Type)(IDD_INT_EXTI_IRQn));
01528   IDD_INT_GPIO_CLK_ENABLE();
01529   HAL_GPIO_DeInit(IDD_INT_GPIO_PORT, IDD_INT_PIN);
01530 
01531   /* I2C2 Deinit */
01532   I2C2_DeInit();
01533 }
01534 
01535 /**
01536   * @brief  Configures MFX low level interrupt.
01537   * @retval None
01538   */
01539 void MFX_IO_ITConfig(void)
01540 {
01541   GPIO_InitTypeDef  GPIO_InitStruct;
01542 
01543   /* Enable the GPIO clock */
01544   IDD_INT_GPIO_CLK_ENABLE();
01545 
01546   /* MFX_OUT_IRQ (normally used for EXTI_WKUP) */
01547   GPIO_InitStruct.Pin   = IDD_INT_PIN;
01548   GPIO_InitStruct.Pull  = GPIO_PULLDOWN;
01549   GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
01550   GPIO_InitStruct.Mode  = GPIO_MODE_IT_RISING;
01551   HAL_GPIO_Init(IDD_INT_GPIO_PORT, &GPIO_InitStruct);
01552   
01553   /* Enable and set GPIO EXTI Interrupt to the lowest priority */
01554   HAL_NVIC_SetPriority((IRQn_Type)(IDD_INT_EXTI_IRQn), 0x0F, 0x0F);
01555   HAL_NVIC_EnableIRQ((IRQn_Type)(IDD_INT_EXTI_IRQn));
01556 }
01557 
01558 /**
01559   * @brief  Configures MFX wke up  pin.
01560   * @retval None
01561   */
01562 void MFX_IO_EnableWakeupPin(void)
01563 {
01564   GPIO_InitTypeDef  GPIO_InitStruct;
01565   
01566   /* Enable wakeup gpio clock */
01567   IDD_WAKEUP_GPIO_CLK_ENABLE();
01568   
01569   /* MFX wakeup pin configuration */
01570   GPIO_InitStruct.Pin   = IDD_WAKEUP_PIN;
01571   GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
01572   GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
01573   GPIO_InitStruct.Pull  = GPIO_NOPULL;
01574   HAL_GPIO_Init(IDD_WAKEUP_GPIO_PORT, &GPIO_InitStruct);
01575 }
01576 
01577 /**
01578   * @brief  Wakeup MFX.
01579   * @retval None
01580   */
01581 void MFX_IO_Wakeup(void)
01582 {
01583   /* Set Wakeup pin to high to wakeup Idd measurement component from standby mode */
01584   HAL_GPIO_WritePin(IDD_WAKEUP_GPIO_PORT, IDD_WAKEUP_PIN, GPIO_PIN_SET);
01585 
01586   /* Wait */
01587   HAL_Delay(1);
01588 
01589   /* Set gpio pin basck to low */
01590   HAL_GPIO_WritePin(IDD_WAKEUP_GPIO_PORT, IDD_WAKEUP_PIN, GPIO_PIN_RESET);
01591 }
01592 
01593 /**
01594   * @brief  MFX writes single data.
01595   * @param  Addr: I2C address
01596   * @param  Reg: Register address 
01597   * @param  Value: Data to be written
01598   * @retval None
01599   */
01600 void MFX_IO_Write(uint16_t Addr, uint8_t Reg, uint8_t Value)
01601 {
01602   I2C2_WriteData(Addr, Reg, I2C_MEMADD_SIZE_8BIT, Value);
01603 }
01604 
01605 /**
01606   * @brief  MFX reads single data.
01607   * @param  Addr: I2C address
01608   * @param  Reg: Register address 
01609   * @retval Read data
01610   */
01611 uint8_t MFX_IO_Read(uint16_t Addr, uint8_t Reg)
01612 {
01613   return I2C2_ReadData(Addr, Reg, I2C_MEMADD_SIZE_8BIT);
01614 }
01615 
01616 /**
01617   * @brief  MFX reads multiple data.
01618   * @param  Addr: I2C address
01619   * @param  Reg: Register address 
01620   * @param  Buffer: Pointer to data buffer
01621   * @param  Length: Length of the data
01622   * @retval Number of read data
01623   */
01624 uint16_t MFX_IO_ReadMultiple(uint16_t Addr, uint8_t Reg, uint8_t *Buffer, uint16_t Length)
01625 {
01626  return I2C2_ReadBuffer(Addr, (uint16_t)Reg, I2C_MEMADD_SIZE_8BIT, Buffer, Length);
01627 }
01628 
01629 /**
01630   * @brief  MFX writes multiple data.
01631   * @param  Addr: I2C address
01632   * @param  Reg: Register address 
01633   * @param  Buffer: Pointer to data buffer
01634   * @param  Length: Length of the data
01635   * @retval None
01636   */
01637 void MFX_IO_WriteMultiple(uint16_t Addr, uint8_t Reg, uint8_t *Buffer, uint16_t Length)
01638 {
01639   I2C2_WriteBuffer(Addr, (uint16_t)Reg, I2C_MEMADD_SIZE_8BIT, Buffer, Length);
01640 }
01641 
01642 /**
01643   * @brief  MFX delay 
01644   * @param  Delay: Delay in ms
01645   * @retval None
01646   */
01647 void MFX_IO_Delay(uint32_t Delay)
01648 {
01649   HAL_Delay(Delay);
01650 }
01651 
01652 
01653 /********************************* LINK AUDIO *********************************/
01654 /**
01655   * @brief  Initializes Audio low level.
01656   * @retval None
01657   */
01658 void AUDIO_IO_Init(void) 
01659 {
01660   GPIO_InitTypeDef  GPIO_InitStruct;
01661   
01662   /* Enable Reset GPIO Clock */
01663   AUDIO_RESET_GPIO_CLK_ENABLE();
01664   
01665   /* Audio reset pin configuration */
01666   GPIO_InitStruct.Pin = AUDIO_RESET_PIN; 
01667   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
01668   GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
01669   GPIO_InitStruct.Pull  = GPIO_NOPULL;
01670   HAL_GPIO_Init(AUDIO_RESET_GPIO, &GPIO_InitStruct);
01671 
01672   /* I2C bus init */
01673   I2C1_Init();
01674 
01675   /* Power Down the codec */
01676   CODEC_AUDIO_POWER_OFF();
01677 
01678   /* wait for a delay to insure registers erasing */
01679   HAL_Delay(5); 
01680 
01681   /* Power on the codec */
01682   CODEC_AUDIO_POWER_ON();
01683    
01684   /* wait for a delay to insure registers erasing */
01685   HAL_Delay(5); 
01686 }
01687 
01688 /**
01689   * @brief  Deinitializes Audio low level.
01690   * @retval None
01691   */
01692 void AUDIO_IO_DeInit(void)                       /* TO DO */
01693 {
01694   GPIO_InitTypeDef  GPIO_InitStruct;
01695   
01696   /***********************************************************************/
01697   /* In case of battery-supplied powered, there is no audio codec-based 
01698      features available. Set audio codec I/O default setting */
01699   /***********************************************************************/ 
01700   __HAL_RCC_GPIOE_CLK_ENABLE();  
01701   GPIO_InitStruct.Mode      = GPIO_MODE_OUTPUT_PP  ;
01702   GPIO_InitStruct.Pin       = (GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6);
01703   GPIO_InitStruct.Pull      = GPIO_PULLDOWN;
01704   GPIO_InitStruct.Speed     = GPIO_SPEED_HIGH; 
01705   HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
01706   HAL_GPIO_WritePin(GPIOE, GPIO_PIN_2, GPIO_PIN_RESET);
01707   HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET);
01708   HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_RESET);
01709   HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET);
01710   HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_RESET);
01711 
01712   /* I2C bus Deinit */
01713   I2C1_DeInit();
01714 }
01715 
01716 /**
01717   * @brief  Writes a single data.
01718   * @param  Addr: I2C address
01719   * @param  Reg: Reg address 
01720   * @param  Value: Data to be written
01721   * @retval None
01722   */
01723 void AUDIO_IO_Write(uint8_t Addr, uint8_t Reg, uint8_t Value)
01724 {
01725   I2C1_WriteBuffer(Addr, (uint16_t)Reg, I2C_MEMADD_SIZE_8BIT, &Value, 1);
01726 }
01727 
01728 /**
01729   * @brief  Reads a single data.
01730   * @param  Addr: I2C address
01731   * @param  Reg: Reg address 
01732   * @retval Data to be read
01733   */
01734 uint8_t AUDIO_IO_Read(uint8_t Addr, uint8_t Reg)
01735 {
01736   uint8_t Read_Value = 0;
01737   
01738   I2C1_ReadBuffer((uint16_t) Addr, (uint16_t) Reg, I2C_MEMADD_SIZE_8BIT, &Read_Value, 1); 
01739   
01740   return Read_Value;
01741 }
01742 
01743 /**
01744   * @brief  AUDIO Codec delay 
01745   * @param  Delay: Delay in ms
01746   * @retval None
01747   */
01748 void AUDIO_IO_Delay(uint32_t Delay)
01749 {
01750   HAL_Delay(Delay);
01751 }
01752 #endif /* HAL_I2C_MODULE_ENABLED */
01753 
01754 /**
01755   * @}
01756   */
01757 
01758 /**
01759   * @}
01760   */
01761 
01762 /**
01763   * @}
01764   */
01765   
01766 /**
01767   * @}
01768   */
01769 
01770 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Generated on Tue Jun 23 2015 17:15:45 for STM32L476G-Discovery BSP User Manual by   doxygen 1.7.6.1