You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
306 lines
8.7 KiB
306 lines
8.7 KiB
2 years ago
|
/**
|
||
|
******************************************************************************
|
||
|
* @file stm32l496g_discovery_io.c
|
||
|
* @author MCD Application Team
|
||
|
* @brief This file provides a set of functions needed to manage the IO pins
|
||
|
* on STM32L496G-DISCO evaluation board.
|
||
|
******************************************************************************
|
||
|
* @attention
|
||
|
*
|
||
|
* <h2><center>© Copyright (c) 2017 STMicroelectronics.
|
||
|
* All rights reserved.</center></h2>
|
||
|
*
|
||
|
* This software component is licensed by ST under BSD 3-Clause license,
|
||
|
* the "License"; You may not use this file except in compliance with the
|
||
|
* License. You may obtain a copy of the License at:
|
||
|
* opensource.org/licenses/BSD-3-Clause
|
||
|
*
|
||
|
******************************************************************************
|
||
|
*/
|
||
|
|
||
|
/* File Info : -----------------------------------------------------------------
|
||
|
User NOTES
|
||
|
1. How To use this driver:
|
||
|
--------------------------
|
||
|
- This driver is used to drive the IO module of the STM32L496G-DISCO evaluation
|
||
|
board.
|
||
|
- The STMPE811 and STMPE1600 IO expander device component driver must be included with this
|
||
|
driver in order to run the IO functionalities commanded by the IO expander
|
||
|
device mounted on the evaluation board.
|
||
|
|
||
|
2. Driver description:
|
||
|
---------------------
|
||
|
+ Initialization steps:
|
||
|
o Initialize the IO module using the BSP_IO_Init() function. This
|
||
|
function includes the MSP layer hardware resources initialization and the
|
||
|
communication layer configuration to start the IO functionalities use.
|
||
|
|
||
|
+ IO functionalities use
|
||
|
o The IO pin mode is configured when calling the function BSP_IO_ConfigPin(), you
|
||
|
must specify the desired IO mode by choosing the "IO_ModeTypedef" parameter
|
||
|
predefined value.
|
||
|
o If an IO pin is used in interrupt mode, the function BSP_IO_ITGetStatus() is
|
||
|
needed to get the interrupt status. To clear the IT pending bits, you should
|
||
|
call the function BSP_IO_ITClear() with specifying the IO pending bit to clear.
|
||
|
o The IT is handled using the corresponding external interrupt IRQ handler,
|
||
|
the user IT callback treatment is implemented on the same external interrupt
|
||
|
callback.
|
||
|
o To get/set an IO pin combination state you can use the functions
|
||
|
BSP_IO_ReadPin()/BSP_IO_WritePin() or the function BSP_IO_TogglePin() to toggle the pin
|
||
|
state.
|
||
|
|
||
|
------------------------------------------------------------------------------*/
|
||
|
|
||
|
/* Includes ------------------------------------------------------------------*/
|
||
|
#include "stm32l496g_discovery_io.h"
|
||
|
|
||
|
/** @addtogroup BSP
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
/** @addtogroup STM32L496G-DISCO
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
/** @defgroup STM32L496G-DISCO_IO STM32L496G-DISCO IO
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
/* Private constants ---------------------------------------------------------*/
|
||
|
|
||
|
/** @defgroup STM32L496G-DISCO_IO_Private_Constants Private Constants
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/* Private macros -------------------------------------------------------------*/
|
||
|
|
||
|
/** @defgroup STM32L496G-DISCO_IO_Private_Macros Private Macros
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/* Private variables ---------------------------------------------------------*/
|
||
|
|
||
|
/** @defgroup STM32L496G-DISCO_IO_Private_Variables Private Variables
|
||
|
* @{
|
||
|
*/
|
||
|
static IO_DrvTypeDef *io1_driver;
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/* Private function prototypes -----------------------------------------------*/
|
||
|
|
||
|
/** @defgroup STM32L496G-DISCO_IO_Private_Functions Private Functions
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/* Private functions ---------------------------------------------------------*/
|
||
|
|
||
|
/** @addtogroup STM32L496G-DISCO_IO_Exported_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 are OK. Other value if error.
|
||
|
*/
|
||
|
uint8_t BSP_IO_Init(void)
|
||
|
{
|
||
|
uint8_t ret = IO_ERROR;
|
||
|
uint8_t mfxstm32l152_id = 0;
|
||
|
|
||
|
if (io1_driver == NULL) /* Checks if MFX initialization has been already done */
|
||
|
{
|
||
|
mfxstm32l152_idd_drv.WakeUp(IO1_I2C_ADDRESS);
|
||
|
|
||
|
HAL_Delay(10);
|
||
|
|
||
|
/* Read ID and verify the IO expander is ready */
|
||
|
mfxstm32l152_id = mfxstm32l152_io_drv.ReadID(IO1_I2C_ADDRESS);
|
||
|
|
||
|
if ((mfxstm32l152_id == MFXSTM32L152_ID_1) || (mfxstm32l152_id == MFXSTM32L152_ID_2))
|
||
|
{
|
||
|
/* Initialize the MFX */
|
||
|
io1_driver = &mfxstm32l152_io_drv;
|
||
|
|
||
|
/* Initialize the MFX IO driver structure */
|
||
|
if (io1_driver->Init != NULL)
|
||
|
{
|
||
|
io1_driver->Init(IO1_I2C_ADDRESS);
|
||
|
io1_driver->Start(IO1_I2C_ADDRESS, IO1_PIN_ALL >> IO1_PIN_OFFSET);
|
||
|
|
||
|
ret = IO_OK;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ret = IO_ALREADY_INITIALIZED;
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Gets the selected pins IT status.
|
||
|
* @param IO_Pin: Selected pins to check the status.
|
||
|
* This parameter can be any combination of the IO pins.
|
||
|
* @retval Status of the checked IO pin(s).
|
||
|
*/
|
||
|
uint32_t BSP_IO_ITGetStatus(uint32_t IO_Pin)
|
||
|
{
|
||
|
uint32_t status = 0;
|
||
|
uint32_t io1_pin = 0;
|
||
|
|
||
|
io1_pin = (IO_Pin & IO1_PIN_ALL) >> IO1_PIN_OFFSET;
|
||
|
|
||
|
/* Return the MFX Pin IT status */
|
||
|
status |= (io1_driver->ITStatus(IO1_I2C_ADDRESS, io1_pin)) << IO1_PIN_OFFSET;
|
||
|
|
||
|
return status;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Clears the selected IO IT pending bit.
|
||
|
* @param IO_Pin: Selected pins to check the status.
|
||
|
* This parameter can be any combination of the IO pins.
|
||
|
* @retval None
|
||
|
*/
|
||
|
void BSP_IO_ITClear(uint32_t IO_Pin)
|
||
|
{
|
||
|
uint32_t io1_pin = 0;
|
||
|
|
||
|
io1_pin = (IO_Pin & IO1_PIN_ALL) >> IO1_PIN_OFFSET;
|
||
|
|
||
|
/* Clears the selected IO Expander 1 pin(s) mode */
|
||
|
io1_driver->ClearIT(IO1_I2C_ADDRESS, io1_pin);
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Configures the IO pin(s) according to IO mode structure value.
|
||
|
* @param IO_Pin: Output pin to be set or reset.
|
||
|
* This parameter can be any combination of the IO pins.
|
||
|
* @param IO_Mode: IO pin mode to configure
|
||
|
* This parameter can 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
|
||
|
* @retval IO_OK: if all initializations are OK. Other value if error.
|
||
|
*/
|
||
|
uint8_t BSP_IO_ConfigPin(uint32_t IO_Pin, IO_ModeTypedef IO_Mode)
|
||
|
{
|
||
|
uint32_t io1_pin = 0;
|
||
|
|
||
|
io1_pin = (IO_Pin & IO1_PIN_ALL) >> IO1_PIN_OFFSET;
|
||
|
|
||
|
|
||
|
/* Configure the selected IO Expander 1 pin(s) mode */
|
||
|
io1_driver->Config(IO1_I2C_ADDRESS, io1_pin, IO_Mode);
|
||
|
|
||
|
return IO_OK;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Sets the selected pins state.
|
||
|
* @param IO_Pin: Selected pins to write.
|
||
|
* This parameter can be any combination of the IO pins.
|
||
|
* @param PinState: New pins state to write
|
||
|
* @retval None
|
||
|
*/
|
||
|
void BSP_IO_WritePin(uint32_t IO_Pin, uint8_t PinState)
|
||
|
{
|
||
|
uint32_t io1_pin = 0;
|
||
|
|
||
|
io1_pin = (IO_Pin & IO1_PIN_ALL) >> IO1_PIN_OFFSET;
|
||
|
|
||
|
/* Sets the IO Expander 1 selected pins state */
|
||
|
io1_driver->WritePin(IO1_I2C_ADDRESS, io1_pin, PinState);
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Gets the selected pins current state.
|
||
|
* @param IO_Pin: Selected pins to read.
|
||
|
* This parameter can be any combination of the IO pins.
|
||
|
* @retval The current pins state
|
||
|
*/
|
||
|
uint32_t BSP_IO_ReadPin(uint32_t IO_Pin)
|
||
|
{
|
||
|
uint32_t pin_state = 0;
|
||
|
uint32_t io1_pin = 0;
|
||
|
|
||
|
io1_pin = (IO_Pin & IO1_PIN_ALL) >> IO1_PIN_OFFSET;
|
||
|
|
||
|
/* Gets the IO Expander 1 selected pins current state */
|
||
|
pin_state |= (io1_driver->ReadPin(IO1_I2C_ADDRESS, io1_pin)) << IO1_PIN_OFFSET;
|
||
|
|
||
|
|
||
|
return pin_state;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Toggles the selected pins state
|
||
|
* @param IO_Pin: Selected pins to toggle.
|
||
|
* This parameter can be any combination of the IO pins.
|
||
|
* @retval None
|
||
|
*/
|
||
|
void BSP_IO_TogglePin(uint32_t IO_Pin)
|
||
|
{
|
||
|
uint32_t io1_pin = 0;
|
||
|
|
||
|
io1_pin = (IO_Pin & IO1_PIN_ALL) >> IO1_PIN_OFFSET;
|
||
|
|
||
|
/* Toggles the IO Expander 1 selected pins state */
|
||
|
if (io1_driver->ReadPin(IO1_I2C_ADDRESS, io1_pin) == RESET) /* Set */
|
||
|
{
|
||
|
BSP_IO_WritePin(io1_pin, GPIO_PIN_SET); /* Reset */
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
BSP_IO_WritePin(io1_pin, GPIO_PIN_RESET); /* Set */
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|