【S32K 进阶之旅】 使用 S32K3 PIT 定时器实现 delay 延时功能

前言

       周期中断定时器 (Periodic Interrupt Timer, PIT) 模块顾名思义,就是通过计时行为引发周期性中断事件的触发器。本文基于 S32K312 开发板实现延时功能,在此之前先简单介绍下 PIT 的特性。

1. PIT 模块特性

  • 根据下图查表可知,不同型号 S32K3 支持的 PIT 数量不同。最多有 4 组 PIT 模块,每组有四路 PIT 通道,每路通道长度为 32-bit,其中 PIT_0 可链接两路定时器并组成 64-bit lifetimer 生命定时器

【S32K 进阶之旅】 使用 S32K3 PIT 定时器实现 delay 延时功能

  • PIT 时钟源为 AIPS_SLOW_CLK,其中 PIT_0 包含一路 RTI 时钟源来自 SIRC_CLK(32KHz),可用于Standby模式下的系统唤醒。

【S32K 进阶之旅】 使用 S32K3 PIT 定时器实现 delay 延时功能

  • 可用于引发中断和触发DMA通道
  • PIT 的每个通道都可独立配置超时时限
  • 如下图所示,PIT 定时的时长由预装载值决定,所有通道都是递减计数方式,当计时器计数到0会触发定时器中断,自动重装载值并立刻进入下一个周期。

【S32K 进阶之旅】 使用 S32K3 PIT 定时器实现 delay 延时功能

 2. PIT 驱动配置

  •  S32K3 工程的驱动配置界面添加 PIT 组件

【S32K 进阶之旅】 使用 S32K3 PIT 定时器实现 delay 延时功能

  • 依次配置各个功能项
  1. 选择 “GptChannelConfigSet” 选项卡
  2. 点击“加号”按钮添加定时器通道
  3. 选择要配置的 PIT 实例,我们选用 PIT_0
  4. 如果需要启用 Debug 模式下暂停的功能,那么 “PitFreezeEnable” 项使能
  5. 选择对应的定时器通道,我们选用通道 0
  6. 如果需要 64-bit 定时器的话,启用 “ChainMode”,本文示例没有用到
  7. “PitNotification” 设置该通道发生超时中断时调用的回调函数
  8. 选择 “PitChannelMode” 连续模式或者单次模式,两种模式都可以,如果选择单次模式,每次发生超时中断时会自动关闭 PIT 通道,再次使用时需重新启用该通道
  9. 选择 “GptHwConfiguration” 选项卡,使能 PIT_0_CH_0 通道和中断

【S32K 进阶之旅】 使用 S32K3 PIT 定时器实现 delay 延时功能

【S32K 进阶之旅】 使用 S32K3 PIT 定时器实现 delay 延时功能

  •  IntCtrl_Ip 组件中添加 PIT 的中断服务程序。

如果此处没有配置,则必须在程序初始化时安装 PIT 中断处理函数。

【S32K 进阶之旅】 使用 S32K3 PIT 定时器实现 delay 延时功能

  • 更新源代码,将会生成以下头文件和源文件
  • Pit_Ip_BOARD_InitPeripherals_PBcfg.h
  • Pit_Ip_Cfg.h
  • Pit_Cfg_Defines.h
  • Pit_Ip_BOARD_InitPeripherals_PBcfg.c

【S32K 进阶之旅】 使用 S32K3 PIT 定时器实现 delay 延时功能

  • 下列驱动层文件也会自动添加到工程中
  • 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 实例的宏定义,方便函数调用。

【S32K 进阶之旅】 使用 S32K3 PIT 定时器实现 delay 延时功能

  • main 函数中添加 PIT 和 Interrupt 初始化语句,一定要最先初始化时钟,再是其他外设。这里也配置了一路 GPIO 用于控制开发板上的 LED,演示延时效果。

【S32K 进阶之旅】 使用 S32K3 PIT 定时器实现 delay 延时功能

  • 创建 PIT0_CH0 对应的回调函数,中断事件发生时可以在此处分配任务。这里的函数名要与 “PitNotification” 配置中的名称保持一致。

  • 完成上述的操作之后,PIT 定时器还没有启动。为了精确的使用延时函数,我们需要查看当前工程中 PIT 的时钟源 AIPS_SLOW_CLK 频率,可以打开图形化配置界面在时钟树中找到,也可以在 “Clock_Ip_Cfg.c” 源文件中查看。

【S32K 进阶之旅】 使用 S32K3 PIT 定时器实现 delay 延时功能

【S32K 进阶之旅】 使用 S32K3 PIT 定时器实现 delay 延时功能

  • 创建一个毫秒延时函数,为了降低库函数运行延迟,我们直接把命令写入寄存器。

       如下图所示,将预装载值写入 LDVAL,TCTRL的 TEN 置位开启定时器,此时定时器开始递减计数,循环检测 TFLG 寄存器,当超时中断发生时 TIF 置位,关闭 PIT 定时器通道并清除挂起的中断,完成一次延时操作。

我们工程中的 PIT0_CLK 是 30MHz,所以预装载值:

count_timer = ( 30000000/1000) * delayMs = 30000 * delayMs

【S32K 进阶之旅】 使用 S32K3 PIT 定时器实现 delay 延时功能

  • 完成上述代码的编写之后,就可以在应用程序中使用了。

4. 参考文档

[1] S32K3xx Reference Manual, Rev. 9, 07/2024, NXP

欢迎点击此处在原博文下方留言评论,我们会及时回复您的问题。

如有更多需求,欢迎联系大联大世平集团 ATU 部门:atu.sh@wpi-group.com   
作者:银酱

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值