arduino_midi_player/Midi/music-box-nv32-master/nv32lib/drivers/pit/pit.c
2025-03-24 14:30:56 +08:00

183 lines
4.8 KiB
C
Raw 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.

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