397 lines
15 KiB
C
397 lines
15 KiB
C
/************************************************************************************************/
|
||
/**
|
||
* @file ciu32l051_std_exti.h
|
||
* @author MCU Ecosystem Development Team
|
||
* @brief EXTI STD库驱动头文件。
|
||
* 提供EXTI相关的STD库操作函数声明、数据类型以及常量的定义。
|
||
*
|
||
*
|
||
**************************************************************************************************
|
||
* @attention
|
||
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
|
||
*
|
||
**************************************************************************************************
|
||
*/
|
||
|
||
/* 避免头文件重复引用 */
|
||
#ifndef CIU32L051_STD_EXTI_H
|
||
#define CIU32L051_STD_EXTI_H
|
||
|
||
/************************************************************************************************/
|
||
/**
|
||
* @addtogroup CIU32L051_STD_Driver
|
||
* @{
|
||
*/
|
||
|
||
/**
|
||
* @defgroup EXTI EXTI
|
||
* @brief 扩展中断和事件控制器的STD库驱动
|
||
* @{
|
||
*/
|
||
/************************************************************************************************/
|
||
|
||
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/*------------------------------------------includes--------------------------------------------*/
|
||
#include "ciu32l051_std_common.h"
|
||
|
||
/*-----------------------------------------type define------------------------------------------*/
|
||
/************************************************************************************************/
|
||
/**
|
||
* @defgroup EXTI_Types EXTI Types
|
||
* @brief EXTI数据类型定义
|
||
* @{
|
||
*/
|
||
/************************************************************************************************/
|
||
|
||
/**
|
||
* @brief EXTI参数配置结构体定义
|
||
*/
|
||
typedef struct
|
||
{
|
||
uint32_t line_id; /**< EXTI通道ID
|
||
@arg EXTI_LINE_GPIO_PIN0 ... */
|
||
uint32_t mode; /**< EXTI通道模式
|
||
@arg EXTI_MODE_INTERRUPT ... */
|
||
uint32_t trigger; /**< EXTI通道触发类型
|
||
@arg EXTI_TRIGGER_RISING ... */
|
||
uint32_t gpio_id; /**< GPIO端口ID
|
||
@arg EXTI_GPIOA ... */
|
||
} std_exti_init_t;
|
||
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/*--------------------------------------------define--------------------------------------------*/
|
||
|
||
/************************************************************************************************/
|
||
/**
|
||
* @defgroup EXTI_Constants EXTI Constants
|
||
* @brief EXTI常量定义及宏定义
|
||
* @{
|
||
*
|
||
*/
|
||
/************************************************************************************************/
|
||
|
||
/* EXTI LINE ID定义 */
|
||
#define EXTI_LINE_GPIO_PIN0 (EXTI_GPIO | 0x00U) /**< EXTI_LINE0 */
|
||
#define EXTI_LINE_GPIO_PIN1 (EXTI_GPIO | 0x01U) /**< EXTI_LINE1 */
|
||
#define EXTI_LINE_GPIO_PIN2 (EXTI_GPIO | 0x02U) /**< EXTI_LINE2 */
|
||
#define EXTI_LINE_GPIO_PIN3 (EXTI_GPIO | 0x03U) /**< EXTI_LINE3 */
|
||
#define EXTI_LINE_GPIO_PIN4 (EXTI_GPIO | 0x04U) /**< EXTI_LINE4 */
|
||
#define EXTI_LINE_GPIO_PIN5 (EXTI_GPIO | 0x05U) /**< EXTI_LINE5 */
|
||
#define EXTI_LINE_GPIO_PIN6 (EXTI_GPIO | 0x06U) /**< EXTI_LINE6 */
|
||
#define EXTI_LINE_GPIO_PIN7 (EXTI_GPIO | 0x07U) /**< EXTI_LINE7 */
|
||
#define EXTI_LINE_GPIO_PIN8 (EXTI_GPIO | 0x08U) /**< EXTI_LINE8 */
|
||
#define EXTI_LINE_GPIO_PIN9 (EXTI_GPIO | 0x09U) /**< EXTI_LINE9 */
|
||
#define EXTI_LINE_GPIO_PIN10 (EXTI_GPIO | 0x0AU) /**< EXTI_LINE10 */
|
||
#define EXTI_LINE_GPIO_PIN11 (EXTI_GPIO | 0x0BU) /**< EXTI_LINE11 */
|
||
#define EXTI_LINE_GPIO_PIN12 (EXTI_GPIO | 0x0CU) /**< EXTI_LINE12 */
|
||
#define EXTI_LINE_GPIO_PIN13 (EXTI_GPIO | 0x0DU) /**< EXTI_LINE13 */
|
||
#define EXTI_LINE_GPIO_PIN14 (EXTI_GPIO | 0x0EU) /**< EXTI_LINE14 */
|
||
#define EXTI_LINE_GPIO_PIN15 (EXTI_GPIO | 0x0FU) /**< EXTI_LINE15 */
|
||
#define EXTI_LINE_COMP1 (EXTI_CONFIG | 0x10U) /**< EXTI_LINE16 */
|
||
#define EXTI_LINE_COMP2 (EXTI_CONFIG | 0x11U) /**< EXTI_LINE17 */
|
||
#define EXTI_LINE_LPUART2 (EXTI_DIRECT | 0x16U) /**< EXTI_LINE22 */
|
||
#define EXTI_LINE_LPTIM2 (EXTI_DIRECT | 0x17U) /**< EXTI_LINE23 */
|
||
#define EXTI_LINE_PVD (EXTI_DIRECT | 0x18U) /**< EXTI_LINE24 */
|
||
#define EXTI_LINE_RTC (EXTI_DIRECT | 0x19U) /**< EXTI_LINE25 */
|
||
#define EXTI_LINE_TAMP (EXTI_DIRECT | 0x1AU) /**< EXTI_LINE26 */
|
||
#define EXTI_LINE_I2C1 (EXTI_DIRECT | 0x1BU) /**< EXTI_LINE27 */
|
||
#define EXTI_LINE_LPUART1 (EXTI_DIRECT | 0x1DU) /**< EXTI_LINE29 */
|
||
#define EXTI_LINE_LPTIM1 (EXTI_DIRECT | 0x1EU) /**< EXTI_LINE30 */
|
||
|
||
/* EXTI LINE 分组 */
|
||
#define EXTI_DIRECT (0x01000000) /**< 直接通道 */
|
||
#define EXTI_CONFIG (0x02000000) /**< 其它可配置通道(COMP1/COMP2) */
|
||
#define EXTI_GPIO (0x06000000) /**< GPIO可配置通道 */
|
||
#define EXTI_PROPERTY_MASK (EXTI_DIRECT | EXTI_CONFIG | EXTI_GPIO) /**< 通道屏蔽掩码 */
|
||
|
||
/* EXTI LINE屏蔽掩码,用于筛选EXTI LINE ID */
|
||
#define EXTI_LINE_MASK (0x0000001FU) /**< EXTI LINE屏蔽掩码 */
|
||
|
||
#define EXTI_MODE_NONE (0x00000000U) /**< 无中断/事件唤醒 */
|
||
#define EXTI_MODE_INTERRUPT (0x00000001U) /**< 中断唤醒 */
|
||
#define EXTI_MODE_EVENT (0x00000002U) /**< 事件唤醒 */
|
||
#define EXTI_MODE_INTERRUPT_EVENT (EXTI_MODE_EVENT | EXTI_MODE_INTERRUPT) /**< 中断/事件唤醒 */
|
||
|
||
/* EXTI LINE 触发类型定义,用于可配置通道,信号触发类型配置 */
|
||
#define EXTI_TRIGGER_NONE (0x00000000U) /**< 不触发 */
|
||
#define EXTI_TRIGGER_RISING (0x00000001U) /**< 上降沿触发 */
|
||
#define EXTI_TRIGGER_FALLING (0x00000002U) /**< 下降沿触发 */
|
||
#define EXTI_TRIGGER_RISING_FALLING (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) /**< 上升沿/下降沿触发 */
|
||
|
||
/* GPIO端口ID定义 */
|
||
#define EXTI_GPIOA (0x00000000UL) /**< GPIOA ID */
|
||
#define EXTI_GPIOB (0x00000001UL) /**< GPIOB ID */
|
||
#define EXTI_GPIOC (0x00000002UL) /**< GPIOC ID */
|
||
#define EXTI_GPIOD (0x00000003UL) /**< GPIOD ID */
|
||
#define EXTI_GPIOF (0x00000005UL) /**< GPIOF ID */
|
||
|
||
/* EXTI LINE 触发类型屏蔽掩码,用于筛选EXTI 可配置通道触发类型 */
|
||
#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) /**< 触发类型屏蔽掩码 */
|
||
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/*-------------------------------------------functions------------------------------------------*/
|
||
|
||
/************************************************************************************************/
|
||
/**
|
||
* @defgroup EXTI_External_Functions EXTI External Functions
|
||
* @brief EXTI对外函数
|
||
* @{
|
||
*
|
||
*/
|
||
/************************************************************************************************/
|
||
|
||
/**
|
||
* @brief 读取EXTI通道中断挂起状态
|
||
* @param exti_line EXTI通道ID
|
||
* @arg EXTI_LINE_GPIO_PIN0
|
||
* @arg EXTI_LINE_GPIO_PIN1
|
||
* @arg ...
|
||
* @arg EXTI_LINE_COMP1
|
||
* @arg EXTI_LINE_COMP2
|
||
* @retval bool 上升沿中断挂起状态
|
||
* @arg true 表示已挂起
|
||
* @arg false 表示未挂起
|
||
*/
|
||
__STATIC_INLINE bool std_exti_get_pending_status(uint32_t exti_line)
|
||
{
|
||
return ((EXTI->PIR & (0x01U << (exti_line & EXTI_LINE_MASK))) != 0);
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 清除EXTI通道中断挂起状态
|
||
* @param exti_line EXTI通道ID
|
||
* @arg EXTI_LINE_GPIO_PIN0
|
||
* @arg EXTI_LINE_GPIO_PIN1
|
||
* @arg ...
|
||
* @arg EXTI_LINE_COMP1
|
||
* @arg EXTI_LINE_COMP2
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_exti_clear_pending(uint32_t exti_line)
|
||
{
|
||
EXTI->PIR = (0x01U << (exti_line & EXTI_LINE_MASK));
|
||
}
|
||
|
||
/**
|
||
* @brief 使能EXTI通道上升沿触发
|
||
* @param exti_line EXTI通道ID
|
||
* @arg EXTI_LINE_GPIO_PIN0
|
||
* @arg EXTI_LINE_GPIO_PIN1
|
||
* @arg ...
|
||
* @arg EXTI_LINE_COMP1
|
||
* @arg EXTI_LINE_COMP2
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_exti_rising_trigger_enable(uint32_t exti_line)
|
||
{
|
||
MODIFY_REG(EXTI->RTSR, (0x01U << (exti_line & EXTI_LINE_MASK)), (0x01U << (exti_line & EXTI_LINE_MASK)));
|
||
}
|
||
|
||
/**
|
||
* @brief 禁止EXTI通道上升沿触发
|
||
* @param exti_line EXTI通道ID
|
||
* @arg EXTI_LINE_GPIO_PIN0
|
||
* @arg EXTI_LINE_GPIO_PIN1
|
||
* @arg ...
|
||
* @arg EXTI_LINE_COMP1
|
||
* @arg EXTI_LINE_COMP2
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_exti_rising_trigger_disable(uint32_t exti_line)
|
||
{
|
||
MODIFY_REG(EXTI->RTSR, (0x01U << (exti_line & EXTI_LINE_MASK)), (0x00U));
|
||
}
|
||
|
||
/**
|
||
* @brief 使能EXTI通道下降沿触发
|
||
* @param exti_line EXTI通道ID
|
||
* @arg EXTI_LINE_GPIO_PIN0
|
||
* @arg EXTI_LINE_GPIO_PIN1
|
||
* @arg ...
|
||
* @arg EXTI_LINE_COMP1
|
||
* @arg EXTI_LINE_COMP2
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_exti_falling_trigger_enable(uint32_t exti_line)
|
||
{
|
||
MODIFY_REG(EXTI->FTSR, (0x01U << (exti_line & EXTI_LINE_MASK)), (0x01U << (exti_line & EXTI_LINE_MASK)));
|
||
}
|
||
|
||
/**
|
||
* @brief 禁止EXTI通道下降沿触发
|
||
* @param exti_line EXTI通道ID
|
||
* @arg EXTI_LINE_GPIO_PIN0
|
||
* @arg EXTI_LINE_GPIO_PIN1
|
||
* @arg ...
|
||
* @arg EXTI_LINE_COMP1
|
||
* @arg EXTI_LINE_COMP2
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_exti_falling_trigger_disable(uint32_t exti_line)
|
||
{
|
||
MODIFY_REG(EXTI->FTSR, (0x01U << (exti_line & EXTI_LINE_MASK)), (0x00U));
|
||
}
|
||
|
||
/**
|
||
* @brief 读取EXTI通道上升沿触发状态
|
||
* @param exti_line EXTI通道ID
|
||
* @arg EXTI_LINE_GPIO_PIN0
|
||
* @arg EXTI_LINE_GPIO_PIN1
|
||
* @arg ...
|
||
* @arg EXTI_LINE_COMP1
|
||
* @arg EXTI_LINE_COMP2
|
||
* @retval bool 上升沿触发状态
|
||
* @arg true 表示已使能
|
||
* @arg false 表示已禁止
|
||
*/
|
||
__STATIC_INLINE bool std_exti_get_rising_trigger_enable(uint32_t exti_line)
|
||
{
|
||
return ((EXTI->RTSR & (0x01U << (exti_line & EXTI_LINE_MASK))) != 0);
|
||
}
|
||
|
||
/**
|
||
* @brief 读取EXTI通道下降沿触发状态
|
||
* @param exti_line EXTI通道ID
|
||
* @arg EXTI_LINE_GPIO_PIN0
|
||
* @arg EXTI_LINE_GPIO_PIN1
|
||
* @arg ...
|
||
* @arg EXTI_LINE_COMP1
|
||
* @arg EXTI_LINE_COMP2
|
||
* @retval bool 下降沿触发状态
|
||
* @arg true 表示已使能
|
||
* @arg false 表示已禁止
|
||
*/
|
||
__STATIC_INLINE bool std_exti_get_falling_trigger_enable(uint32_t exti_line)
|
||
{
|
||
return ((EXTI->FTSR & (0x01U << (exti_line & EXTI_LINE_MASK))) != 0);
|
||
}
|
||
|
||
/**
|
||
* @brief 使能EXTI通道唤醒中断
|
||
* @param exti_line EXTI通道ID
|
||
* @arg EXTI_LINE_GPIO_PIN0
|
||
* @arg EXTI_LINE_GPIO_PIN1
|
||
* @arg ...
|
||
* @arg EXTI_LINE_COMP1
|
||
* @arg EXTI_LINE_COMP2
|
||
* @arg ...
|
||
* @arg EXTI_LINE_LPTIM1
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_exti_interrupt_enable(uint32_t exti_line)
|
||
{
|
||
MODIFY_REG(EXTI->IMR, (0x01U << (exti_line & EXTI_LINE_MASK)), (0x01U << (exti_line & EXTI_LINE_MASK)));
|
||
}
|
||
|
||
/**
|
||
* @brief 禁止EXTI通道唤醒中断
|
||
* @param exti_line EXTI通道ID
|
||
* @arg EXTI_LINE_GPIO_PIN0
|
||
* @arg EXTI_LINE_GPIO_PIN1
|
||
* @arg ...
|
||
* @arg EXTI_LINE_COMP1
|
||
* @arg EXTI_LINE_COMP2
|
||
* @arg ...
|
||
* @arg EXTI_LINE_LPTIM1
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_exti_interrupt_disable(uint32_t exti_line)
|
||
{
|
||
MODIFY_REG(EXTI->IMR, (0x01U << (exti_line & EXTI_LINE_MASK)), (0x00U));
|
||
}
|
||
|
||
/**
|
||
* @brief 使能EXTI通道唤醒事件
|
||
* @param exti_line EXTI通道ID
|
||
* @arg EXTI_LINE_GPIO_PIN0
|
||
* @arg EXTI_LINE_GPIO_PIN1
|
||
* @arg ...
|
||
* @arg EXTI_LINE_COMP1
|
||
* @arg EXTI_LINE_COMP2
|
||
* @arg ...
|
||
* @arg EXTI_LINE_LPTIM1
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_exti_event_enable(uint32_t exti_line)
|
||
{
|
||
MODIFY_REG(EXTI->EMR, (0x01U << (exti_line & EXTI_LINE_MASK)), (0x01U << (exti_line & EXTI_LINE_MASK)));
|
||
}
|
||
|
||
/**
|
||
* @brief 禁止EXTI通道唤醒事件
|
||
* @param exti_line EXTI通道ID
|
||
* @arg EXTI_LINE_GPIO_PIN0
|
||
* @arg EXTI_LINE_GPIO_PIN1
|
||
* @arg ...
|
||
* @arg EXTI_LINE_COMP1
|
||
* @arg EXTI_LINE_COMP2
|
||
* @arg ...
|
||
* @arg EXTI_LINE_LPTIM1
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_exti_event_disable(uint32_t exti_line)
|
||
{
|
||
MODIFY_REG(EXTI->EMR, (0x01U << (exti_line & EXTI_LINE_MASK)), (0x00U));
|
||
}
|
||
|
||
/**
|
||
* @brief 设置EXTI通道所对应GPIO端口
|
||
* @param gpio_id GPIO端口ID
|
||
* @arg EXTI_GPIOA
|
||
* @arg EXTI_GPIOB
|
||
* @arg ...
|
||
* @param exti_line EXTI通道ID
|
||
* @arg EXTI_LINE_GPIO_PIN0
|
||
* @arg EXTI_LINE_GPIO_PIN1
|
||
* @arg ...
|
||
* @arg EXTI_LINE_GPIO_PIN15
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_exti_set_gpio(uint32_t gpio_id, uint32_t exti_line)
|
||
{
|
||
if ((exti_line & EXTI_GPIO) == EXTI_GPIO)
|
||
{
|
||
exti_line &= EXTI_LINE_MASK;
|
||
MODIFY_REG(EXTI->EXTICR[(exti_line & EXTI_LINE_MASK) >> 3U],
|
||
(EXTI_EXTICR1_EXTI0_MASK << (EXTI_EXTICR1_EXTI1_POS * (exti_line & EXTI_EXTICR1_EXTI0_MASK))),
|
||
(gpio_id << (EXTI_EXTICR1_EXTI1_POS * (exti_line & EXTI_EXTICR1_EXTI0_MASK))));
|
||
}
|
||
}
|
||
|
||
void std_exti_init(std_exti_init_t* exti_init_param);
|
||
void std_exti_deinit(void);
|
||
void std_exti_struct_init(std_exti_init_t* exti_init_struct);
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
#endif /* CIU32L051_STD_EXTI_H */
|