当前位置: 首页 > 工具软件 > PIT > 使用案例 >

RT1064--pit

端木骞尧
2023-12-01

参考链接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);//反转引脚电平
 类似资料: