问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

使用S32K3 PIT定时器实现延时功能

创作时间:
作者:
@小白创作中心

使用S32K3 PIT定时器实现延时功能

引用
CSDN
1.
https://blog.csdn.net/wpgddt/article/details/145872388

前言

周期中断定时器 (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 组件

  • 依次配置各个功能项

  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 通道和中断

  • 在 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

本文原文来自CSDN

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号