RT1064--pit

参考链接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);//反转引脚电平
### 关于 RT1064 芯片中的定时器数量 RT1064 是 NXP 推出的一款基于 ARM Cortex-M7 内核的微控制器,广泛应用于工业自动化、汽车电子等领域。关于其定时器的具体数量,可以从官方文档和技术资料中获取更详细的说明。 #### 定时器分类 RT1064 提供多种类型的定时器模块,主要包括以下几类: - **FlexTimer (FTM)**:用于通用脉宽调制 (PWM) 和捕获/比较功能。 - **Low Power Timer (LPTMR)**:适用于低功耗应用场景下的计时需求。 - **High Resolution Timer (HRTimer)**:支持高分辨率时间测量和复杂波形生成。 - **PIT (Periodic Interrupt Timer)**:提供简单的周期中断功能[^4]。 #### 数量统计 根据 RT1064 数据手册的信息,以下是各类定时器的数量分布: - FlexTimer (FTM): 配备多达 8 个通道的 FTM 单元[^5]。 - Low Power Timer (LPTMR): 包含 1 到 2 个 LPTMR 实例,具体取决于具体的变体型号[^6]。 - High Resolution Timer (HRTimer): 支持最多 3 组 HRTIMER 模块[^7]。 - PIT (Periodic Interrupt Timer): 提供 4 个独立的 PIT 计数器[^8]。 因此,在 RT1064 中总共可以配置超过 15 个不同用途的定时器资源(不包括可能扩展的外设专用定时器),这些定时器可以根据实际应用需求灵活分配给不同的任务或功能模块。 对于软件层面实现更多逻辑上的虚拟定时器,则可以通过 RT-Thread 系统滴答配合相关 API 来完成无限量级定义[^9]。 ```c // 创建一个 RT-Thread 软件定时器示例代码 rt_timer_t timer; timer = rt_timer_create("test", test_function, RT_NULL, 1000, RT_TIMER_FLAG_ONE_SHOT); if(timer != RT_NULL){ rt_err_t result = rt_timer_start(timer); } ``` 以上展示了如何利用 RT-Thread 架构下创建并启动一个新的单次触发型软定时器实例过程。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值