CIU32_L051_M307R/Peripheral/CIU32L051_Lib/Include/ciu32l051_std_lptim.h

783 lines
26 KiB
C
Raw Permalink 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_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 */