197 lines
5.5 KiB
C
197 lines
5.5 KiB
C
/**
|
|
******************************************************************************
|
|
* @brief EXTI functions of the firmware library.
|
|
******************************************************************************
|
|
*/
|
|
|
|
/* Includes ------------------------------------------------------------------*/
|
|
#include "gd32f10x_exti.h"
|
|
|
|
/** @addtogroup GD32F10x_Firmware
|
|
* @{
|
|
*/
|
|
|
|
/** @defgroup EXTI
|
|
* @brief EXTI driver modules
|
|
* @{
|
|
*/
|
|
|
|
/** @defgroup EXTI_Private_Defines
|
|
* @{
|
|
*/
|
|
/* No interrupt line is selected */
|
|
#define EXTI_LINE_NULL ((uint32_t)0x00000000)
|
|
|
|
/* ----------------- EXTI Reset Configuration Registers ------------------ */
|
|
/* The reset value of EXTI_IER */
|
|
#define EXTI_IER_RST ((uint32_t)0x00000000)
|
|
|
|
/* The reset value of EXTI_EER */
|
|
#define EXTI_EER_RST ((uint32_t)0x00000000)
|
|
|
|
/* The reset value of EXTI_RTE */
|
|
#define EXTI_RTE_RST ((uint32_t)0x00000000)
|
|
|
|
/* The reset value of EXTI_FTE */
|
|
#define EXTI_FTE_RST ((uint32_t)0x00000000)
|
|
|
|
/* The reset value of EXTI_PD */
|
|
#define EXTI_PD_RST ((uint32_t)0x000FFFFF)
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup EXTI_Private_Functions
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief Reset the EXTI peripheral registers and the struct EXTI_InitPara.
|
|
* @param EXTI_InitParaStruct: the struct EXTI_InitPara pointer.
|
|
* @retval None
|
|
*/
|
|
void EXTI_DeInit(EXTI_InitPara *EXTI_InitParaStruct)
|
|
{
|
|
/* Reset the EXTI peripheral registers */
|
|
EXTI->IER = EXTI_IER_RST;
|
|
EXTI->EER = EXTI_EER_RST;
|
|
EXTI->RTE = EXTI_RTE_RST;
|
|
EXTI->FTE = EXTI_FTE_RST;
|
|
EXTI->PD = EXTI_PD_RST;
|
|
|
|
/* Reset the struct EXTI_InitPara */
|
|
EXTI_InitParaStruct->EXTI_LINE = EXTI_LINE_NULL;
|
|
EXTI_InitParaStruct->EXTI_Mode = EXTI_Mode_Interrupt;
|
|
EXTI_InitParaStruct->EXTI_Trigger = EXTI_Trigger_Falling;
|
|
EXTI_InitParaStruct->EXTI_LINEEnable = DISABLE;
|
|
}
|
|
|
|
/**
|
|
* @brief Initialize the EXTI peripheral registers.
|
|
* @param EXTI_InitParaStruct: the struct EXTI_InitPara pointer.
|
|
* @retval None
|
|
*/
|
|
void EXTI_Init(EXTI_InitPara *EXTI_InitParaStruct)
|
|
{
|
|
uint32_t temp = 0;
|
|
|
|
temp = (uint32_t)EXTI_BASE;
|
|
|
|
if (EXTI_InitParaStruct->EXTI_LINEEnable != DISABLE) {
|
|
/* Clear Interrupt and Event from EXTI Lines */
|
|
EXTI->IER &= ~EXTI_InitParaStruct->EXTI_LINE;
|
|
EXTI->EER &= ~EXTI_InitParaStruct->EXTI_LINE;
|
|
|
|
temp += EXTI_InitParaStruct->EXTI_Mode;
|
|
|
|
*(__IO uint32_t *) temp |= EXTI_InitParaStruct->EXTI_LINE;
|
|
|
|
/* Clear the Rising and Falling edge trigger enable registers */
|
|
EXTI->RTE &= ~EXTI_InitParaStruct->EXTI_LINE;
|
|
EXTI->FTE &= ~EXTI_InitParaStruct->EXTI_LINE;
|
|
|
|
/* Select the trigger type for the selected EXTI Lines */
|
|
if (EXTI_InitParaStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling) {
|
|
/* Rising and Falling edge trigger are both selected */
|
|
EXTI->RTE |= EXTI_InitParaStruct->EXTI_LINE;
|
|
EXTI->FTE |= EXTI_InitParaStruct->EXTI_LINE;
|
|
} else {
|
|
temp = (uint32_t)EXTI_BASE;
|
|
temp += EXTI_InitParaStruct->EXTI_Trigger;
|
|
|
|
*(__IO uint32_t *) temp |= EXTI_InitParaStruct->EXTI_LINE;
|
|
}
|
|
} else {
|
|
temp += EXTI_InitParaStruct->EXTI_Mode;
|
|
|
|
/* Disable the selected EXTI lines */
|
|
*(__IO uint32_t *) temp &= ~EXTI_InitParaStruct->EXTI_LINE;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Activate the software interrupt or event request of the selected EXTI Lines.
|
|
* @param EXTI_LINE: the selected EXTI lines.
|
|
* This parameter can be any combination of EXTI_LINEx where x can be (0..19).
|
|
* @retval None
|
|
*/
|
|
void EXTI_SWINT_Enable(uint32_t EXTI_LINE)
|
|
{
|
|
/* Enable the software interrupt or event request of the selected EXTI Lines */
|
|
EXTI->SIE |= EXTI_LINE;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the bit flag of the selected EXTI lines.
|
|
* @param EXTI_LINE: the selected EXTI lines.
|
|
* This parameter can be any combination of EXTI_LINEx where x can be (0..19).
|
|
* @retval The new value of EXTI_LINE (SET or RESET).
|
|
*/
|
|
TypeState EXTI_GetBitState(uint32_t EXTI_LINE)
|
|
{
|
|
/* Check and get the selected EXTI lines flag */
|
|
if ((EXTI->PD & EXTI_LINE) != (uint32_t)RESET) {
|
|
/* EXTI_LINE bit is SET */
|
|
return SET;
|
|
} else {
|
|
/* EXTI_LINE bit is RESET */
|
|
return RESET;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Clear the bit flag of the selected EXTI lines.
|
|
* @param EXTI_LINE: the selected EXTI lines.
|
|
* This parameter can be any combination of EXTI_LINEx where x can be (0..19).
|
|
* @retval None
|
|
*/
|
|
void EXTI_ClearBitState(uint32_t EXTI_LINE)
|
|
{
|
|
/* Clear the bit flag of the selected EXTI lines */
|
|
EXTI->PD = EXTI_LINE;
|
|
}
|
|
|
|
/**
|
|
* @brief Get the interrupt bit flag of the selected EXTI lines..
|
|
* @param EXTI_LINE: the selected EXTI lines.
|
|
* This parameter can be any combination of EXTI_LINEx where x can be (0..19).
|
|
* @retval The new value of EXTI_LINE (SET or RESET).
|
|
*/
|
|
TypeState EXTI_GetIntBitState(uint32_t EXTI_LINE)
|
|
{
|
|
/* Check and get the interrupt source is set or not */
|
|
if (((EXTI->PD & EXTI_LINE) != (uint32_t)RESET) && ((EXTI->IER & EXTI_LINE) != (uint32_t)RESET)) {
|
|
/* The interrupt bit of EXTI_LINE is SET */
|
|
return SET;
|
|
} else {
|
|
/* The interrupt bit of EXTI_LINE is RESET */
|
|
return RESET;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Clear the interrupt bit flag of the selected EXTI lines.
|
|
* @param EXTI_LINE: the selected EXTI lines.
|
|
* This parameter can be any combination of EXTI_LINEx where x can be (0..19).
|
|
* @retval None
|
|
*/
|
|
void EXTI_ClearIntBitState(uint32_t EXTI_LINE)
|
|
{
|
|
/* Clear the interrupt bit flag of the selected EXTI lines */
|
|
EXTI->PD = EXTI_LINE;
|
|
}
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|