185 lines
5.4 KiB
C
185 lines
5.4 KiB
C
/*
|
|
******************************************************************************
|
|
* @file HAL_EXTI.c
|
|
* @version V1.0.0
|
|
* @date 2020
|
|
* @brief EXTI HAL module driver.
|
|
* This file provides firmware functions to manage the following
|
|
* functionalities of the General Purpose Input/Output (EXTI) peripheral:
|
|
* + Initialization functions
|
|
* + IO operation functions
|
|
******************************************************************************
|
|
*/
|
|
#include "ACM32Fxx_HAL.h"
|
|
|
|
/*********************************************************************************
|
|
* Function : HAL_EXTI_IRQHandler
|
|
* Description : Handle EXTI interrupt request.
|
|
* Input : huart: EXTI handle.
|
|
* Output :
|
|
* Author : Chris_Kyle Data : 2020年
|
|
**********************************************************************************/
|
|
void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti)
|
|
{
|
|
if (EXTI->PDR & hexti->u32_Line)
|
|
{
|
|
EXTI->PDR = hexti->u32_Line;
|
|
}
|
|
}
|
|
|
|
/*********************************************************************************
|
|
* Function : HAL_EXTI_SetConfigLine
|
|
* Description :
|
|
* Input :
|
|
* Outpu :
|
|
* Author : Chris_Kyle Data : 2020年
|
|
**********************************************************************************/
|
|
HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti)
|
|
{
|
|
uint32_t lu32_IndexLine;
|
|
|
|
#if (USE_FULL_ASSERT == 1)
|
|
if (!IS_EXTI_ALL_LINE(hexti->u32_Line)) return HAL_ERROR;
|
|
if (!IS_EXTI_MODE(hexti->u32_Mode)) return HAL_ERROR;
|
|
if (!IS_EXTI_TRIGGER(hexti->u32_Trigger)) return HAL_ERROR;
|
|
|
|
/* Line0 ~ 15 trigger from GPIO */
|
|
if (!(hexti->u32_Line >> 16))
|
|
{
|
|
if (!IS_EXTI_GPIOSEL(hexti->u32_GPIOSel)) return HAL_ERROR;
|
|
}
|
|
#endif
|
|
|
|
lu32_IndexLine = hexti->u32_Line;
|
|
|
|
/* Interrupt Mode */
|
|
if (hexti->u32_Mode == EXTI_MODE_INTERRUPT)
|
|
{
|
|
EXTI->IENR |= lu32_IndexLine;
|
|
EXTI->EENR &= ~lu32_IndexLine;
|
|
|
|
NVIC_ClearPendingIRQ(EXTI_IRQn);
|
|
NVIC_EnableIRQ(EXTI_IRQn);
|
|
}
|
|
/* Event Mode */
|
|
else if (hexti->u32_Mode == EXTI_MODE_EVENT)
|
|
{
|
|
EXTI->EENR |= lu32_IndexLine;
|
|
EXTI->IENR &= ~lu32_IndexLine;
|
|
}
|
|
|
|
|
|
if (hexti->u32_Trigger == EXTI_TRIGGER_RISING)
|
|
{
|
|
EXTI->RTENR |= lu32_IndexLine;
|
|
EXTI->FTENR &= ~lu32_IndexLine;
|
|
}
|
|
else if (hexti->u32_Trigger == EXTI_TRIGGER_FALLING)
|
|
{
|
|
EXTI->FTENR |= lu32_IndexLine;
|
|
EXTI->RTENR &= ~lu32_IndexLine;
|
|
}
|
|
else
|
|
{
|
|
EXTI->FTENR |= lu32_IndexLine;
|
|
EXTI->RTENR |= lu32_IndexLine;
|
|
}
|
|
|
|
/* Line0 ~ 15 trigger from GPIO */
|
|
if (!(hexti->u32_Line >> 16))
|
|
{
|
|
lu32_IndexLine = 0;
|
|
|
|
while(hexti->u32_Line >> lu32_IndexLine != 0x01)
|
|
{
|
|
lu32_IndexLine++;
|
|
}
|
|
|
|
/* Line0 ~ 7 */
|
|
if (lu32_IndexLine < 8)
|
|
{
|
|
EXTI->EXTICR1 = (EXTI->EXTICR1 & ~(0x0F << (lu32_IndexLine * 4))) | hexti->u32_GPIOSel << (lu32_IndexLine * 4);
|
|
}
|
|
/* Line8 ~ 15 */
|
|
else
|
|
{
|
|
lu32_IndexLine -= 8;
|
|
|
|
EXTI->EXTICR2 = (EXTI->EXTICR2 & ~(0x0F << (lu32_IndexLine * 4))) | hexti->u32_GPIOSel << (lu32_IndexLine * 4);
|
|
}
|
|
}
|
|
|
|
return HAL_OK;
|
|
}
|
|
|
|
/*********************************************************************************
|
|
* Function : HAL_EXTI_SoftTrigger
|
|
* Description : Software trigger EXTI
|
|
* Input :
|
|
* Outpu :
|
|
* Author : Chris_Kyle Data : 2020年
|
|
**********************************************************************************/
|
|
void HAL_EXTI_SoftTrigger(EXTI_HandleTypeDef *hexti)
|
|
{
|
|
#if (USE_FULL_ASSERT == 1)
|
|
if (!IS_EXTI_ALL_LINE(hexti->u32_Line)) return;
|
|
#endif
|
|
|
|
/* Set pending BIT */
|
|
EXTI->SWIER |= hexti->u32_Line;
|
|
}
|
|
|
|
/*********************************************************************************
|
|
* Function : HAL_EXTI_GetPending
|
|
* Description : Get interrupt pending bit of a dedicated line.
|
|
* Input :
|
|
* Outpu :
|
|
* Author : Chris_Kyle Data : 2020年
|
|
**********************************************************************************/
|
|
bool HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti)
|
|
{
|
|
#if (USE_FULL_ASSERT == 1)
|
|
if (!IS_EXTI_ALL_LINE(hexti->u32_Line)) return HAL_ERROR;
|
|
#endif
|
|
|
|
if (hexti->u32_Line & EXTI->PDR)
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/*********************************************************************************
|
|
* Function : HAL_EXTI_ClearPending
|
|
* Description : Clear interrupt pending bit of a dedicated line.
|
|
* Input :
|
|
* Outpu :
|
|
* Author : Chris_Kyle Data : 2020年
|
|
**********************************************************************************/
|
|
void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti)
|
|
{
|
|
#if (USE_FULL_ASSERT == 1)
|
|
if (!IS_EXTI_ALL_LINE(hexti->u32_Line)) return;
|
|
#endif
|
|
|
|
/* Clear pending status */
|
|
EXTI->PDR |= hexti->u32_Line;
|
|
}
|
|
|
|
/*********************************************************************************
|
|
* Function : HAL_EXTI_ClearAllPending
|
|
* Description : Clear all interrupt pending bit.
|
|
* Input :
|
|
* Outpu :
|
|
* Author : xwl Data : 2021年
|
|
**********************************************************************************/
|
|
void HAL_EXTI_ClearAllPending(void)
|
|
{
|
|
/* Clear pending status */
|
|
EXTI->PDR |= EXTI_LINE_MASK;
|
|
}
|
|
|