183 lines
4.8 KiB
C
183 lines
4.8 KiB
C
/************************************************************************!
|
||
* 技术讨论:QQ群 123763203
|
||
* 官网 :www.navota.com
|
||
*
|
||
* @file pit.c
|
||
* @brief pit定时器函数库
|
||
* @author Navota
|
||
* @date 2018-3-1
|
||
************************************************************************/
|
||
|
||
#include "common.h"
|
||
#include "pit.h"
|
||
|
||
/*!
|
||
* @brief 存放回调入口
|
||
*
|
||
*/
|
||
PIT_CallbackType PIT_Callback[2] = {(PIT_CallbackType)NULL};
|
||
|
||
void PIT_Ch0Isr(void);
|
||
void PIT_Ch1Isr(void);
|
||
|
||
/******************************************************************************
|
||
* 定义PIT的接口函数
|
||
*******************************************************************************/
|
||
|
||
/*****************************************************************************//*!
|
||
*
|
||
* @brief 初始化PIT模块.
|
||
*
|
||
* @param[in] u8Channel_No 通道号
|
||
* @param[in] pConfig 配置模块的结构体指针
|
||
*
|
||
* @return none
|
||
*
|
||
*****************************************************************************/
|
||
void PIT_Init(uint8_t u8Channel_No, PIT_ConfigType *pConfig)
|
||
{
|
||
SIM->SCGC |= SIM_SCGC_PIT_MASK; /*!< 选通PIT模块门控时钟 */
|
||
|
||
if (pConfig->bFreeze)
|
||
{
|
||
PIT_SetDebugFreeze();
|
||
}
|
||
|
||
if (pConfig->bModuleDis == 0)
|
||
{
|
||
PIT_Enable(); /*!< 标准PIT定时器的时钟使能 */
|
||
}
|
||
|
||
PIT_SetLoadVal(u8Channel_No, pConfig->u32LoadValue); //加载对应通道的定时器起始值
|
||
|
||
if (pConfig->bInterruptEn)
|
||
{
|
||
if (u8Channel_No)
|
||
{
|
||
NVIC_EnableIRQ(PIT_CH1_IRQn); //开启对应通道IRQ中断
|
||
}
|
||
else
|
||
{
|
||
NVIC_EnableIRQ(PIT_CH0_IRQn);
|
||
}
|
||
PIT_ChannelEnableInt(u8Channel_No); //开启对应通道的中断请求
|
||
}
|
||
else
|
||
{
|
||
NVIC_DisableIRQ(PIT_CH0_IRQn); //禁止通道0的IRQ中断
|
||
}
|
||
|
||
if (pConfig->bChainMode)
|
||
{
|
||
PIT_ChannelEnableChain(u8Channel_No); //定时器链接到前一定时器
|
||
}
|
||
|
||
if (pConfig->bETMerEn)
|
||
{
|
||
PIT_ChannelEnable(u8Channel_No); //定时器通道使能
|
||
}
|
||
|
||
}
|
||
|
||
|
||
/*****************************************************************************//*!
|
||
*
|
||
* @brief 装载定时器起始值到加载值寄存器中.
|
||
*
|
||
* @param[in] u8Channel_No 通道号
|
||
* @param[in] u32loadvalue 所有加载的数值
|
||
*
|
||
* @return none
|
||
*
|
||
*****************************************************************************/
|
||
void PIT_SetLoadVal(uint8_t u8Channel, uint32_t u32loadvalue)
|
||
|
||
{
|
||
PIT->CHANNEL[u8Channel].LDVAL = u32loadvalue;
|
||
}
|
||
|
||
|
||
/*****************************************************************************//*!
|
||
*
|
||
* @brief 设置PIT模块回调函数.
|
||
*
|
||
* @param[in] u8Channel_No 通道号.
|
||
* @param[in] pfnCallback 指向回调函数.
|
||
*
|
||
* @return none
|
||
*
|
||
*****************************************************************************/
|
||
void PIT_SetCallback(uint8_t u8Channel_No, PIT_CallbackType pfnCallback)
|
||
{
|
||
PIT_Callback[u8Channel_No] = pfnCallback;
|
||
}
|
||
|
||
|
||
/*****************************************************************************//*!
|
||
*
|
||
* @brief 复位PIT模块
|
||
*
|
||
* @param none
|
||
*
|
||
* @return none
|
||
*
|
||
*****************************************************************************/
|
||
void PIT_DeInit(void)
|
||
{
|
||
NVIC_DisableIRQ(PIT_CH0_IRQn);
|
||
NVIC_DisableIRQ(PIT_CH1_IRQn);
|
||
PIT_SetLoadVal(0,0);
|
||
PIT_SetLoadVal(1,0);
|
||
PIT_ChannelDisable(0);
|
||
PIT_ChannelDisable(1);
|
||
PIT_ChannelDisableInt(0);
|
||
PIT_ChannelDisableInt(1);
|
||
PIT_ChannelDisableChain(0);
|
||
PIT_ChannelDisableChain(1);
|
||
PIT_ChannelClrFlags(0);
|
||
PIT_ChannelClrFlags(1);
|
||
PIT_SetDebugOn();
|
||
PIT_Disable();
|
||
SIM->SCGC &= ~SIM_SCGC_PIT_MASK;
|
||
}
|
||
|
||
|
||
/*****************************************************************************//*!
|
||
*
|
||
* @brief PIT0通道中断服务函数.
|
||
*
|
||
* @param none
|
||
*
|
||
* @return none
|
||
*
|
||
*****************************************************************************/
|
||
void PIT_Ch0Isr(void)
|
||
{
|
||
PIT_ChannelClrFlags(0); //清除中断标志位
|
||
|
||
if (PIT_Callback[0])
|
||
{
|
||
PIT_Callback[0]();
|
||
}
|
||
}
|
||
|
||
/*****************************************************************************//*!
|
||
*
|
||
* @brief PIT0通道中断服务函数.
|
||
*
|
||
* @param none
|
||
*
|
||
* @return none
|
||
*
|
||
*****************************************************************************/
|
||
void PIT_Ch1Isr(void)
|
||
{
|
||
PIT_ChannelClrFlags(1); //清除中断标志位
|
||
if (PIT_Callback[1])
|
||
{
|
||
PIT_Callback[1]();
|
||
}
|
||
}
|
||
|
||
|