Environmental Shield API
Diff: BSP/Nucleo-F401RE/nucleo-f401re.c
- Revision:
- 0:9e645e6ed2ce
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BSP/Nucleo-F401RE/nucleo-f401re.c Tue Aug 19 07:13:15 2014 +0000 @@ -0,0 +1,511 @@ +/** + ****************************************************************************** + * @file nucleo-f401re.c + * @author MCD Application Team + * @version V1.0.0 + * @date 22-April-2014 + * @brief This file provides set of firmware functions to manage: + * - LEDs and push-button available on NUCLEO-F401RE Kit + * from STMicroelectronics + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "nucleo-f401re.h" +//#include "cmsis_os.h" +//#include "stm32f4xx_hal.h" +//#include "stm32f4xx_hal_i2c.h" +//#include "stm32f4xx_hal_i2c_ex.h" + + +/** @addtogroup BSP + * @{ + */ + +/** @addtogroup NUCLEO_F401RE + * @{ + */ + +/** @addtogroup NUCLEO_F401RE_LOW_LEVEL + * @brief This file provides set of firmware functions to manage Leds and push-button + * available on NUCLEO-F401RE Kit from STMicroelectronics. + * @{ + */ + +/** @defgroup NUCLEO_F401RE_LOW_LEVEL_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup NUCLEO_F401RE_LOW_LEVEL_Private_Defines + * @{ + */ + +/** + * @brief STM32L0XX NUCLEO BSP Driver version number V1.0.0 + */ +#define __NUCLEO_F401RE_BSP_VERSION_MAIN (0x01) /*!< [31:24] main version */ +#define __NUCLEO_F401RE_BSP_VERSION_SUB1 (0x00) /*!< [23:16] sub1 version */ +#define __NUCLEO_F401RE_BSP_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ +#define __NUCLEO_F401RE_BSP_VERSION_RC (0x00) /*!< [7:0] release candidate */ +#define __NUCLEO_F401RE_BSP_VERSION ((__NUCLEO_F401RE_BSP_VERSION_MAIN << 24)\ + |(__NUCLEO_F401RE_BSP_VERSION_SUB1 << 16)\ + |(__NUCLEO_F401RE_BSP_VERSION_SUB2 << 8 )\ + |(__NUCLEO_F401RE_BSP_VERSION_RC)) + +/** + * @brief LINK SD Card + */ +#define SD_DUMMY_BYTE 0xFF +#define SD_NO_RESPONSE_EXPECTED 0x80 + +/** + * @} + */ + +/** @defgroup NUCLEO_F401RE_LOW_LEVEL_Private_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup NUCLEO_F401RE_LOW_LEVEL_Private_Variables + * @{ + */ +GPIO_TypeDef* GPIO_PORT[LEDn] = {LED2_GPIO_PORT}; + +const uint16_t GPIO_PIN[LEDn] = {LED2_PIN}; + +GPIO_TypeDef* BUTTON_PORT[BUTTONn] = {KEY_BUTTON_GPIO_PORT}; +const uint16_t BUTTON_PIN[BUTTONn] = {KEY_BUTTON_PIN}; +const uint16_t BUTTON_IRQn[BUTTONn] = {KEY_BUTTON_EXTI_IRQn}; + +/** + * @brief BUS variables + */ + +//uint32_t SpixTimeout = NUCLEO_SPIx_TIMEOUT_MAX; /*<! Value of Timeout when SPI communication fails */ +//static SPI_HandleTypeDef hnucleo_Spi; +//static ADC_HandleTypeDef hnucleo_Adc; + +/* ADC channel configuration structure declaration */ +//static ADC_ChannelConfTypeDef sConfig; + +/** + * @} + */ + +uint32_t I2C_SHIELDS_Timeout = NUCLEO_I2C_SHIELDS_TIMEOUT_MAX; /*<! Value of Timeout when I2C communication fails */ + +static I2C_HandleTypeDef I2C_SHIELDS_Handle; + +//osMutexId I2C1_Mutex_id = 0; + +/** @defgroup NUCLEO_F401RE_LOW_LEVEL_Private_FunctionPrototypes + * @{ + */ + +/* Link function for PRESSURE peripheral */ +void PRESSURE_IO_Init(void); +void PRESSURE_IO_ITConfig(void); +void PRESSURE_IO_Write(uint8_t* pBuffer, uint8_t DeviceAddr, uint8_t WriteAddr, uint16_t NumByteToWrite); +void PRESSURE_IO_Read(uint8_t* pBuffer, uint8_t DeviceAddr, uint8_t RegisterAddr, uint16_t NumByteToRead); + +/* Link function for UV peripheral */ +void UV_IO_Init(void); +void UV_IO_ITConfig(void); +void UV_IO_Write(uint8_t* pBuffer, uint8_t DeviceAddr, uint8_t WriteAddr, uint16_t NumByteToWrite); +void UV_IO_Read(uint8_t* pBuffer, uint8_t DeviceAddr, uint8_t RegisterAddr, uint16_t NumByteToRead); + +/* Link function for HUM_TEMP peripheral */ +void HUM_TEMP_IO_Init(void); +void HUM_TEMP_IO_ITConfig(void); +void HUM_TEMP_IO_Write(uint8_t* pBuffer, uint8_t DeviceAddr, uint8_t WriteAddr, uint16_t NumByteToWrite); +void HUM_TEMP_IO_Read(uint8_t* pBuffer, uint8_t DeviceAddr, uint8_t RegisterAddr, uint16_t NumByteToRead); + + +static void I2C_SHIELDS_MspInit(void); +static void I2C_SHIELDS_Error(uint8_t Addr); + +/** + * @} + */ + +/** @defgroup NUCLEO_F401RE_LOW_LEVEL_Private_Functions + * @{ + */ + +/** + * @brief This method returns the STM32L0XX NUCLEO BSP Driver revision + * @param None + * @retval version : 0xXYZR (8bits for each decimal, R for RC) + */ +uint32_t BSP_GetVersion(void) +{ + return __NUCLEO_F401RE_BSP_VERSION; +} + + +/** + * @brief Configures Button GPIO and EXTI Line. + * @param Button: Specifies the Button to be configured. + * This parameter should be: BUTTON_KEY + * @param ButtonMode: Specifies Button mode. + * This parameter can be one of following parameters: + * @arg BUTTON_MODE_GPIO: Button will be used as simple IO + * @arg BUTTON_MODE_EXTI: Button will be connected to EXTI line with interrupt + * generation capability + * @retval None + */ +void BSP_PB_Init(Button_TypeDef Button, ButtonMode_TypeDef Button_Mode) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + /* Enable the BUTTON Clock */ + BUTTONx_GPIO_CLK_ENABLE(Button); + __SYSCFG_CLK_ENABLE(); + + if(Button_Mode == BUTTON_MODE_GPIO) + { + /* Configure Button pin as input */ + GPIO_InitStruct.Pin = BUTTON_PIN[Button]; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FAST; + + HAL_GPIO_Init(BUTTON_PORT[Button], &GPIO_InitStruct); + } + + if(Button_Mode == BUTTON_MODE_EXTI) + { + /* Configure Button pin as input with External interrupt */ + GPIO_InitStruct.Pin = BUTTON_PIN[Button]; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FAST; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + HAL_GPIO_Init(BUTTON_PORT[Button], &GPIO_InitStruct); + + /* Enable and set Button EXTI Interrupt to the lowest priority */ + NVIC_SetPriority((IRQn_Type)(BUTTON_IRQn[Button]), 0x03); + HAL_NVIC_EnableIRQ((IRQn_Type)(BUTTON_IRQn[Button])); + } +} + +/** + * @brief Returns the selected Button state. + * @param Button: Specifies the Button to be checked. + * This parameter should be: BUTTON_KEY + * @retval The Button GPIO pin value. + */ +uint32_t BSP_PB_GetState(Button_TypeDef Button) +{ + return HAL_GPIO_ReadPin(BUTTON_PORT[Button], BUTTON_PIN[Button]); +} + +/******************************* I2C Routines**********************************/ +/** + * @brief Configures I2C interface. + * @param None + * @retval None + */ +static void I2C_SHIELDS_Init(void) +{ + if(HAL_I2C_GetState(&I2C_SHIELDS_Handle) == HAL_I2C_STATE_RESET) + { + /* I2C_SHIELDS peripheral configuration */ + I2C_SHIELDS_Handle.Init.ClockSpeed = NUCLEO_I2C_SHIELDS_SPEED; + I2C_SHIELDS_Handle.Init.DutyCycle = I2C_DUTYCYCLE_2; + I2C_SHIELDS_Handle.Init.OwnAddress1 = 0x33; + I2C_SHIELDS_Handle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + I2C_SHIELDS_Handle.Instance = NUCLEO_I2C_SHIELDS; + + /* Init the I2C */ + I2C_SHIELDS_MspInit(); + HAL_I2C_Init(&I2C_SHIELDS_Handle); + } +} + +/** + * @brief Write a value in a register of the device through BUS. + * @param Addr: Device address on BUS Bus. + * @param Reg: The target register address to write + * @param Value: The target register value to be written + * @retval HAL status + */ + +static void I2C_SHIELDS_WriteData(uint8_t* pBuffer, uint8_t Addr, uint8_t Reg, uint16_t Size) +{ + HAL_StatusTypeDef status = HAL_OK; + + status = HAL_I2C_Mem_Write(&I2C_SHIELDS_Handle, Addr, (uint16_t)Reg, I2C_MEMADD_SIZE_8BIT, pBuffer, Size, I2C_SHIELDS_Timeout); + + /* Check the communication status */ + if(status != HAL_OK) + { + /* Execute user timeout callback */ + I2C_SHIELDS_Error(Addr); + } +} + +/** + * @brief Read a register of the device through BUS + * @param Addr: Device address on BUS . + * @param Reg: The target register address to read + * @retval HAL status + */ +static void I2C_SHIELDS_ReadData(uint8_t* pBuffer, uint8_t Addr, uint8_t Reg, uint16_t Size) +{ + HAL_StatusTypeDef status = HAL_OK; + + status = HAL_I2C_Mem_Read(&I2C_SHIELDS_Handle, Addr, (uint16_t)Reg, I2C_MEMADD_SIZE_8BIT, pBuffer, Size, I2C_SHIELDS_Timeout); + + /* Check the communication status */ + if(status != HAL_OK) + { + /* Execute user timeout callback */ + I2C_SHIELDS_Error(Addr); + } + +} + +/** + * @brief Manages error callback by re-initializing I2C. + * @param Addr: I2C Address + * @retval None + */ +static void I2C_SHIELDS_Error(uint8_t Addr) +{ + /* De-initialize the I2C comunication bus */ + HAL_I2C_DeInit(&I2C_SHIELDS_Handle); + + /* Re-Initiaize the I2C comunication bus */ + I2C_SHIELDS_Init(); +} + +/** + * @brief I2C MSP Initialization + * @param None + * @retval None + */ +static void I2C_SHIELDS_MspInit(void) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + /*if(!NUCLEO_I2C_SHIELDS_MUTEX) { + NUCLEO_I2C_SHIELDS_MUTEX = osMutexCreate(0); + }*/ + /* Enable I2C GPIO clocks */ + NUCLEO_I2C_SHIELDS_SCL_SDA_GPIO_CLK_ENABLE(); + + /* I2C_SHIELDS SCL and SDA pins configuration -------------------------------------*/ + GPIO_InitStruct.Pin = NUCLEO_I2C_SHIELDS_SCL_PIN | NUCLEO_I2C_SHIELDS_SDA_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Speed = GPIO_SPEED_FAST; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Alternate = NUCLEO_I2C_SHIELDS_SCL_SDA_AF; + HAL_GPIO_Init(NUCLEO_I2C_SHIELDS_SCL_SDA_GPIO_PORT, &GPIO_InitStruct); + + /* Enable the I2C_SHIELDS peripheral clock */ + NUCLEO_I2C_SHIELDS_CLK_ENABLE(); + + /* Force the I2C peripheral clock reset */ + NUCLEO_I2C_SHIELDS_FORCE_RESET(); + + /* Release the I2C peripheral clock reset */ + NUCLEO_I2C_SHIELDS_RELEASE_RESET(); + + /* Enable and set I2C_SHIELDS Interrupt to the highest priority */ + HAL_NVIC_SetPriority(NUCLEO_I2C_SHIELDS_EV_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(NUCLEO_I2C_SHIELDS_EV_IRQn); + + /* Enable and set I2C_SHIELDS Interrupt to the highest priority */ + HAL_NVIC_SetPriority(NUCLEO_I2C_SHIELDS_ER_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(NUCLEO_I2C_SHIELDS_ER_IRQn); +} + + +/********************************* LINK PRESSURE *****************************/ +/** + * @brief Configures Pressure I2C interface. + * @param None + * @retval None + */ +void PRESSURE_IO_Init(void) +{ + I2C_SHIELDS_Init(); +} + +/** + * @brief Writes a buffer to the Pressure sensor. + * @param pBuffer: pointer to data to be written. + * @param DeviceAddr: specifies the slave address to be programmed. + * @param RegisterAddr: specifies the Pressure register to be written. + * @param NumByteToWrite: number of bytes to be written. + * @retval None. + */ +void PRESSURE_IO_Write(uint8_t* pBuffer, uint8_t DeviceAddr, uint8_t RegisterAddr, uint16_t NumByteToWrite) +{ + //NUCLEO_I2C_SHIELDS_MUTEX_TAKE(); + /* call I2C_SHIELDS Read data bus function */ + I2C_SHIELDS_WriteData(pBuffer, DeviceAddr, RegisterAddr, NumByteToWrite); + //NUCLEO_I2C_SHIELDS_MUTEX_RELEASE(); +} + +/** + * @brief Reads a buffer from the Pressure sensor. + * @param pBuffer: pointer to data to be read. + * @param DeviceAddr: specifies the address of the device. + * @param RegisterAddr: specifies the Pressure internal address register to read from. + * @param NumByteToRead: number of bytes to be read. + * @retval None. + */ +void PRESSURE_IO_Read(uint8_t* pBuffer, uint8_t DeviceAddr, uint8_t RegisterAddr, uint16_t NumByteToRead) +{ + //NUCLEO_I2C_SHIELDS_MUTEX_TAKE(); + /* call I2C_SHIELDS Read data bus function */ + I2C_SHIELDS_ReadData(pBuffer, DeviceAddr, RegisterAddr, NumByteToRead); + //NUCLEO_I2C_SHIELDS_MUTEX_RELEASE(); +} + + + + +/********************************* LINK UVI *****************************/ +/** + * @brief Configures Uvi I2C interface. + * @param None + * @retval None + */ +void UV_IO_Init(void) +{ + I2C_SHIELDS_Init(); +} + +/** + * @brief Writes a buffer to the Uvi sensor. + * @param pBuffer: pointer to data to be written. + * @param DeviceAddr: specifies the slave address to be programmed. + * @param RegisterAddr: specifies the Pressure register to be written. + * @param NumByteToWrite: number of bytes to be written. + * @retval None. + */ +void UV_IO_Write(uint8_t* pBuffer, uint8_t DeviceAddr, uint8_t RegisterAddr, uint16_t NumByteToWrite) +{ + //NUCLEO_I2C_SHIELDS_MUTEX_TAKE(); + /* call I2C_SHIELDS Read data bus function */ + I2C_SHIELDS_WriteData(pBuffer, DeviceAddr, RegisterAddr, NumByteToWrite); + //NUCLEO_I2C_SHIELDS_MUTEX_RELEASE(); +} + +/** + * @brief Reads a buffer from the Uvi sensor. + * @param pBuffer: pointer to data to be read. + * @param DeviceAddr: specifies the address of the device. + * @param RegisterAddr: specifies the Pressure internal address register to read from. + * @param NumByteToRead: number of bytes to be read. + * @retval None. + */ +void UV_IO_Read(uint8_t* pBuffer, uint8_t DeviceAddr, uint8_t RegisterAddr, uint16_t NumByteToRead) +{ + //NUCLEO_I2C_SHIELDS_MUTEX_TAKE(); + /* call I2C_SHIELDS Read data bus function */ + I2C_SHIELDS_ReadData(pBuffer, DeviceAddr, RegisterAddr, NumByteToRead); + //NUCLEO_I2C_SHIELDS_MUTEX_RELEASE(); +} + + + + + +/********************************* LINK HUM_TEMP *****************************/ +/** + * @brief Configures Uvi I2C interface. + * @param None + * @retval None + */ +void HUM_TEMP_IO_Init(void) +{ + I2C_SHIELDS_Init(); +} + +/** + * @brief Writes a buffer to the Uvi sensor. + * @param pBuffer: pointer to data to be written. + * @param DeviceAddr: specifies the slave address to be programmed. + * @param RegisterAddr: specifies the Pressure register to be written. + * @param NumByteToWrite: number of bytes to be written. + * @retval None. + */ +void HUM_TEMP_IO_Write(uint8_t* pBuffer, uint8_t DeviceAddr, uint8_t RegisterAddr, uint16_t NumByteToWrite) +{ + //NUCLEO_I2C_SHIELDS_MUTEX_TAKE(); + /* call I2C_SHIELDS Read data bus function */ + I2C_SHIELDS_WriteData(pBuffer, DeviceAddr, RegisterAddr, NumByteToWrite); + //NUCLEO_I2C_SHIELDS_MUTEX_RELEASE(); +} + +/** + * @brief Reads a buffer from the Uvi sensor. + * @param pBuffer: pointer to data to be read. + * @param DeviceAddr: specifies the address of the device. + * @param RegisterAddr: specifies the Pressure internal address register to read from. + * @param NumByteToRead: number of bytes to be read. + * @retval None. + */ +void HUM_TEMP_IO_Read(uint8_t* pBuffer, uint8_t DeviceAddr, uint8_t RegisterAddr, uint16_t NumByteToRead) +{ + //NUCLEO_I2C_SHIELDS_MUTEX_TAKE(); + /* call I2C_SHIELDS Read data bus function */ + I2C_SHIELDS_ReadData(pBuffer, DeviceAddr, RegisterAddr, NumByteToRead); + //NUCLEO_I2C_SHIELDS_MUTEX_RELEASE(); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +