185 lines
5.5 KiB
C
185 lines
5.5 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<32><30>
|
||
**********************************************************************************/
|
||
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;
|
||
}
|
||
|