733 lines
30 KiB
C
733 lines
30 KiB
C
/******************************************************************************************************************************************
|
||
* 文件名称: SWM341_timr.c
|
||
* 功能说明: SWM341单片机的计数器/定时器功能驱动库
|
||
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
|
||
* 注意事项:
|
||
* 版本日期: V1.0.0 2016年1月30日
|
||
* 升级记录:
|
||
*
|
||
*
|
||
*******************************************************************************************************************************************
|
||
* @attention
|
||
*
|
||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
|
||
* REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
|
||
* FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
|
||
* OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
|
||
* -ECTION WITH THEIR PRODUCTS.
|
||
*
|
||
* COPYRIGHT 2012 Synwit Technology
|
||
*******************************************************************************************************************************************/
|
||
#include "SWM341.h"
|
||
#include "SWM341_timr.h"
|
||
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_Init()
|
||
* 功能说明: TIMR定时器/计数器初始化
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,有效值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、BTIMR0、BTIMR1、...、BTIMR11
|
||
* uint32_t mode 对于TIMR0~4: TIMR_MODE_TIMER、TIMR_MODE_COUNTER、TIMR_MODE_OC、TIMR_MODE_IC
|
||
* 对于BTIMR0~11: TIMR_MODE_TIMER、TIMR_MODE_OC
|
||
* uint16_t prediv 预分频,取值1-256
|
||
* uint32_t period 定时/计数周期,取值1-16777216
|
||
* uint32_t int_en 中断使能
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_Init(TIMR_TypeDef * TIMRx, uint32_t mode, uint16_t prediv, uint32_t period, uint32_t int_en)
|
||
{
|
||
if((TIMRx == TIMR0) || (TIMRx == TIMR1) || (TIMRx == TIMR2) || (TIMRx == TIMR3) || (TIMRx == TIMR4))
|
||
{
|
||
SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_TIMR_Pos);
|
||
}
|
||
else
|
||
{
|
||
SYS->CLKEN1 |= (0x01 << SYS_CLKEN1_BTIMR_Pos);
|
||
}
|
||
|
||
TIMR_Stop(TIMRx); //一些关键寄存器只能在定时器停止时设置
|
||
|
||
TIMRx->CR &= ~(TIMR_CR_MODE_Msk | TIMR_CR_CLKSRC_Msk);
|
||
TIMRx->CR |= (mode << TIMR_CR_CLKSRC_Pos);
|
||
|
||
TIMRx->PREDIV = prediv - 1;
|
||
|
||
TIMRx->LOAD = period - 1;
|
||
|
||
TIMRx->IF = (1 << TIMR_IF_TO_Pos); //清除中断标志
|
||
if(int_en) TIMRx->IE |= (1 << TIMR_IE_TO_Pos);
|
||
else TIMRx->IE &= ~(1 << TIMR_IE_TO_Pos);
|
||
|
||
switch((uint32_t)TIMRx)
|
||
{
|
||
case ((uint32_t)TIMR0):
|
||
if(int_en) NVIC_EnableIRQ(TIMR0_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)TIMR1):
|
||
if(int_en) NVIC_EnableIRQ(TIMR1_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)TIMR2):
|
||
if(int_en) NVIC_EnableIRQ(TIMR2_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)TIMR3):
|
||
if(int_en) NVIC_EnableIRQ(TIMR3_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)TIMR4):
|
||
if(int_en) NVIC_EnableIRQ(TIMR4_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR0):
|
||
if(int_en) NVIC_EnableIRQ(BTIMR0_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR1):
|
||
if(int_en) NVIC_EnableIRQ(BTIMR1_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR2):
|
||
if(int_en) NVIC_EnableIRQ(BTIMR2_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR3):
|
||
if(int_en) NVIC_EnableIRQ(BTIMR3_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR4):
|
||
if(int_en) NVIC_EnableIRQ(BTIMR4_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR5):
|
||
if(int_en) NVIC_EnableIRQ(BTIMR5_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR6):
|
||
if(int_en) NVIC_EnableIRQ(BTIMR6_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR7):
|
||
if(int_en) NVIC_EnableIRQ(BTIMR7_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR8):
|
||
if(int_en) NVIC_EnableIRQ(BTIMR8_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR9):
|
||
if(int_en) NVIC_EnableIRQ(BTIMR9_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR10):
|
||
if(int_en) NVIC_EnableIRQ(BTIMR10_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR11):
|
||
if(int_en) NVIC_EnableIRQ(BTIMR11_IRQn);
|
||
break;
|
||
}
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_Start()
|
||
* 功能说明: 启动定时器,从初始值开始计时/计数
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、BTIMR0、BTIMR1、...、BTIMR11
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_Start(TIMR_TypeDef * TIMRx)
|
||
{
|
||
switch((uint32_t)TIMRx)
|
||
{
|
||
case ((uint32_t)TIMR0):
|
||
TIMRG->EN |= (1 << TIMRG_EN_TIMR0_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)TIMR1):
|
||
TIMRG->EN |= (1 << TIMRG_EN_TIMR1_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)TIMR2):
|
||
TIMRG->EN |= (1 << TIMRG_EN_TIMR2_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)TIMR3):
|
||
TIMRG->EN |= (1 << TIMRG_EN_TIMR3_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)TIMR4):
|
||
TIMRG->EN |= (1 << TIMRG_EN_TIMR4_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR0):
|
||
BTIMRG->EN |= (1 << TIMRG_EN_TIMR0_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR1):
|
||
BTIMRG->EN |= (1 << TIMRG_EN_TIMR1_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR2):
|
||
BTIMRG->EN |= (1 << TIMRG_EN_TIMR2_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR3):
|
||
BTIMRG->EN |= (1 << TIMRG_EN_TIMR3_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR4):
|
||
BTIMRG->EN |= (1 << TIMRG_EN_TIMR4_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR5):
|
||
BTIMRG->EN |= (1 << TIMRG_EN_TIMR5_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR6):
|
||
BTIMRG->EN |= (1 << TIMRG_EN_TIMR6_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR7):
|
||
BTIMRG->EN |= (1 << TIMRG_EN_TIMR7_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR8):
|
||
BTIMRG->EN |= (1 << TIMRG_EN_TIMR8_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR9):
|
||
BTIMRG->EN |= (1 << TIMRG_EN_TIMR9_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR10):
|
||
BTIMRG->EN |= (1 << TIMRG_EN_TIMR10_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR11):
|
||
BTIMRG->EN |= (1 << TIMRG_EN_TIMR11_Pos);
|
||
break;
|
||
}
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_Stop()
|
||
* 功能说明: 停止定时器
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、BTIMR0、BTIMR1、...、BTIMR11
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_Stop(TIMR_TypeDef * TIMRx)
|
||
{
|
||
switch((uint32_t)TIMRx)
|
||
{
|
||
case ((uint32_t)TIMR0):
|
||
TIMRG->EN &= ~(1 << TIMRG_EN_TIMR0_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)TIMR1):
|
||
TIMRG->EN &= ~(1 << TIMRG_EN_TIMR1_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)TIMR2):
|
||
TIMRG->EN &= ~(1 << TIMRG_EN_TIMR2_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)TIMR3):
|
||
TIMRG->EN &= ~(1 << TIMRG_EN_TIMR3_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)TIMR4):
|
||
TIMRG->EN &= ~(1 << TIMRG_EN_TIMR4_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR0):
|
||
BTIMRG->EN &= ~(1 << TIMRG_EN_TIMR0_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR1):
|
||
BTIMRG->EN &= ~(1 << TIMRG_EN_TIMR1_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR2):
|
||
BTIMRG->EN &= ~(1 << TIMRG_EN_TIMR2_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR3):
|
||
BTIMRG->EN &= ~(1 << TIMRG_EN_TIMR3_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR4):
|
||
BTIMRG->EN &= ~(1 << TIMRG_EN_TIMR4_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR5):
|
||
BTIMRG->EN &= ~(1 << TIMRG_EN_TIMR5_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR6):
|
||
BTIMRG->EN &= ~(1 << TIMRG_EN_TIMR6_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR7):
|
||
BTIMRG->EN &= ~(1 << TIMRG_EN_TIMR7_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR8):
|
||
BTIMRG->EN &= ~(1 << TIMRG_EN_TIMR8_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR9):
|
||
BTIMRG->EN &= ~(1 << TIMRG_EN_TIMR9_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR10):
|
||
BTIMRG->EN &= ~(1 << TIMRG_EN_TIMR10_Pos);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR11):
|
||
BTIMRG->EN &= ~(1 << TIMRG_EN_TIMR11_Pos);
|
||
break;
|
||
}
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_Halt()
|
||
* 功能说明: 暂停定时器,计数值保持不变
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_Halt(TIMR_TypeDef * TIMRx)
|
||
{
|
||
TIMRx->HALT = 1;
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_Resume()
|
||
* 功能说明: 恢复定时器,从暂停处继续计数
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_Resume(TIMR_TypeDef * TIMRx)
|
||
{
|
||
TIMRx->HALT = 0;
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_GetCurValue()
|
||
* 功能说明: 获取当前计数值
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、BTIMR0、BTIMR1、...、BTIMR11
|
||
* 输 出: uint32_t 当前计数值
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
uint32_t TIMR_GetCurValue(TIMR_TypeDef * TIMRx)
|
||
{
|
||
return TIMRx->VALUE;
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_INTEn()
|
||
* 功能说明: 使能中断
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、BTIMR0、BTIMR1、...、BTIMR11
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_INTEn(TIMR_TypeDef * TIMRx)
|
||
{
|
||
TIMRx->IE |= (1 << TIMR_IE_TO_Pos);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_INTDis()
|
||
* 功能说明: 禁能中断
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、BTIMR0、BTIMR1、...、BTIMR11
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_INTDis(TIMR_TypeDef * TIMRx)
|
||
{
|
||
TIMRx->IE &= ~(1 << TIMR_IE_TO_Pos);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_INTClr()
|
||
* 功能说明: 清除中断标志
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、BTIMR0、BTIMR1、...、BTIMR11
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_INTClr(TIMR_TypeDef * TIMRx)
|
||
{
|
||
TIMRx->IF = (1 << TIMR_IF_TO_Pos);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_INTStat()
|
||
* 功能说明: 获取中断状态
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、BTIMR0、BTIMR1、...、BTIMR11
|
||
* 输 出: uint32_t 0 TIMRx未产生中断 1 TIMRx产生了中断
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
uint32_t TIMR_INTStat(TIMR_TypeDef * TIMRx)
|
||
{
|
||
return (TIMRx->IF & TIMR_IF_TO_Msk) ? 1 : 0;
|
||
}
|
||
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_OC_Init()
|
||
* 功能说明: 输出比较功能初始化
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、BTIMR0、BTIMR1、...、BTIMR11
|
||
* uint32_t match 当计数器的值递减到match时引脚输出电平翻转
|
||
* uint32_t match_int_en 当计数器的值递减到match时是否产生中断
|
||
* uint32_t init_lvl 初始输出电平
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_OC_Init(TIMR_TypeDef * TIMRx, uint32_t match, uint32_t match_int_en, uint32_t init_lvl)
|
||
{
|
||
TIMRx->OCMAT = match;
|
||
if(init_lvl) TIMRx->OCCR |= (1 << TIMR_OCCR_INITLVL_Pos);
|
||
else TIMRx->OCCR &= ~(1 << TIMR_OCCR_INITLVL_Pos);
|
||
|
||
TIMRx->IF = (1 << TIMR_IF_OC0_Pos); //清除中断标志
|
||
if(match_int_en) TIMRx->IE |= (1 << TIMR_IE_OC0_Pos);
|
||
else TIMRx->IE &= ~(1 << TIMR_IE_OC0_Pos);
|
||
|
||
switch((uint32_t)TIMRx)
|
||
{
|
||
case ((uint32_t)TIMR0):
|
||
if(match_int_en) NVIC_EnableIRQ(TIMR0_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)TIMR1):
|
||
if(match_int_en) NVIC_EnableIRQ(TIMR1_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)TIMR2):
|
||
if(match_int_en) NVIC_EnableIRQ(TIMR2_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)TIMR3):
|
||
if(match_int_en) NVIC_EnableIRQ(TIMR3_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)TIMR4):
|
||
if(match_int_en) NVIC_EnableIRQ(TIMR4_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR0):
|
||
if(match_int_en) NVIC_EnableIRQ(BTIMR0_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR1):
|
||
if(match_int_en) NVIC_EnableIRQ(BTIMR1_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR2):
|
||
if(match_int_en) NVIC_EnableIRQ(BTIMR2_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR3):
|
||
if(match_int_en) NVIC_EnableIRQ(BTIMR3_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR4):
|
||
if(match_int_en) NVIC_EnableIRQ(BTIMR4_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR5):
|
||
if(match_int_en) NVIC_EnableIRQ(BTIMR5_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR6):
|
||
if(match_int_en) NVIC_EnableIRQ(BTIMR6_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR7):
|
||
if(match_int_en) NVIC_EnableIRQ(BTIMR7_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR8):
|
||
if(match_int_en) NVIC_EnableIRQ(BTIMR8_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR9):
|
||
if(match_int_en) NVIC_EnableIRQ(BTIMR9_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR10):
|
||
if(match_int_en) NVIC_EnableIRQ(BTIMR10_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)BTIMR11):
|
||
if(match_int_en) NVIC_EnableIRQ(BTIMR11_IRQn);
|
||
break;
|
||
}
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_OC_OutputEn()
|
||
* 功能说明: 使能输出比较功能的波形输出
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、BTIMR0、BTIMR1、...、BTIMR11
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_OC_OutputEn(TIMR_TypeDef * TIMRx)
|
||
{
|
||
TIMRx->OCCR &= ~(TIMR_OCCR_FORCEEN_Pos);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_OC_OutputDis()
|
||
* 功能说明: 禁止输出比较功能的波形输出,且让输出比较功能引脚保持level电平
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、BTIMR0、BTIMR1、...、BTIMR11
|
||
* uint32_t level 禁止输出波形后在引脚上保持的电平
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_OC_OutputDis(TIMR_TypeDef * TIMRx, uint32_t level)
|
||
{
|
||
if(level) TIMRx->OCCR |= (1 << TIMR_OCCR_FORCELVL_Pos);
|
||
else TIMRx->OCCR &= ~(1 << TIMR_OCCR_FORCELVL_Pos);
|
||
|
||
TIMRx->OCCR |= (TIMR_OCCR_FORCEEN_Pos);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_OC_SetMatch()
|
||
* 功能说明: 设置输出比较功能的比较值
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、BTIMR0、BTIMR1、...、BTIMR11
|
||
* uint32_t match 输出比较功能的比较值
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_OC_SetMatch(TIMR_TypeDef * TIMRx, uint32_t match)
|
||
{
|
||
TIMRx->OCMAT = match;
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_OC_GetMatch()
|
||
* 功能说明: 获取输出比较功能的比较值
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、BTIMR0、BTIMR1、...、BTIMR11
|
||
* 输 出: uint32_t 输出比较功能的比较值
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
uint32_t TIMR_OC_GetMatch(TIMR_TypeDef * TIMRx)
|
||
{
|
||
return TIMRx->OCMAT;
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_OC_INTEn()
|
||
* 功能说明: 使能输出比较中断
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、BTIMR0、BTIMR1、...、BTIMR11
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_OC_INTEn(TIMR_TypeDef * TIMRx)
|
||
{
|
||
TIMRx->IE |= (1 << TIMR_IE_OC0_Pos);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_OC_INTDis()
|
||
* 功能说明: 禁能输出比较中断
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、BTIMR0、BTIMR1、...、BTIMR11
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_OC_INTDis(TIMR_TypeDef * TIMRx)
|
||
{
|
||
TIMRx->IE &= ~(1 << TIMR_IE_OC0_Pos);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_OC_INTClr()
|
||
* 功能说明: 清除输出比较中断标志
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、BTIMR0、BTIMR1、...、BTIMR11
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_OC_INTClr(TIMR_TypeDef * TIMRx)
|
||
{
|
||
TIMRx->IF = (1 << TIMR_IF_OC0_Pos);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_OC_INTStat()
|
||
* 功能说明: 获取输出比较中断状态
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4、BTIMR0、BTIMR1、...、BTIMR11
|
||
* 输 出: uint32_t 0 输出比较match未发生 1 输出比较match发生
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
uint32_t TIMR_OC_INTStat(TIMR_TypeDef * TIMRx)
|
||
{
|
||
return (TIMRx->IF & TIMR_IF_OC0_Msk) ? 1 : 0;
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_IC_Init()
|
||
* 功能说明: 输入捕获功能初始化
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4
|
||
* uint32_t captureH_int_en 测量高电平长度完成中断使能
|
||
* uint32_t captureL_int_en 测量低电平长度完成中断使能
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_IC_Init(TIMR_TypeDef * TIMRx, uint32_t captureH_int_en, uint32_t captureL_int_en)
|
||
{
|
||
TIMRx->IF = (TIMR_IF_ICR_Msk | TIMR_IF_ICF_Msk);
|
||
if(captureH_int_en) TIMRx->IE |= (1 << TIMR_IE_ICF_Pos);
|
||
else TIMRx->IE &= ~(1 << TIMR_IE_ICF_Pos);
|
||
if(captureL_int_en) TIMRx->IE |= (1 << TIMR_IE_ICR_Pos);
|
||
else TIMRx->IE &= ~(1 << TIMR_IE_ICR_Pos);
|
||
|
||
switch((uint32_t)TIMRx)
|
||
{
|
||
case ((uint32_t)TIMR0):
|
||
if(captureH_int_en | captureL_int_en) NVIC_EnableIRQ(TIMR0_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)TIMR1):
|
||
if(captureH_int_en | captureL_int_en) NVIC_EnableIRQ(TIMR1_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)TIMR2):
|
||
if(captureH_int_en | captureL_int_en) NVIC_EnableIRQ(TIMR2_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)TIMR3):
|
||
if(captureH_int_en | captureL_int_en) NVIC_EnableIRQ(TIMR3_IRQn);
|
||
break;
|
||
|
||
case ((uint32_t)TIMR4):
|
||
if(captureH_int_en | captureL_int_en) NVIC_EnableIRQ(TIMR4_IRQn);
|
||
break;
|
||
}
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_IC_GetCaptureH()
|
||
* 功能说明: 获取高电平长度测量结果
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4
|
||
* 输 出: uint32_t 高电平长度测量结果
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
uint32_t TIMR_IC_GetCaptureH(TIMR_TypeDef * TIMRx)
|
||
{
|
||
return TIMRx->ICHIGH;
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_IC_GetCaptureL()
|
||
* 功能说明: 获取低电平长度测量结果
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4
|
||
* 输 出: uint32_t 低电平长度测量结果
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
uint32_t TIMR_IC_GetCaptureL(TIMR_TypeDef * TIMRx)
|
||
{
|
||
return TIMRx->ICLOW;
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_IC_CaptureH_INTEn()
|
||
* 功能说明: 使能输入捕获高电平长度测量完成中断
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_IC_CaptureH_INTEn(TIMR_TypeDef * TIMRx)
|
||
{
|
||
TIMRx->IE |= (1 << TIMR_IE_ICF_Pos);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_IC_CaptureH_INTDis()
|
||
* 功能说明: 禁能输入捕获高电平长度测量完成中断
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_IC_CaptureH_INTDis(TIMR_TypeDef * TIMRx)
|
||
{
|
||
TIMRx->IE &= ~(1 << TIMR_IE_ICF_Pos);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_IC_CaptureH_INTClr()
|
||
* 功能说明: 清除输入捕获高电平长度测量完成中断标志
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_IC_CaptureH_INTClr(TIMR_TypeDef * TIMRx)
|
||
{
|
||
TIMRx->IF = (1 << TIMR_IF_ICF_Pos);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_IC_CaptureH_INTStat()
|
||
* 功能说明: 获取输入捕获高电平长度测量完成中断状态
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4
|
||
* 输 出: uint32_t 0 高电平长度测量未完成 1 高电平长度测量完成
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
uint32_t TIMR_IC_CaptureH_INTStat(TIMR_TypeDef * TIMRx)
|
||
{
|
||
return (TIMRx->IF & TIMR_IF_ICF_Msk) ? 1 : 0;
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_IC_CaptureL_INTEn()
|
||
* 功能说明: 使能输入捕获低电平长度测量完成中断
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_IC_CaptureL_INTEn(TIMR_TypeDef * TIMRx)
|
||
{
|
||
TIMRx->IE |= (1 << TIMR_IE_ICR_Pos);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_IC_CaptureL_INTDis()
|
||
* 功能说明: 禁能输入捕获低电平长度测量完成中断
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_IC_CaptureL_INTDis(TIMR_TypeDef * TIMRx)
|
||
{
|
||
TIMRx->IE &= ~(1 << TIMR_IE_ICR_Pos);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_IC_CaptureL_INTClr()
|
||
* 功能说明: 清除输入捕获低电平长度测量完成中断标志
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4
|
||
* 输 出: 无
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
void TIMR_IC_CaptureL_INTClr(TIMR_TypeDef * TIMRx)
|
||
{
|
||
TIMRx->IF = (1 << TIMR_IF_ICR_Pos);
|
||
}
|
||
|
||
/******************************************************************************************************************************************
|
||
* 函数名称: TIMR_IC_CaptureL_INTStat()
|
||
* 功能说明: 获取输入捕获低电平长度测量完成中断状态
|
||
* 输 入: TIMR_TypeDef * TIMRx 指定要被设置的定时器,可取值包括TIMR0、TIMR1、TIMR2、TIMR3、TIMR4
|
||
* 输 出: uint32_t 0 低电平长度测量未完成 1 低电平长度测量完成
|
||
* 注意事项: 无
|
||
******************************************************************************************************************************************/
|
||
uint32_t TIMR_IC_CaptureL_INTStat(TIMR_TypeDef * TIMRx)
|
||
{
|
||
return (TIMRx->IF & TIMR_IF_ICR_Msk) ? 1 : 0;
|
||
}
|