前言
周期中断定时器 (Periodic Interrupt Timer, PIT) 模块顾名思义,就是通过计时行为引发周期性中断事件的触发器。本文基于 S32K312 开发板实现延时功能,在此之前先简单介绍下 PIT 的特性。
1. PIT 模块特性
- 根据下图查表可知,不同型号 S32K3 支持的 PIT 数量不同。最多有 4 组 PIT 模块,每组有四路 PIT 通道,每路通道长度为 32-bit,其中 PIT_0 可链接两路定时器并组成 64-bit lifetimer 生命定时器
- PIT 时钟源为 AIPS_SLOW_CLK,其中 PIT_0 包含一路 RTI 时钟源来自 SIRC_CLK(32KHz),可用于Standby模式下的系统唤醒。
- 可用于引发中断和触发DMA通道
- PIT 的每个通道都可独立配置超时时限
- 如下图所示,PIT 定时的时长由预装载值决定,所有通道都是递减计数方式,当计时器计数到0会触发定时器中断,自动重装载值并立刻进入下一个周期。
2. PIT 驱动配置
- 在 S32K3 工程的驱动配置界面添加 PIT 组件
- 依次配置各个功能项
- 选择 “GptChannelConfigSet” 选项卡
- 点击“加号”按钮添加定时器通道
- 选择要配置的 PIT 实例,我们选用 PIT_0
- 如果需要启用 Debug 模式下暂停的功能,那么 “PitFreezeEnable” 项使能
- 选择对应的定时器通道,我们选用通道 0
- 如果需要 64-bit 定时器的话,启用 “ChainMode”,本文示例没有用到
- “PitNotification” 设置该通道发生超时中断时调用的回调函数
- 选择 “PitChannelMode” 连续模式或者单次模式,两种模式都可以,如果选择单次模式,每次发生超时中断时会自动关闭 PIT 通道,再次使用时需重新启用该通道
- 选择 “GptHwConfiguration” 选项卡,使能 PIT_0_CH_0 通道和中断
- 在 IntCtrl_Ip 组件中添加 PIT 的中断服务程序。
如果此处没有配置,则必须在程序初始化时安装 PIT 中断处理函数。
- 更新源代码,将会生成以下头文件和源文件
- Pit_Ip_BOARD_InitPeripherals_PBcfg.h
- Pit_Ip_Cfg.h
- Pit_Cfg_Defines.h
- Pit_Ip_BOARD_InitPeripherals_PBcfg.c
- 下列驱动层文件也会自动添加到工程中
- RTD/src/Pit_Ip .c
- RTD/include/Pit_Ip.h
- RTD/include/Pit_Ip_Types.h
3. 延时函数实现
- 在 <main.c> 文件上方增加 “Pit_Ip.h” 和 “IntCtrl_Ip.h” 头文件。
- 添加 PIT_0 实例的宏定义,方便函数调用。
- main 函数中添加 PIT 和 Interrupt 初始化语句,一定要最先初始化时钟,再是其他外设。这里也配置了一路 GPIO 用于控制开发板上的 LED,演示延时效果。
- 创建 PIT0_CH0 对应的回调函数,中断事件发生时可以在此处分配任务。这里的函数名要与 “PitNotification” 配置中的名称保持一致。
- 完成上述的操作之后,PIT 定时器还没有启动。为了精确的使用延时函数,我们需要查看当前工程中 PIT 的时钟源 AIPS_SLOW_CLK 频率,可以打开图形化配置界面在时钟树中找到,也可以在 “Clock_Ip_Cfg.c” 源文件中查看。
- 创建一个毫秒延时函数,为了降低库函数运行延迟,我们直接把命令写入寄存器。
如下图所示,将预装载值写入 LDVAL,TCTRL的 TEN 置位开启定时器,此时定时器开始递减计数,循环检测 TFLG 寄存器,当超时中断发生时 TIF 置位,关闭 PIT 定时器通道并清除挂起的中断,完成一次延时操作。
我们工程中的 PIT0_CLK 是 30MHz,所以预装载值:
count_timer = ( 30000000/1000) * delayMs = 30000 * delayMs
- 完成上述代码的编写之后,就可以在应用程序中使用了。
4. 参考文档
[1] S32K3xx Reference Manual, Rev. 9, 07/2024, NXP
欢迎点击此处在原博文下方留言评论,我们会及时回复您的问题。
如有更多需求,欢迎联系大联大世平集团 ATU 部门:atu.sh@wpi-group.com 作者:银酱