/** ****************************************************************************** * @file stm8l10x_exti.c * @brief This file contains all the functions for the EXTI peripheral. * @author STMicroelectronics - MCD Application Team * @version V1.1.0 * @date 09/14/2009 ****************************************************************************** * * 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. * *

© COPYRIGHT 2009 STMicroelectronics

* @image html logo.bmp ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "stm8l10x_exti.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ /* Public functions ----------------------------------------------------------*/ /** * @addtogroup EXTI_Public_Functions * @{ */ /** * @brief Deinitializes the external interrupt control registers to their default reset value. * @par Parameters: * None * @retval None */ void EXTI_DeInit(void) { EXTI->CR1 = EXTI_CR1_RESET_VALUE; EXTI->CR2 = EXTI_CR2_RESET_VALUE; EXTI->CR3 = EXTI_CR3_RESET_VALUE; EXTI->SR1 = EXTI_SR1_RESET_VALUE; EXTI->SR2 = EXTI_SR2_RESET_VALUE; EXTI->CONF = EXTI_CONF_RESET_VALUE; } /** * @brief Set the external interrupt sensitivity of the selected port. * @warning * - The modification of external interrupt sensitivity is only possible when the interrupts are disabled. * - The normal behavior is to disable the interrupts before calling this function, and re-enable them after. * @param[in] EXTI_Port : The port number to access. * It can be set of the values of @ref EXTI_Port_TypeDef * @param[in] EXTI_TriggerValue : The external interrupt sensitivity value to set. * It can be set of the values of @ref EXTI_Trigger_TypeDef * @retval None * @par Required preconditions: * Global interrupts must be disabled before calling this function. */ void EXTI_SetPortSensitivity(EXTI_Port_TypeDef EXTI_Port, EXTI_Trigger_TypeDef EXTI_TriggerValue) { /* Check function parameters */ assert_param(IS_EXTI_PORT(EXTI_Port)); assert_param(IS_EXTI_Trigger_VALUE(EXTI_TriggerValue)); /* Clear EXTI port sensitivity */ if (EXTI_Port != EXTI_Port_B) { EXTI->CR3 &= (uint8_t)(~EXTI_CR3_PDIS); } else /* PortNum == EXTI_Port_B */ { EXTI->CR3 &= (uint8_t)(~EXTI_CR3_PBIS); } /* Write EXTI port sensitivity */ EXTI->CR3 |= (uint8_t)((uint8_t)(EXTI_TriggerValue) << EXTI_Port); } /** * @brief Set the external interrupt sensitivity of the selected pin. * @warning * - The modification of external interrupt sensitivity is only possible when the interrupts are disabled. * - The normal behavior is to disable the interrupts before calling this function, and re-enable them after. * @param[in] EXTI_PinNum : The pin to configure. * It can be set of the values of @ref EXTI_Pin_TypeDef * @param[in] EXTI_TriggerValue : The external interrupt sensitivity value to set. * It can be set of the values of @ref EXTI_Trigger_TypeDef * @retval None * @par Required preconditions: * Global interrupts must be disabled before calling this function. */ void EXTI_SetPinSensitivity(EXTI_Pin_TypeDef EXTI_PinNum, EXTI_Trigger_TypeDef EXTI_TriggerValue) { /* Check function parameters */ assert_param(IS_EXTI_PINNUM(EXTI_PinNum)); assert_param(IS_EXTI_Trigger_VALUE(EXTI_TriggerValue)); /* Clear port sensitivity bits */ switch (EXTI_PinNum) { case EXTI_Pin_0: EXTI->CR1 &= (uint8_t)(~EXTI_CR1_P0IS); EXTI->CR1 |= (uint8_t)((uint8_t)(EXTI_TriggerValue) << EXTI_PinNum); break; case EXTI_Pin_1: EXTI->CR1 &= (uint8_t)(~EXTI_CR1_P1IS); EXTI->CR1 |= (uint8_t)((uint8_t)(EXTI_TriggerValue) << EXTI_PinNum); break; case EXTI_Pin_2: EXTI->CR1 &= (uint8_t)(~EXTI_CR1_P2IS); EXTI->CR1 |= (uint8_t)((uint8_t)(EXTI_TriggerValue) << EXTI_PinNum); break; case EXTI_Pin_3: EXTI->CR1 &= (uint8_t)(~EXTI_CR1_P3IS); EXTI->CR1 |= (uint8_t)((uint8_t)(EXTI_TriggerValue) << EXTI_PinNum); break; case EXTI_Pin_4: EXTI->CR2 &= (uint8_t)(~EXTI_CR2_P4IS); EXTI->CR2 |= (uint8_t)((uint8_t)(EXTI_TriggerValue) << ((uint8_t)EXTI_PinNum & (uint8_t)0xEF)); break; case EXTI_Pin_5: EXTI->CR2 &= (uint8_t)(~EXTI_CR2_P5IS); EXTI->CR2 |= (uint8_t)((uint8_t)(EXTI_TriggerValue) << ((uint8_t)EXTI_PinNum & (uint8_t)0xEF)); break; case EXTI_Pin_6: EXTI->CR2 &= (uint8_t)(~EXTI_CR2_P6IS); EXTI->CR2 |= (uint8_t)((uint8_t)(EXTI_TriggerValue) << ((uint8_t)EXTI_PinNum & (uint8_t)0xEF)); break; case EXTI_Pin_7: EXTI->CR2 &= (uint8_t)(~EXTI_CR2_P7IS); EXTI->CR2 |= (uint8_t)((uint8_t)(EXTI_TriggerValue) << ((uint8_t)EXTI_PinNum & (uint8_t)0xEF)); break; default: break; } } /** * @brief Configure the half port interrupt selection. * @param[in] EXTI_HalfPort : The port part to access (MSB or LSB). * It can be set of the values of @ref EXTI_HalfPort_TypeDef * @param[in] NewState : The external interrupt new state. * This parameter can be any of the @ref FunctionalState enumeration. * @retval None * @par Required preconditions: * This function should be called once the port sensitivity configured, * otherwise this latter won't have any effect on the port external interrupt. */ void EXTI_SetHalfPortSelection(EXTI_HalfPort_TypeDef EXTI_HalfPort, FunctionalState NewState) { /* Check function parameters */ assert_param(IS_EXTI_HALFPORT(EXTI_HalfPort)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { EXTI->CONF |= (uint8_t)EXTI_HalfPort; /* Enable port interrupt selector */ } else /*NewState == DISABLE */ { EXTI->CONF &= (uint8_t)(~(uint8_t)EXTI_HalfPort); /* Disable port interrupt selector */ } } /** * @brief Get the external interrupt sensitivity of the selected port. * @param[in] EXTI_Port : The port number to access. * It can be set of the values of @ref EXTI_Port_TypeDef * @retval EXTI_Trigger_TypeDef : The external interrupt sensitivity of the selected port. */ EXTI_Trigger_TypeDef EXTI_GetPortSensitivity(EXTI_Port_TypeDef EXTI_Port) { uint8_t value = 0; /* Check function parameters */ assert_param(IS_EXTI_PORT(EXTI_Port)); if (EXTI_Port != EXTI_Port_B) { value = (uint8_t)((EXTI->CR3 & EXTI_CR3_PDIS)>>2); } else /* PortNum == EXTI_Port_B */ { value = (uint8_t)(EXTI->CR3 & EXTI_CR3_PBIS); } return((EXTI_Trigger_TypeDef)value); } /** * @brief Get the external interrupt sensitivity of the selected pin. * @param[in] EXTI_PinNum : The pin number to access. * It can be set of the values of @ref EXTI_Pin_TypeDef * @retval EXTI_Trigger_TypeDef : The external interrupt sensitivity of the selected port. */ EXTI_Trigger_TypeDef EXTI_GetPinSensitivity(EXTI_Pin_TypeDef EXTI_PinNum) { uint8_t value = 0; /* Check function parameters */ assert_param(IS_EXTI_PINNUM(EXTI_PinNum)); switch (EXTI_PinNum) { case EXTI_Pin_0: value = (uint8_t)(EXTI->CR1 & EXTI_CR1_P0IS); break; case EXTI_Pin_1: value = (uint8_t)((EXTI->CR1 & EXTI_CR1_P1IS) >> EXTI_Pin_1); break; case EXTI_Pin_2: value = (uint8_t)((EXTI->CR1 & EXTI_CR1_P2IS) >> EXTI_Pin_2); break; case EXTI_Pin_3: value = (uint8_t)((EXTI->CR1 & EXTI_CR1_P3IS) >> EXTI_Pin_3); break; case EXTI_Pin_4: value = (uint8_t)(EXTI->CR2 & EXTI_CR2_P4IS); break; case EXTI_Pin_5: value = (uint8_t)((EXTI->CR2 & EXTI_CR2_P5IS) >> ((uint8_t)EXTI_Pin_5 & (uint8_t)0x0F)); break; case EXTI_Pin_6: value = (uint8_t)((EXTI->CR2 & EXTI_CR2_P6IS) >> ((uint8_t)EXTI_Pin_6 & (uint8_t)0x0F)); break; case EXTI_Pin_7: value = (uint8_t)((EXTI->CR2 & EXTI_CR2_P7IS) >> ((uint8_t)EXTI_Pin_7 & (uint8_t)0x0F)); break; default: break; } return((EXTI_Trigger_TypeDef)value); } /** * @brief Get the external interrupt half port configuration. * @param[in] EXTI_HalfPort : The half port part to get (MSB or LSB). * It can be set of the values of @ref EXTI_HalfPort_TypeDef * @retval FunctionalState : The external interrupt state of the selected port part. * This parameter can be any of the @ref FunctionalState enumeration. */ FunctionalState EXTI_GetHalfPortSelection(EXTI_HalfPort_TypeDef EXTI_HalfPort) { FunctionalState value = DISABLE; /* Check function parameters */ assert_param(IS_EXTI_HALFPORT(EXTI_HalfPort)); if ((EXTI->CONF & (uint8_t)EXTI_HalfPort) != DISABLE) { value = ENABLE; } else { value = DISABLE; } return(value); } /** * @brief Get the external interrupt status. * @param[in] EXTI_IT : Specifies the interrupt to read. * It can be set of the values of @ref EXTI_IT_TypeDef * @retval ITStatus : The status of the specified interrupt. * This parameter can be any of the @ref ITStatus enumeration. */ ITStatus EXTI_GetITStatus(EXTI_IT_TypeDef EXTI_IT) { ITStatus status = RESET; /* Check function parameters */ assert_param(IS_EXTI_ITPENDINGBIT(EXTI_IT)); if (((uint8_t)EXTI_IT & (uint8_t)0xF0) == 0xF0) { status = (ITStatus)(EXTI->SR2 & ((uint8_t)EXTI_IT & (uint8_t)0x0F)); } else { status = (ITStatus)(EXTI->SR1 & (uint8_t)EXTI_IT); } return((ITStatus)status); } /** * @brief Clear the specified interrupt pending bit * @param[in] EXTI_IT : Specifies the interrupt to clear * It can be set of the values of @ref EXTI_IT_TypeDef * @retval None */ void EXTI_ClearITPendingBit(EXTI_IT_TypeDef EXTI_IT) { /* Check function parameters */ assert_param(IS_EXTI_ITPENDINGBIT(EXTI_IT)); if (((uint8_t)EXTI_IT & (uint8_t)0xF0) == 0xF0) { EXTI->SR2 = (uint8_t)((uint8_t)EXTI_IT & (uint8_t)0x0F); } else { EXTI->SR1 = (uint8_t)EXTI_IT; } } /** * @} */ /******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/