/************************************************************************! * 技术讨论: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](); } }