STM32CubeF4/Drivers/BSP/STM32F429I-Discovery/stm32f429i_discovery_io.c
2022-03-09 10:37:11 +01:00

205 lines
5.3 KiB
C

/**
******************************************************************************
* @file stm32f429i_discovery_io.c
* @author MCD Application Team
* @brief This file provides a set of functions needed to manage the STMPE811
* IO Expander device mounted on STM32F429I-Discovery Kit.
******************************************************************************
* @attention
*
* Copyright (c) 2017 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f429i_discovery_io.h"
/** @addtogroup BSP
* @{
*/
/** @addtogroup STM32F429I_DISCOVERY
* @{
*/
/** @defgroup STM32F429I_DISCOVERY_IO STM32F429I DISCOVERY IO
* @{
*/
/** @defgroup STM32F429I_DISCOVERY_IO_Private_Types_Definitions STM32F429I DISCOVERY IO Private Types Definitions
* @{
*/
/**
* @}
*/
/** @defgroup STM32F429I_DISCOVERY_IO_Private_Defines STM32F429I DISCOVERY IO Private Defines
* @{
*/
/**
* @}
*/
/** @defgroup STM32F429I_DISCOVERY_IO_Private_Macros STM32F429I DISCOVERY IO Private Macros
* @{
*/
/**
* @}
*/
/** @defgroup STM32F429I_DISCOVERY_IO_Private_Variables STM32F429I DISCOVERY IO Private Variables
* @{
*/
static IO_DrvTypeDef *IoDrv;
/**
* @}
*/
/** @defgroup STM32F429I_DISCOVERY_IO_Private_Function_Prototypes STM32F429I DISCOVERY IO Private Function Prototypes
* @{
*/
/**
* @}
*/
/** @defgroup STM32F429I_DISCOVERY_IO_Private_Functions STM32F429I DISCOVERY IO Private Functions
* @{
*/
/**
* @brief Initializes and configures the IO functionalities and configures all
* necessary hardware resources (GPIOs, clocks..).
* @note BSP_IO_Init() is using HAL_Delay() function to ensure that stmpe811
* IO Expander is correctly reset. HAL_Delay() function provides accurate
* delay (in milliseconds) based on variable incremented in SysTick ISR.
* This implies that if BSP_IO_Init() is called from a peripheral ISR process,
* then the SysTick interrupt must have higher priority (numerically lower)
* than the peripheral interrupt. Otherwise the caller ISR process will be blocked.
* @retval IO_OK if all initializations done correctly. Other value if error.
*/
uint8_t BSP_IO_Init(void)
{
uint8_t ret = IO_ERROR;
/* Read ID and verify the IO expander is ready */
if(stmpe811_io_drv.ReadID(IO_I2C_ADDRESS) == STMPE811_ID)
{
/* Initialize the IO driver structure */
IoDrv = &stmpe811_io_drv;
ret = IO_OK;
}
if(ret == IO_OK)
{
IoDrv->Init(IO_I2C_ADDRESS);
IoDrv->Start(IO_I2C_ADDRESS, IO_PIN_ALL);
}
return ret;
}
/**
* @brief Gets the selected pins IT status.
* @param IoPin: The selected pins to check the status.
* This parameter could be any combination of the IO pins.
* @retval Status of IO Pin checked.
*/
uint8_t BSP_IO_ITGetStatus(uint16_t IoPin)
{
/* Return the IO Pin IT status */
return (IoDrv->ITStatus(IO_I2C_ADDRESS, IoPin));
}
/**
* @brief Clears all the IO IT pending bits
*/
void BSP_IO_ITClear(void)
{
/* Clear all IO IT pending bits */
IoDrv->ClearIT(IO_I2C_ADDRESS, IO_PIN_ALL);
}
/**
* @brief Configures the IO pin(s) according to IO mode structure value.
* @param IoPin: IO pin(s) to be configured.
* This parameter could be any combination of the following values:
* @arg STMPE811_PIN_x: where x can be from 0 to 7.
* @param IoMode: The IO pin mode to configure, could be one of the following values:
* @arg IO_MODE_INPUT
* @arg IO_MODE_OUTPUT
* @arg IO_MODE_IT_RISING_EDGE
* @arg IO_MODE_IT_FALLING_EDGE
* @arg IO_MODE_IT_LOW_LEVEL
* @arg IO_MODE_IT_HIGH_LEVEL
*/
void BSP_IO_ConfigPin(uint16_t IoPin, IO_ModeTypedef IoMode)
{
/* Configure the selected IO pin(s) mode */
IoDrv->Config(IO_I2C_ADDRESS, IoPin, IoMode);
}
/**
* @brief Sets the selected pins state.
* @param IoPin: The selected pins to write.
* This parameter could be any combination of the IO pins.
* @param PinState: the new pins state to write
*/
void BSP_IO_WritePin(uint16_t IoPin, uint8_t PinState)
{
/* Set the Pin state */
IoDrv->WritePin(IO_I2C_ADDRESS, IoPin, PinState);
}
/**
* @brief Gets the selected pins current state.
* @param IoPin: The selected pins to read.
* This parameter could be any combination of the IO pins.
* @retval The current pins state
*/
uint16_t BSP_IO_ReadPin(uint16_t IoPin)
{
return(IoDrv->ReadPin(IO_I2C_ADDRESS, IoPin));
}
/**
* @brief Toggles the selected pins state.
* @param IoPin: The selected pins to toggle.
* This parameter could be any combination of the IO pins.
*/
void BSP_IO_TogglePin(uint16_t IoPin)
{
/* Toggle the current pin state */
if(IoDrv->ReadPin(IO_I2C_ADDRESS, IoPin) == 1 /* Set */)
{
IoDrv->WritePin(IO_I2C_ADDRESS, IoPin, 0 /* Reset */);
}
else
{
IoDrv->WritePin(IO_I2C_ADDRESS, IoPin, 1 /* Set */);
}
}
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/