/** | |
****************************************************************************** | |
* @file stm32f0xx_exti.c | |
* @author MCD Application Team | |
* @version V1.0.0RC1 | |
* @date 27-January-2012 | |
* @brief This file provides firmware functions to manage the following | |
* functionalities of the EXTI peripheral: | |
* + Initialization and Configuration | |
* + Interrupts and flags management | |
* | |
* @verbatim | |
============================================================================== | |
##### EXTI features ##### | |
============================================================================== | |
[..] External interrupt/event lines are mapped as following: | |
(#) All available GPIO pins are connected to the 16 external | |
interrupt/event lines from EXTI0 to EXTI15. | |
(#) EXTI line 16 is connected to the PVD output. | |
(#) EXTI line 17 is connected to the RTC Alarm event. | |
(#) EXTI line 19 is connected to the RTC Tamper and TimeStamp events | |
(#) EXTI line 21 is connected to the Comparator 1 wakeup event | |
(#) EXTI line 22 is connected to the Comparator 2 wakeup event | |
(#) EXTI line 23 is connected to the I2C1 wakeup event | |
(#) EXTI line 25 is connected to the USART1 wakeup event | |
(#) EXTI line 27 is connected to the CEC wakeup event | |
##### How to use this driver ##### | |
============================================================================== | |
[..] In order to use an I/O pin as an external interrupt source, follow | |
steps below: | |
(#) Configure the I/O in input mode using GPIO_Init() | |
(#) Select the input source pin for the EXTI line using | |
SYSCFG_EXTILineConfig(). | |
(#) Select the mode(interrupt, event) and configure the trigger selection | |
(Rising, falling or both) using EXTI_Init(). For the internal interrupt, | |
the trigger selection is not needed( the active edge is always the rising one). | |
(#) Configure NVIC IRQ channel mapped to the EXTI line using NVIC_Init(). | |
(#) Optionally, you can generate a software interrupt using the function EXTI_GenerateSWInterrupt(). | |
[..] | |
(@) SYSCFG APB clock must be enabled to get write access to SYSCFG_EXTICRx | |
registers using RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); | |
@endverbatim | |
* | |
****************************************************************************** | |
* @attention | |
* | |
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS | |
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE | |
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY | |
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING | |
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE | |
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. | |
* | |
* FOR MORE INFORMATION PLEASE READ CAREFULLY THE LICENSE AGREEMENT FILE | |
* LOCATED IN THE ROOT DIRECTORY OF THIS FIRMWARE PACKAGE. | |
* | |
* <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2> | |
****************************************************************************** | |
*/ | |
/* Includes ------------------------------------------------------------------*/ | |
#include "stm32f0xx_exti.h" | |
/** @addtogroup STM32F0xx_StdPeriph_Driver | |
* @{ | |
*/ | |
/** @defgroup EXTI | |
* @brief EXTI driver modules | |
* @{ | |
*/ | |
/* Private typedef -----------------------------------------------------------*/ | |
/* Private define ------------------------------------------------------------*/ | |
#define EXTI_LINENONE ((uint32_t)0x00000) /* No interrupt selected */ | |
/* Private macro -------------------------------------------------------------*/ | |
/* Private variables ---------------------------------------------------------*/ | |
/* Private function prototypes -----------------------------------------------*/ | |
/* Private functions ---------------------------------------------------------*/ | |
/** @defgroup EXTI_Private_Functions | |
* @{ | |
*/ | |
/** @defgroup EXTI_Group1 Initialization and Configuration functions | |
* @brief Initialization and Configuration functions | |
* | |
@verbatim | |
============================================================================== | |
##### Initialization and Configuration functions ##### | |
============================================================================== | |
@endverbatim | |
* @{ | |
*/ | |
/** | |
* @brief Deinitializes the EXTI peripheral registers to their default reset | |
* values. | |
* @param None | |
* @retval None | |
*/ | |
void EXTI_DeInit(void) | |
{ | |
EXTI->IMR = 0x0F940000; | |
EXTI->EMR = 0x00000000; | |
EXTI->RTSR = 0x00000000; | |
EXTI->FTSR = 0x00000000; | |
EXTI->PR = 0x006BFFFF; | |
} | |
/** | |
* @brief Initializes the EXTI peripheral according to the specified | |
* parameters in the EXTI_InitStruct. | |
* EXTI_Line specifies the EXTI line (EXTI0....EXTI27). | |
* EXTI_Mode specifies which EXTI line is used as interrupt or an event. | |
* EXTI_Trigger selects the trigger. When the trigger occurs, interrupt | |
* pending bit will be set. | |
* EXTI_LineCmd controls (Enable/Disable) the EXTI line. | |
* @param EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure that | |
* contains the configuration information for the EXTI peripheral. | |
* @retval None | |
*/ | |
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct) | |
{ | |
uint32_t tmp = 0; | |
/* Check the parameters */ | |
assert_param(IS_EXTI_MODE(EXTI_InitStruct->EXTI_Mode)); | |
assert_param(IS_EXTI_TRIGGER(EXTI_InitStruct->EXTI_Trigger)); | |
assert_param(IS_EXTI_LINE(EXTI_InitStruct->EXTI_Line)); | |
assert_param(IS_FUNCTIONAL_STATE(EXTI_InitStruct->EXTI_LineCmd)); | |
tmp = (uint32_t)EXTI_BASE; | |
if (EXTI_InitStruct->EXTI_LineCmd != DISABLE) | |
{ | |
/* Clear EXTI line configuration */ | |
EXTI->IMR &= ~EXTI_InitStruct->EXTI_Line; | |
EXTI->EMR &= ~EXTI_InitStruct->EXTI_Line; | |
tmp += EXTI_InitStruct->EXTI_Mode; | |
*(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line; | |
/* Clear Rising Falling edge configuration */ | |
EXTI->RTSR &= ~EXTI_InitStruct->EXTI_Line; | |
EXTI->FTSR &= ~EXTI_InitStruct->EXTI_Line; | |
/* Select the trigger for the selected interrupts */ | |
if (EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling) | |
{ | |
/* Rising Falling edge */ | |
EXTI->RTSR |= EXTI_InitStruct->EXTI_Line; | |
EXTI->FTSR |= EXTI_InitStruct->EXTI_Line; | |
} | |
else | |
{ | |
tmp = (uint32_t)EXTI_BASE; | |
tmp += EXTI_InitStruct->EXTI_Trigger; | |
*(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line; | |
} | |
} | |
else | |
{ | |
tmp += EXTI_InitStruct->EXTI_Mode; | |
/* Disable the selected external lines */ | |
*(__IO uint32_t *) tmp &= ~EXTI_InitStruct->EXTI_Line; | |
} | |
} | |
/** | |
* @brief Fills each EXTI_InitStruct member with its reset value. | |
* @param EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure which will | |
* be initialized. | |
* @retval None | |
*/ | |
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct) | |
{ | |
EXTI_InitStruct->EXTI_Line = EXTI_LINENONE; | |
EXTI_InitStruct->EXTI_Mode = EXTI_Mode_Interrupt; | |
EXTI_InitStruct->EXTI_Trigger = EXTI_Trigger_Falling; | |
EXTI_InitStruct->EXTI_LineCmd = DISABLE; | |
} | |
/** | |
* @brief Generates a Software interrupt on selected EXTI line. | |
* @param EXTI_Line: specifies the EXTI line on which the software interrupt | |
* will be generated. | |
* This parameter can be any combination of EXTI_Linex where x can be (0..19) | |
* @retval None | |
*/ | |
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line) | |
{ | |
/* Check the parameters */ | |
assert_param(IS_EXTI_LINE(EXTI_Line)); | |
EXTI->SWIER |= EXTI_Line; | |
} | |
/** | |
* @} | |
*/ | |
/** @defgroup EXTI_Group2 Interrupts and flags management functions | |
* @brief Interrupts and flags management functions | |
* | |
@verbatim | |
============================================================================== | |
##### Interrupts and flags management functions ##### | |
============================================================================== | |
@endverbatim | |
* @{ | |
*/ | |
/** | |
* @brief Checks whether the specified EXTI line flag is set or not. | |
* @param EXTI_Line: specifies the EXTI line flag to check. | |
* This parameter can be: | |
* EXTI_Linex: External interrupt line x where x(0..19). | |
* @retval The new state of EXTI_Line (SET or RESET). | |
*/ | |
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line) | |
{ | |
FlagStatus bitstatus = RESET; | |
/* Check the parameters */ | |
assert_param(IS_GET_EXTI_LINE(EXTI_Line)); | |
if ((EXTI->PR & EXTI_Line) != (uint32_t)RESET) | |
{ | |
bitstatus = SET; | |
} | |
else | |
{ | |
bitstatus = RESET; | |
} | |
return bitstatus; | |
} | |
/** | |
* @brief Clears the EXTI's line pending flags. | |
* @param EXTI_Line: specifies the EXTI lines flags to clear. | |
* This parameter can be any combination of EXTI_Linex where x can be (0..19) | |
* @retval None | |
*/ | |
void EXTI_ClearFlag(uint32_t EXTI_Line) | |
{ | |
/* Check the parameters */ | |
assert_param(IS_EXTI_LINE(EXTI_Line)); | |
EXTI->PR = EXTI_Line; | |
} | |
/** | |
* @brief Checks whether the specified EXTI line is asserted or not. | |
* @param EXTI_Line: specifies the EXTI line to check. | |
* This parameter can be: | |
* EXTI_Linex: External interrupt line x where x(0..19). | |
* @retval The new state of EXTI_Line (SET or RESET). | |
*/ | |
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) | |
{ | |
ITStatus bitstatus = RESET; | |
uint32_t enablestatus = 0; | |
/* Check the parameters */ | |
assert_param(IS_GET_EXTI_LINE(EXTI_Line)); | |
enablestatus = EXTI->IMR & EXTI_Line; | |
if (((EXTI->PR & EXTI_Line) != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) | |
{ | |
bitstatus = SET; | |
} | |
else | |
{ | |
bitstatus = RESET; | |
} | |
return bitstatus; | |
} | |
/** | |
* @brief Clears the EXTI's line pending bits. | |
* @param EXTI_Line: specifies the EXTI lines to clear. | |
* This parameter can be any combination of EXTI_Linex where x can be (0..19). | |
* @retval None | |
*/ | |
void EXTI_ClearITPendingBit(uint32_t EXTI_Line) | |
{ | |
/* Check the parameters */ | |
assert_param(IS_EXTI_LINE(EXTI_Line)); | |
EXTI->PR = EXTI_Line; | |
} | |
/** | |
* @} | |
*/ | |
/** | |
* @} | |
*/ | |
/** | |
* @} | |
*/ | |
/** | |
* @} | |
*/ | |
/******************* (C) COPYRIGHT 2012 STMicroelectronics *****END OF FILE****/ |