783 lines
26 KiB
C
783 lines
26 KiB
C
/************************************************************************************************/
|
||
/**
|
||
* @file ciu32l051_std_lptim.h
|
||
* @author MCU Ecosystem Development Team
|
||
* @brief LPTIM STD库驱动头文件。
|
||
* 提供LPTIM相关的STD库操作函数声明、数据类型以及常量的定义。
|
||
*
|
||
*
|
||
**************************************************************************************************
|
||
* @attention
|
||
* Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
|
||
*
|
||
**************************************************************************************************
|
||
*/
|
||
|
||
/*避免头文件重复引用*/
|
||
#ifndef CIU32L051_STD_LPTIM_H
|
||
#define CIU32L051_STD_LPTIM_H
|
||
|
||
/************************************************************************************************/
|
||
/**
|
||
* @addtogroup CIU32L051_STD_Driver
|
||
* @{
|
||
*/
|
||
|
||
/**
|
||
* @defgroup LPTIM LPTIM
|
||
* @brief 低功耗定时器的STD库驱动
|
||
* @{
|
||
*/
|
||
/************************************************************************************************/
|
||
|
||
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/*------------------------------------------includes--------------------------------------------*/
|
||
#include "ciu32l051_std_common.h"
|
||
|
||
|
||
/*------------------------------------type define-----------------------------------------------*/
|
||
|
||
/************************************************************************************************/
|
||
/**
|
||
* @defgroup LPTIM_Types LPTIM Types
|
||
* @brief LPTIM数据类型定义
|
||
* @{
|
||
*/
|
||
/************************************************************************************************/
|
||
/**
|
||
* @brief LPTIM初始化结构体定义
|
||
*/
|
||
typedef struct
|
||
{
|
||
uint32_t clock_source; /**< LPTIM时钟源选择
|
||
@arg LPTIM_CLK_SRC_INT... */
|
||
|
||
uint32_t prescaler; /**< LPTIM预分频器系数选择
|
||
@arg LPTIM_PRESCALER_DIV1... */
|
||
|
||
uint32_t count_source; /**< LPTIM计数时钟源选择
|
||
@arg LPTIM_COUNTER_CLK_INT... */
|
||
|
||
uint32_t out_polarity; /**< LPTIM输出极性配置
|
||
@arg LPTIM_OUTPUT_POLARITY_REGULAR... */
|
||
}std_lptim_init_t;
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/*--------------------------------------------define--------------------------------------------*/
|
||
|
||
/************************************************************************************************/
|
||
/**
|
||
* @defgroup LPTIM_Constants LPTIM Constants
|
||
* @brief LPTIM常量定义及宏定义
|
||
* @{
|
||
*
|
||
*/
|
||
/************************************************************************************************/
|
||
|
||
/* 计数器计数模式 */
|
||
#define LPTIM_COUNT_CONTINUOUS LPTIM_CR_CNTSTRT /**< PWM模式计数 */
|
||
#define LPTIM_COUNT_SINGLE LPTIM_CR_SNGSTRT /**< 单脉冲模式计数 */
|
||
|
||
/* 计数器时钟源选择 */
|
||
#define LPTIM_COUNTER_CLK_INT (0x00000000U) /**< 内部时钟源计数 */
|
||
#define LPTIM_COUNTER_CLK_EXT LPTIM_CFG_COUNT_MODE /**< 外部时钟源计数 */
|
||
|
||
/* 输出极性选择 */
|
||
#define LPTIM_OUTPUT_POLARITY_REGULAR (0x00000000U) /**< CNT小于CMP输出低电平,否则输出高有效 */
|
||
#define LPTIM_OUTPUT_POLARITY_REVERSE LPTIM_CFG_WAVPOL /**< CNT小于CMP输出高电平,否则输出低电平 */
|
||
|
||
/* LPTIM PSC预分频器分频系数选择 */
|
||
#define LPTIM_PRESCALER_DIV1 LPTIM_CFG_PRESC_1 /**< PSC预分频器1分频 */
|
||
#define LPTIM_PRESCALER_DIV2 LPTIM_CFG_PRESC_2 /**< PSC预分频器2分频 */
|
||
#define LPTIM_PRESCALER_DIV4 LPTIM_CFG_PRESC_4 /**< PSC预分频器4分频 */
|
||
#define LPTIM_PRESCALER_DIV8 LPTIM_CFG_PRESC_8 /**< PSC预分频器8分频 */
|
||
#define LPTIM_PRESCALER_DIV16 LPTIM_CFG_PRESC_16 /**< PSC预分频器16分频 */
|
||
#define LPTIM_PRESCALER_DIV32 LPTIM_CFG_PRESC_32 /**< PSC预分频器32分频 */
|
||
#define LPTIM_PRESCALER_DIV64 LPTIM_CFG_PRESC_64 /**< PSC预分频器64分频 */
|
||
#define LPTIM_PRESCALER_DIV128 LPTIM_CFG_PRESC_128 /**< PSC预分频器128分频 */
|
||
|
||
/* LPTIM_IN1信号源选择 */
|
||
#define LPTIM_IN1_SRC_GPIO LPTIM_CFG2_IN1_SEL_IN1 /**< GPIO输入 */
|
||
#define LPTIM_IN1_SRC_COMP1 LPTIM_CFG2_IN1_SEL_COMP1 /**< COMP1输出信号 */
|
||
|
||
/* LPTIM_IN2信号源选择 */
|
||
#define LPTIM_IN2_SRC_GPIO LPTIM_CFG2_IN2_SEL_IN2 /**< GPIO输入 */
|
||
#define LPTIM_IN2_SRC_COMP2 LPTIM_CFG2_IN2_SEL_COMP2 /**< COMP2输出信号 */
|
||
|
||
/* LPTIM外部触发源选择 */
|
||
#define LPTIM_TRIG_SRC_GPIO LPTIM_CFG_TRIG_SEL_ETR /**< 外部GPIO触发 */
|
||
#define LPTIM_TRIG_SRC_RTCALARM LPTIM_CFG_TRIG_SEL_RTCALARM /**< RTC_ALARM触发 */
|
||
#define LPTIM_TRIG_SRC_COMP1 LPTIM_CFG_TRIG_SEL_COMP1 /**< COMP1输出信号触发 */
|
||
#define LPTIM_TRIG_SRC_COMP2 LPTIM_CFG_TRIG_SEL_COMP2 /**< COMP2输出信号触发 */
|
||
|
||
/* LPTIM外部触发源极性选择 */
|
||
#define LPTIM_TRIG_EDGE_RISING LPTIM_CFG_TRIG_EN_RISING /**< 外部触发上升沿有效 */
|
||
#define LPTIM_TRIG_EDGE_FALLING LPTIM_CFG_TRIG_EN_FALLING /**< 外部触发下降沿有效 */
|
||
#define LPTIM_TRIG_EDGE_BOTH LPTIM_CFG_TRIG_EN_RISING_FALLING /**< 外部触发双沿有效 */
|
||
|
||
/* LPTIM外部触发滤波配置 */
|
||
#define LPTIM_TRIG_SAMPLETIME_NOFLT LPTIM_CFG_TRIG_FLT_NONE /**< 任何触发信号的有效电平变化均认为有效触发 */
|
||
#define LPTIM_TRIG_SAMPLETIME_2 LPTIM_CFG_TRIG_FLT_2 /**< 2个采样周期均采到有效电平视为有效触发 */
|
||
#define LPTIM_TRIG_SAMPLETIME_4 LPTIM_CFG_TRIG_FLT_4 /**< 4个采样周期均采到有效电平视为有效触发 */
|
||
#define LPTIM_TRIG_SAMPLETIME_8 LPTIM_CFG_TRIG_FLT_8 /**< 8个采样周期均采到有效电平视为有效触发 */
|
||
|
||
/* LPTIM时钟源选择 */
|
||
#define LPTIM_CLK_SRC_INT (0x00000000U) /**< LPTIM时钟源选择内部时钟 */
|
||
#define LPTIM_CLK_SRC_EXT LPTIM_CFG_CKSEL /**< LPTIM时钟源选择外部时钟 */
|
||
|
||
/* LPTIM外部时钟有效极性 */
|
||
#define LPTIM_EXTCLK_POL_RISING (0x00000000U) /**< LPTIM外部时钟上升沿有效 */
|
||
#define LPTIM_EXTCLK_POL_FALLING LPTIM_CFG_CKPOL_FALLING /**< LPTIM外部时钟上升沿有效 */
|
||
#define LPTIM_EXTCLK_POL_BOTH LPTIM_CFG_CKPOL_RISING_FALLING /**< LPTIM外部时钟任意边沿有效 */
|
||
|
||
/* LPTIM外部时钟滤波器配置 */
|
||
#define LPTIM_EXTCLK_SAMPLETIME_NOFLT LPTIM_CFG_CKFLT_NONE /**< 任何触发信号的有效电平变化均认为有效触发 */
|
||
#define LPTIM_EXTCLK_SAMPLETIME_2 LPTIM_CFG_CKFLT_2 /**< 2个采样周期均采到有效电平视为有效触发 */
|
||
#define LPTIM_EXTCLK_SAMPLETIME_4 LPTIM_CFG_CKFLT_4 /**< 4个采样周期均采到有效电平视为有效触发 */
|
||
#define LPTIM_EXTCLK_SAMPLETIME_8 LPTIM_CFG_CKFLT_8 /**< 8个采样周期均采到有效电平视为有效触发 */
|
||
|
||
/* LPTIM正交编码模式设置 */
|
||
#define LPTIM_ENCODER_MODE1 (0x00000000U) /**< 编码器模式1,上升沿有效 */
|
||
#define LPTIM_ENCODER_MODE2 LPTIM_CFG_CKPOL_FALLING /**< 编码器模式2,上升沿有效 */
|
||
#define LPTIM_ENCODER_MODE3 LPTIM_CFG_CKPOL_RISING_FALLING /**< 编码器模式3,上升沿有效 */
|
||
|
||
/* LPTIM DMA请求源 */
|
||
#define LPTIM_DMA_REQUEST_ARR LPTIM_IER_ARR_DMAEN /**< 自动重载匹配DMA请求 */
|
||
#define LPTIM_DMA_REQUEST_CMP LPTIM_IER_CMP_DMAEN /**< 比较匹配DMA请求 */
|
||
|
||
/* LPTIM中断源 */
|
||
#define LPTIM_INTERRUPT_CMPM LPTIM_IER_CMPM_IE /**< 比较匹配中断使能 */
|
||
#define LPTIM_INTERRUPT_ARRM LPTIM_IER_ARRM_IE /**< 自动重载匹配中断使能 */
|
||
#define LPTIM_INTERRUPT_EXTTRIG LPTIM_IER_EXTTRIG_IE /**< 外部触发有效边沿中断使能 */
|
||
#define LPTIM_INTERRUPT_UP LPTIM_IER_UP_IE /**< 计数方向变为递增中断使能 */
|
||
#define LPTIM_INTERRUPT_DOWN LPTIM_IER_DOWN_IE /**< 计数方向变为递减中断使能 */
|
||
|
||
/* LPTIM中断状态标志 */
|
||
#define LPTIM_FLAG_CMPM LPTIM_ISR_CMPM /**< 比较匹配标志 */
|
||
#define LPTIM_FLAG_ARRM LPTIM_ISR_ARRM /**< 自动重载匹配标志 */
|
||
#define LPTIM_FLAG_EXTTRIG LPTIM_ISR_EXTTRIG /**< 外部触发标志 */
|
||
#define LPTIM_FLAG_UP LPTIM_ISR_UP /**< 正交编码,递增计数方向标志 */
|
||
#define LPTIM_FLAG_DOWN LPTIM_ISR_DOWN /**< 正交编码,递减计数方向标志 */
|
||
|
||
/* LPTIM中断清除标志 */
|
||
#define LPTIM_CLEAR_CMPM LPTIM_ICR_CMPM_CF /**< 比较匹配标志清零 */
|
||
#define LPTIM_CLEAR_ARRM LPTIM_ICR_ARRM_CF /**< 自动重载匹配标志清零 */
|
||
#define LPTIM_CLEAR_EXTTRIG LPTIM_ICR_EXTTRIG_CF /**< 外部触发有效边沿标志清零 */
|
||
#define LPTIM_CLEAR_UP LPTIM_ICR_UP_CF /**< 计数方向变为递增标志清零 */
|
||
#define LPTIM_CLEAR_DOWN LPTIM_ICR_DOWN_CF /**< 计数方向变为递减标志清零 */
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/*-------------------------------------------functions------------------------------------------*/
|
||
/************************************************************************************************/
|
||
/**
|
||
* @defgroup LPTIM_External_Functions LPTIM External Functions
|
||
* @brief LPTIM对外函数
|
||
* @{
|
||
*
|
||
*/
|
||
/************************************************************************************************/
|
||
/**
|
||
* @brief 使能LPTIM
|
||
* @param lptimx LPTIM外设
|
||
* @note 在LPTIM使能位置位后,需要两个计数器周期后才能生效
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_enable(LPTIM_t *lptimx)
|
||
{
|
||
lptimx->CR |= LPTIM_CR_ENABLE;
|
||
}
|
||
|
||
/**
|
||
* @brief 禁止LPTIM
|
||
* @param lptimx LPTIM外设
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_disable(LPTIM_t *lptimx)
|
||
{
|
||
lptimx->CR &= (~LPTIM_CR_ENABLE);
|
||
}
|
||
|
||
/**
|
||
* @brief 配置LPTIM计数器按照预期模式开始计数
|
||
* @param lptimx LPTIM外设
|
||
* @param operate_mode 计数模式选择
|
||
* @arg LPTIM_COUNT_CONTINUOUS: PWM模式计数
|
||
* @arg LPTIM_COUNT_SINGLE: 单脉冲模式计数
|
||
* @note 必须使能LPTIM后才能启动计数器计数
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_start_counter(LPTIM_t *lptimx, uint32_t operate_mode)
|
||
{
|
||
MODIFY_REG(lptimx->CR, (LPTIM_CR_CNTSTRT | LPTIM_CR_SNGSTRT), operate_mode);
|
||
}
|
||
|
||
/**
|
||
* @brief 设置LPTIM自动重装载值
|
||
* @param lptimx LPTIM外设
|
||
* @param auto_reload 自动重装载值(该变量的范围为0x0~0xFFFF)
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_set_auto_reload(LPTIM_t *lptimx, uint32_t auto_reload)
|
||
{
|
||
lptimx->ARR = auto_reload;
|
||
}
|
||
|
||
/**
|
||
* @brief 获取LPTIM自动重装载值
|
||
* @param lptimx LPTIM外设
|
||
* @retval uint32_t 自动重装载值(该变量的范围为0x0~0xFFFF)
|
||
*/
|
||
__STATIC_INLINE uint32_t std_lptim_get_auto_reload(LPTIM_t *lptimx)
|
||
{
|
||
return (lptimx->ARR);
|
||
}
|
||
|
||
/**
|
||
* @brief 设置LPTIM比较值
|
||
* @param lptimx LPTIM外设
|
||
* @param compare_Value 比较值(该变量的范围为0x0~0xFFFF)
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_set_compare(LPTIM_t *lptimx, uint32_t compare_Value)
|
||
{
|
||
lptimx->CMP = compare_Value;
|
||
}
|
||
|
||
/**
|
||
* @brief 获取LPTIM比较值
|
||
* @param lptimx LPTIM外设
|
||
* @retval uint32_t 比较值(该变量的范围为0x0~0xFFFF)
|
||
*/
|
||
__STATIC_INLINE uint32_t std_lptim_get_compare(LPTIM_t *lptimx)
|
||
{
|
||
return (lptimx->CMP);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取LPTIM计数值
|
||
* @param lptimx LPTIM外设
|
||
* @note 当LPTIM为异步时钟计数时,为确保获取正确的计数值,需要确保两次读取的计数值一致。
|
||
* @retval uint32_t LPTIM计数值(该变量的范围为0x0~0xFFFF)
|
||
*/
|
||
__STATIC_INLINE uint32_t std_lptim_get_count(LPTIM_t *lptimx)
|
||
{
|
||
return (lptimx->CNT);
|
||
}
|
||
|
||
/**
|
||
* @brief 设置LPTIM计数器时钟源
|
||
* @param lptimx LPTIM外设
|
||
* @param counter_clk_src 计数器时钟来源
|
||
* @arg LPTIM_COUNTER_CLK_INT: 计数器在内部时钟每个有效边沿递增
|
||
* @arg LPTIM_COUNTER_CLK_EXT: 计数器在LPTIMx_IN1上输入的外部时钟每个有效边沿递增
|
||
* @note LPTIM工作时钟选择内部时钟时,该函数配置有效
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_set_counter_clk_source(LPTIM_t *lptimx, uint32_t counter_clk_src)
|
||
{
|
||
MODIFY_REG(lptimx->CFG, LPTIM_CFG_COUNT_MODE, counter_clk_src);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取LPTIM计数器时钟源
|
||
* @param lptimx LPTIM外设
|
||
* @retval uint32_t 计数器时钟来源
|
||
* @arg LPTIM_COUNTER_CLK_INT: 计数器在内部时钟每个有效边沿递增
|
||
* @arg LPTIM_COUNTER_CLK_EXT: 计数器在LPTIMx_IN1上输入的外部时钟每个有效边沿递增
|
||
*/
|
||
__STATIC_INLINE uint32_t std_lptim_get_counter_clk_source(LPTIM_t *lptimx)
|
||
{
|
||
return (lptimx->CFG & LPTIM_CFG_COUNT_MODE);
|
||
}
|
||
|
||
/**
|
||
* @brief 设置LPTIM输出波形极性(LPTIMx_OUT)
|
||
* @param lptimx LPTIM外设
|
||
* @param polarity 输出波形极性
|
||
* @arg LPTIM_OUTPUT_POLARITY_REGULAR: 当CNT < CMP输出低电平,否则输出高电平
|
||
* @arg LPTIM_OUTPUT_POLARITY_REVERSE: 当CNT < CMP输出高电平,否则输出低电平
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_set_wave_polarity(LPTIM_t *lptimx, uint32_t polarity)
|
||
{
|
||
MODIFY_REG(lptimx->CFG, LPTIM_CFG_WAVPOL, polarity);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取LPTIM输出波形极性(LPTIMx_OUT)
|
||
* @param lptimx LPTIM外设
|
||
* @retval uint32_t 输出波形极性
|
||
* @arg LPTIM_OUTPUT_POLARITY_REGULAR: 当CNT < CMP输出低电平,当CNT > CMP且CNT < ARR时输出高电平
|
||
* @arg LPTIM_OUTPUT_POLARITY_REVERSE: 当CNT < CMP输出高电平,当CNT > CMP且CNT < ARR时输出低电平
|
||
*/
|
||
__STATIC_INLINE uint32_t std_lptim_get_wave_polarity(LPTIM_t *lptimx)
|
||
{
|
||
return (lptimx->CFG & LPTIM_CFG_WAVPOL);
|
||
}
|
||
|
||
/**
|
||
* @brief 设置LPTIM预分频器分频系数
|
||
* @param lptimx LPTIM外设
|
||
* @param prescaler 预分频系数选择
|
||
* @arg LPTIM_PRESCALER_DIV1
|
||
* @arg LPTIM_PRESCALER_DIV2
|
||
* @arg LPTIM_PRESCALER_DIV4
|
||
* @arg ...
|
||
* @arg LPTIM_PRESCALER_DIV128
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_set_prescaler(LPTIM_t *lptimx, uint32_t prescaler)
|
||
{
|
||
MODIFY_REG(lptimx->CFG, LPTIM_CFG_PRESC, prescaler);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取LPTIM预分频器分频系数
|
||
* @param lptimx LPTIM外设
|
||
* @retval uint32_t 预分频系数选择
|
||
* @arg LPTIM_PRESCALER_DIV1
|
||
* @arg LPTIM_PRESCALER_DIV2
|
||
* @arg LPTIM_PRESCALER_DIV4
|
||
* @arg ...
|
||
* @arg LPTIM_PRESCALER_DIV128
|
||
*/
|
||
__STATIC_INLINE uint32_t std_lptim_get_prescaler(LPTIM_t *lptimx)
|
||
{
|
||
return (lptimx->CFG & LPTIM_CFG_PRESC);
|
||
}
|
||
|
||
/**
|
||
* @brief 设置LPTIMx_IN1信号源
|
||
* @param lptimx LPTIM外设
|
||
* @param in1_source LPTIMx_IN1信号源选择
|
||
* @arg LPTIM_IN1_SRC_GPIO
|
||
* @arg LPTIM_IN1_SRC_COMP1
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_set_input1_source(LPTIM_t *lptimx, uint32_t in1_source)
|
||
{
|
||
MODIFY_REG(lptimx->CFG2, LPTIM_CFG2_IN1_SEL, in1_source);
|
||
}
|
||
|
||
/**
|
||
* @brief 设置LPTIMx_IN2信号源
|
||
* @param lptimx LPTIM外设
|
||
* @param in2_source LPTIMx_IN2信号源选择
|
||
* @arg LPTIM_IN2_SRC_GPIO
|
||
* @arg LPTIM_IN2_SRC_COMP2
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_set_input2_source(LPTIM_t *lptimx, uint32_t in2_source)
|
||
{
|
||
MODIFY_REG(lptimx->CFG2, LPTIM_CFG2_IN2_SEL, in2_source);
|
||
}
|
||
|
||
/**
|
||
* @brief 使能LPTIM超时功能
|
||
* @param lptimx LPTIM外设
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_timeout_enable(LPTIM_t *lptimx)
|
||
{
|
||
lptimx->CFG |= LPTIM_CFG_TIMOUT;
|
||
}
|
||
|
||
/**
|
||
* @brief 禁止LPTIM超时功能
|
||
* @param lptimx LPTIM外设
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_timeout_disable(LPTIM_t *lptimx)
|
||
{
|
||
lptimx->CFG &= (~LPTIM_CFG_TIMOUT);
|
||
}
|
||
|
||
/**
|
||
* @brief 设置软件触发计数
|
||
* @param lptimx LPTIM外设
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_set_software_trig(LPTIM_t *lptimx)
|
||
{
|
||
lptimx->CFG &= (~LPTIM_CFG_TRIG_EN);
|
||
}
|
||
|
||
/**
|
||
* @brief 设置外部触发源
|
||
* @param lptimx LPTIM外设
|
||
* @param trig_source 外部触发源
|
||
* @arg LPTIM_TRIG_SRC_GPIO
|
||
* @arg LPTIM_TRIG_SRC_RTCALARM
|
||
* @arg ...
|
||
* @arg LPTIM_TRIG_SRC_COMP2
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_set_external_trig_source(LPTIM_t *lptimx, uint32_t trig_source)
|
||
{
|
||
MODIFY_REG(lptimx->CFG, LPTIM_CFG_TRIG_SEL, trig_source);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取外部触发源
|
||
* @param lptimx LPTIM外设
|
||
* @retval uint32_t 外部触发源
|
||
* @arg LPTIM_TRIG_SRC_GPIO
|
||
* @arg LPTIM_TRIG_SRC_RTCALARM
|
||
* @arg ...
|
||
* @arg LPTIM_TRIG_SRC_COMP2
|
||
*/
|
||
__STATIC_INLINE uint32_t std_lptim_get_external_trig_source(LPTIM_t *lptimx)
|
||
{
|
||
return (lptimx->CFG & LPTIM_CFG_TRIG_SEL);
|
||
}
|
||
|
||
/**
|
||
* @brief 设置外部触发源极性
|
||
* @param lptimx LPTIM外设
|
||
* @param trig_polarity 外部触发源极性
|
||
* @arg LPTIM_TRIG_EDGE_RISING
|
||
* @arg LPTIM_TRIG_EDGE_FALLING
|
||
* @arg LPTIM_TRIG_EDGE_BOTH
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_set_external_trig_polarity(LPTIM_t *lptimx, uint32_t trig_polarity)
|
||
{
|
||
MODIFY_REG(lptimx->CFG, LPTIM_CFG_TRIG_EN, trig_polarity);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取外部触发源极性
|
||
* @param lptimx LPTIM外设
|
||
* @retval uint32_t 外部触发源极性
|
||
* @arg LPTIM_TRIG_EDGE_RISING
|
||
* @arg LPTIM_TRIG_EDGE_FALLING
|
||
* @arg LPTIM_TRIG_EDGE_BOTH
|
||
*/
|
||
__STATIC_INLINE uint32_t std_lptim_get_external_trig_polarity(LPTIM_t *lptimx)
|
||
{
|
||
return (lptimx->CFG & LPTIM_CFG_TRIG_EN);
|
||
}
|
||
|
||
/**
|
||
* @brief 设置外部触发信号滤波配置
|
||
* @param lptimx LPTIM外设
|
||
* @param trig_filter 触发滤波配置
|
||
* @arg LPTIM_TRIG_SAMPLETIME_NOFLT
|
||
* @arg LPTIM_TRIG_SAMPLETIME_2
|
||
* @arg LPTIM_TRIG_SAMPLETIME_4
|
||
* @arg LPTIM_TRIG_SAMPLETIME_8
|
||
* @note 触发信号滤波宽度为N时,连续N个采样周期均采到有效电平才视为有效触发
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_set_external_trig_filter(LPTIM_t *lptimx, uint32_t trig_filter)
|
||
{
|
||
MODIFY_REG(lptimx->CFG, LPTIM_CFG_TRIG_FLT, trig_filter);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取外部触发源滤波器配置
|
||
* @param lptimx LPTIM外设
|
||
* @retval uint32_t 触发滤波配置
|
||
* @arg LPTIM_TRIG_SAMPLETIME_NOFLT
|
||
* @arg LPTIM_TRIG_SAMPLETIME_2
|
||
* @arg LPTIM_TRIG_SAMPLETIME_4
|
||
* @arg LPTIM_TRIG_SAMPLETIME_8
|
||
*/
|
||
__STATIC_INLINE uint32_t std_lptim_get_external_trig_filter(LPTIM_t *lptimx)
|
||
{
|
||
return (lptimx->CFG & LPTIM_CFG_TRIG_FLT);
|
||
}
|
||
|
||
/**
|
||
* @brief 选择LPTIM时钟源
|
||
* @param lptimx LPTIM外设
|
||
* @param clock_source LPTIM时钟源选择
|
||
* @arg LPTIM_CLK_SRC_INT: 选择内部时钟源
|
||
* @arg LPTIM_CLK_SRC_EXT: 选择外部时钟源
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_set_clock_source(LPTIM_t *lptimx, uint32_t clock_source)
|
||
{
|
||
MODIFY_REG(lptimx->CFG, LPTIM_CFG_CKSEL, clock_source);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取LPTIM时钟源
|
||
* @param lptimx LPTIM外设
|
||
* @retval uint32_t LPTIM时钟源选择
|
||
* @arg LPTIM_CLK_SRC_INT: 选择内部时钟源
|
||
* @arg LPTIM_CLK_SRC_EXT: 选择外部时钟源
|
||
*/
|
||
__STATIC_INLINE uint32_t std_lptim_get_clock_source(LPTIM_t *lptimx)
|
||
{
|
||
return (lptimx->CFG & LPTIM_CFG_CKSEL);
|
||
}
|
||
|
||
/**
|
||
* @brief 配置外部时钟源极性
|
||
* @param lptimx LPTIM外设
|
||
* @param polarity 外部时钟有效极性
|
||
* @arg LPTIM_EXTCLK_POL_RISING: 外部时钟源上升沿有效
|
||
* @arg LPTIM_EXTCLK_POL_FALLING: 外部时钟源下降沿有效
|
||
* @arg LPTIM_EXTCLK_POL_BOTH: 外部时钟源任意边沿有效
|
||
* @note 当选择任意边沿有效时,LPTIMx必须选择内部时钟源,且内部时钟频率大于等于外部时钟频率的4倍
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_set_external_clk_polarity(LPTIM_t *lptimx, uint32_t polarity)
|
||
{
|
||
MODIFY_REG(lptimx->CFG, LPTIM_CFG_CKPOL, polarity);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取外部时钟源极性
|
||
* @param lptimx LPTIM外设
|
||
* @retval uint32_t LPTIM时钟源极性
|
||
* @arg LPTIM_EXTCLK_POL_RISING: 外部时钟源上升沿有效
|
||
* @arg LPTIM_EXTCLK_POL_FALLING: 外部时钟源下降沿有效
|
||
* @arg LPTIM_EXTCLK_POL_BOTH: 外部时钟源任意边沿有效
|
||
*/
|
||
__STATIC_INLINE uint32_t std_lptim_get_external_clk_polarity(LPTIM_t *lptimx)
|
||
{
|
||
return (lptimx->CFG & LPTIM_CFG_CKPOL);
|
||
}
|
||
|
||
/**
|
||
* @brief 配置外部输入信号数字滤波器
|
||
* @param lptimx LPTIM外设
|
||
* @param clk_filter 外部时钟数字滤波器配置
|
||
* @arg LPTIM_EXTCLK_SAMPLETIME_NOFLT: 无滤波
|
||
* @arg LPTIM_EXTCLK_SAMPLETIME_2: 2个滤波周期
|
||
* @arg LPTIM_EXTCLK_SAMPLETIME_4: 4个滤波周期
|
||
* @arg LPTIM_EXTCLK_SAMPLETIME_8: 8个滤波周期
|
||
* @note 外部时钟信号滤波宽度为N时,连续N个采样周期均采到有效电平才视为有效切换
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_set_extern_clk_filter(LPTIM_t *lptimx, uint32_t clk_filter)
|
||
{
|
||
MODIFY_REG(lptimx->CFG, LPTIM_CFG_CKFLT, clk_filter);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取外部时钟数字滤波器配置
|
||
* @param lptimx LPTIM外设
|
||
* @retval uint32_t 外部时钟数字滤波器配置
|
||
* @arg LPTIM_EXTCLK_SAMPLETIME_NOFLT: 无滤波
|
||
* @arg LPTIM_EXTCLK_SAMPLETIME_2: 2个滤波周期
|
||
* @arg LPTIM_EXTCLK_SAMPLETIME_4: 4个滤波周期
|
||
* @arg LPTIM_EXTCLK_SAMPLETIME_8: 8个滤波周期
|
||
*/
|
||
__STATIC_INLINE uint32_t std_lptim_get_external_clk_filter(LPTIM_t *lptimx)
|
||
{
|
||
return (lptimx->CFG & LPTIM_CFG_CKFLT);
|
||
}
|
||
|
||
/**
|
||
* @brief 使能正交编码器模式
|
||
* @param lptimx LPTIM外设
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_encoder_enable(LPTIM_t *lptimx)
|
||
{
|
||
lptimx->CFG |= LPTIM_CFG_ENC;
|
||
}
|
||
|
||
/**
|
||
* @brief 禁止正交编码器模式
|
||
* @param lptimx LPTIM外设
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_encoder_disable(LPTIM_t *lptimx)
|
||
{
|
||
lptimx->CFG &= (~LPTIM_CFG_ENC);
|
||
}
|
||
|
||
/**
|
||
* @brief 设置正交编码器模式
|
||
* @param lptimx LPTIM外设
|
||
* @param encoder_mode 正交编码器编码模式
|
||
* @arg LPTIM_ENCODER_MODE1: 编码器模式1,上升沿有效
|
||
* @arg LPTIM_ENCODER_MODE2: 编码器模式2,下降沿有效
|
||
* @arg LPTIM_ENCODER_MODE3: 编码器模式3,上升沿和下降沿有效
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_set_encoder_mode(LPTIM_t *lptimx, uint32_t encoder_mode)
|
||
{
|
||
MODIFY_REG(lptimx->CFG, LPTIM_CFG_CKPOL, encoder_mode);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取正交编码器模式
|
||
* @param lptimx LPTIM外设
|
||
* @retval uint32_t 正交编码器编码模式
|
||
* @arg LPTIM_ENCODER_MODE1
|
||
* @arg LPTIM_ENCODER_MODE2
|
||
* @arg LPTIM_ENCODER_MODE3
|
||
*/
|
||
__STATIC_INLINE uint32_t std_lptim_get_encoder_mode(LPTIM_t *lptimx)
|
||
{
|
||
return (lptimx->CFG & LPTIM_CFG_CKPOL);
|
||
}
|
||
|
||
/**
|
||
* @brief 使能LPTIMx DMA请求
|
||
* @param lptimx LPTIM外设
|
||
* @param dma_req LPTIM DMA请求源
|
||
* @arg LPTIM_DMA_REQUEST_ARR: 自动重载匹配DMA请求
|
||
* @arg LPTIM_DMA_REQUEST_CMP: 比较匹配DMA请求
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_dma_request_enable(LPTIM_t *lptimx, uint32_t dma_req)
|
||
{
|
||
lptimx->IER |= dma_req;
|
||
}
|
||
|
||
/**
|
||
* @brief 禁止LPTIMx DMA请求
|
||
* @param lptimx LPTIM外设
|
||
* @param dma_req LPTIM DMA请求源
|
||
* @arg LPTIM_DMA_REQUEST_ARR: 自动重载匹配DMA请求
|
||
* @arg LPTIM_DMA_REQUEST_CMP: 比较匹配DMA请求
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_dma_request_disable(LPTIM_t *lptimx, uint32_t dma_req)
|
||
{
|
||
lptimx->IER &= (~dma_req);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取LPTIMx DMA请求使能状态
|
||
* @param lptimx LPTIM外设
|
||
* @param dma_req LPTIM DMA请求源
|
||
* @arg LPTIM_DMA_REQUEST_ARR: 自动重载匹配DMA请求
|
||
* @arg LPTIM_DMA_REQUEST_CMP: 比较匹配DMA请求
|
||
* @retval bool DMA请求源使能状态
|
||
* @arg true: DMA请求源使能
|
||
* @arg false: DMA请求源禁止
|
||
*/
|
||
__STATIC_INLINE uint32_t std_lptim_get_dma_request_status(LPTIM_t *lptimx, uint32_t dma_req)
|
||
{
|
||
return ((lptimx->IER & dma_req) == dma_req);
|
||
}
|
||
|
||
/**
|
||
* @brief 使能LPTIMx中断
|
||
* @param lptimx LPTIM外设
|
||
* @param interrupt LPTIM中断源
|
||
* @arg LPTIM_INTERRUPT_CMPM: 比较匹配中断
|
||
* @arg LPTIM_INTERRUPT_ARRM: 自动重载匹配中断
|
||
* @arg LPTIM_INTERRUPT_EXTTRIG: 外部触发边沿事件中断
|
||
* @arg LPTIM_INTERRUPT_UP: 计数方向由递减变为递增中断
|
||
* @arg LPTIM_INTERRUPT_DOWN: 计数方向由递增变为递减中断
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_interrupt_enable(LPTIM_t *lptimx, uint32_t interrupt)
|
||
{
|
||
lptimx->IER |= interrupt;
|
||
}
|
||
|
||
/**
|
||
* @brief 禁止LPTIMx中断
|
||
* @param lptimx LPTIM外设
|
||
* @param interrupt LPTIM中断源
|
||
* @arg LPTIM_INTERRUPT_CMPM: 比较匹配中断
|
||
* @arg LPTIM_INTERRUPT_ARRM: 自动重载匹配中断
|
||
* @arg LPTIM_INTERRUPT_EXTTRIG: 外部触发边沿事件中断
|
||
* @arg LPTIM_INTERRUPT_UP: 计数方向由递减变为递增中断
|
||
* @arg LPTIM_INTERRUPT_DOWN: 计数方向由递增变为递减中断
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_interrupt_disable(LPTIM_t *lptimx, uint32_t interrupt)
|
||
{
|
||
lptimx->IER &= (~interrupt);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取LPTIMx中断状态
|
||
* @param lptimx LPTIM外设
|
||
* @param interrupt LPTIM中断源
|
||
* @arg LPTIM_INTERRUPT_CMPM: 比较匹配中断
|
||
* @arg LPTIM_INTERRUPT_ARRM: 自动重载匹配中断
|
||
* @arg LPTIM_INTERRUPT_EXTTRIG: 外部触发边沿事件中断
|
||
* @arg LPTIM_INTERRUPT_UP: 计数方向由递减变为递增中断
|
||
* @arg LPTIM_INTERRUPT_DOWN: 计数方向由递增变为递减中断
|
||
* @retval bool LPTIM中断源使能状态
|
||
* @arg true:中断使能
|
||
* @arg false:中断禁止
|
||
*
|
||
*/
|
||
__STATIC_INLINE bool std_lptim_get_interrupt_status(LPTIM_t *lptimx, uint32_t interrupt)
|
||
{
|
||
return ((lptimx->IER & interrupt) == interrupt);
|
||
}
|
||
|
||
/**
|
||
* @brief 获取LPTIMx状态标志位
|
||
* @param lptimx LPTIM外设
|
||
* @param flag LPTIM状态标志位
|
||
* @arg LPTIM_FLAG_CMPM: 比较匹配标志
|
||
* @arg LPTIM_FLAG_ARRM: 自动重载匹配标志
|
||
* @arg LPTIM_FLAG_EXTTRIG: 外部触发边沿事件标志
|
||
* @arg LPTIM_FLAG_UP: 计数方向由递减变为递增标志
|
||
* @arg LPTIM_FLAG_DOWN: 计数方向由递增变为递减标志
|
||
*/
|
||
__STATIC_INLINE bool std_lptim_get_flag(LPTIM_t *lptimx, uint32_t flag)
|
||
{
|
||
return ((lptimx->ISR & flag) == flag);
|
||
}
|
||
|
||
/**
|
||
* @brief 清除LPTIMx状态标志位
|
||
* @param lptimx LPTIM外设
|
||
* @param flag LPTIM状态标志位
|
||
* @arg LPTIM_CLEAR_CMPM: 比较匹配标志
|
||
* @arg LPTIM_CLEAR_ARRM: 自动重载匹配标志
|
||
* @arg LPTIM_CLEAR_EXTTRIG: 外部触发边沿事件标志
|
||
* @arg LPTIM_CLEAR_UP: 计数方向由递减变为递增标志
|
||
* @arg LPTIM_CLEAR_DOWN: 计数方向由递增变为递减标志
|
||
* @retval 无
|
||
*/
|
||
__STATIC_INLINE void std_lptim_clear_flag(LPTIM_t *lptimx, uint32_t flag)
|
||
{
|
||
lptimx->ICR |= flag;
|
||
}
|
||
|
||
|
||
|
||
/* LPTIM初始化相关函数 */
|
||
void std_lptim_deinit(LPTIM_t *lptimx);
|
||
void std_lptim_init(LPTIM_t *lptimx, std_lptim_init_t *lptim_init_param);
|
||
|
||
/* LPTIM结构体初始化相关函数 */
|
||
void std_lptim_struct_init(std_lptim_init_t *lptim_init_struct);
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
#endif /* CIU32L051_STD_LPTIM_H */
|