参考链接link
PIT定时器(Periodic Interrupt Timer),也叫做周期性中断定时器,是一个32位递减计数器,每个时钟周期减1。与普通的定时器相比,它只能递减计数,而不能向上计数,普通的定时器,相对高级一点的能向上或者向下计数,甚至再高级一点的可以产生pwm等等。而它就只能周期计数。但是不要小看它,它最大的作用就是为其它外设提供周期信号。这听起来像废话,普通定时器不行吗?当然行,但是普通定时器需要重启计数器才能改变计数周期,而PIT定时器可以不需要重新启动(其实就是重新初始化)就可以改变计数周期。典型的应用就是PIT+ADC,ADC周期性采集255(或者更大)的信号数据,通过FFT(快速傅里叶变换)处理,得到一段新的信号,这是很常见的,特别是做混合信号处理的时候。
pit_init(); //初始化pit外设
pit_interrupt_ms(PIT_CH0,100); //初始化pit通道0 周期
NVIC_SetPriority(PIT_IRQn,15); //设置中断优先级 范围0-15 越小优先级越高 四路PIT共用一个PIT中断函数
看pit.h
typedef enum
{
PIT_CH0 = kPIT_Chnl_0,
PIT_CH1,
PIT_CH2,
PIT_CH3,
PIT_MAX,
}PIT_enum;
#define PIT_SOURCE_CLOCK CLOCK_GetFreq(kCLOCK_PerClk)//定义PIT定时器的输入时钟
void pit_init(void);
void pit_interrupt(PIT_enum pit_ch, uint32 count);
void pit_delay(PIT_enum pit_ch, uint32 count);
void pit_start(PIT_enum pit_ch);
uint32 pit_get(PIT_enum pit_ch);
void pit_close(PIT_enum pit_ch);
//获取PIT定时器的标志位
#define PIT_FLAG_GET(pit_ch) PIT_GetStatusFlags(PIT, (pit_chnl_t)pit_ch)
//清除PIT定时器的标志位
#define PIT_FLAG_CLEAR(pit_ch) PIT_ClearStatusFlags(PIT, (pit_chnl_t)pit_ch, kPIT_TimerFlag)
//------------------------------------以下代码用于PIT中断------------------------------------
//-----------------调用本宏函数前,务必先调用pit_init函数,以初始化PIT外设-------------------
#define pit_interrupt_ms(pit_ch, time) pit_interrupt(pit_ch, MSEC_TO_COUNT(time, PIT_SOURCE_CLOCK)) //(单位为 毫秒)
#define pit_interrupt_us(pit_ch, time) pit_interrupt(pit_ch, USEC_TO_COUNT(time, PIT_SOURCE_CLOCK)) //(单位为 微秒)
//------------------------------------以下代码用于PIT延时------------------------------------
//-----------------调用本宏函数前,务必先调用pit_init函数,以初始化PIT外设-------------------
#define pit_delay_ms(pit_ch, time) pit_delay(pit_ch, MSEC_TO_COUNT(time, PIT_SOURCE_CLOCK)) //(单位为 毫秒)
#define pit_delay_us(pit_ch, time) pit_delay(pit_ch, USEC_TO_COUNT(time, PIT_SOURCE_CLOCK)) //(单位为 微秒)
#define pit_delay_ns(pit_ch, time) pit_delay(pit_ch, USEC_TO_COUNT(time, PIT_SOURCE_CLOCK/1000)) //(单位为 纳秒)
//------------------------------------以下代码用于获取PIT计时时间------------------------------------
//-----------------调用本宏函数前,务必先调用pit_init函数,以初始化PIT外设-------------------
#define pit_get_ms(pit_ch) COUNT_TO_MSEC(pit_get(pit_ch),PIT_SOURCE_CLOCK) //(单位为 毫秒)
#define pit_get_us(pit_ch) COUNT_TO_US
然后调用void PIT_IRQHandler(void)函数
在里面判断是哪个通道的中断
PIT_FLAG_GET(PIT_CHX)
然后写进入中断后需要执行的操作
譬如
PIT_FLAG_CLEAR(PIT_CH0);一定要清楚中断标志位!!!!!!!!!!!!!!!
gpio_toggle(B9);//反转引脚电平