CIU32_L051_M307R/Peripheral/CIU32L051_Lib/Include/ciu32l051_std_exti.h

397 lines
15 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/************************************************************************************************/
/**
* @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 */