一. GPT基本概念
GPT即General Purpose Timer(s) ,通用定时器模块,该模块通过使用硬件定时器通道为操作系统或其他需要定时器功能的模块提供定时功能,通常可提供从微秒级到毫秒级的定时时钟功能。

二. GPT的作用
1)启动及停止硬件定时器;
2)获取定时器已过去及剩余的定时器数值;
3)控制定时器的定时数值;
4)控制时间触发的中断
总而言之,其作用就是一个定时器,为需要的模块提供定时功能
例如对于需要进行周期性处理的动作通常可通过定时器功能来实现。
定时器一旦启动后,将持续进行计数,一旦到达所设置的定时值时将会以中断的方式予以告知。

三. GPT通道的四个状态
GPT通道的状态有:Initialized/Running/Stopped/Expired四个状态
1)Initialized
在GPT Driver初始化完成后状态为Initialized状态;
2)Running
调用Gpt_Startimer()后状态变为Running,开始计时;
3)Expired
计时达到目标后变为Expired
4)Stopped
调用Gpt_Stoptimer()后状态变为Stopped

四. Continuous/One-Shot模式
GPT根据计时模式可以分为Continuous及One-Shot模式,其中Continuous在开始计时达到设定时间后会自动开始下一轮计时,但对于One-Shot模式则需要调用API Gpt_Startimer()重新开始定时。根据不同的使用场景在MCAL中进行灵活配置。

4.1)Continuous模式
周期性定时器(continuous):定时时间终止时,定时器会自动重新开始,若产生中断的话,每隔一个定时周期就会产生一次。
到达目标时间后,计时器再次以值“0”继续运行。
Continuous模式采集过程如下:
1)调用Gpt_EnableNotification() API使能对应通道的中断服务函数;
2)调用Gpt_Startimer()开始定时;
3)在GPT Timer达到设定时间后会进入对应的中断服务函数,同时开启下一轮的定时,如此循环往复;
4)当不需要再继续定时调用Gpt_Stoptimer(),关闭定时器,停止计时。

4.2)One-Shot模式
单次性定时器(one-shot):定时时间终止时,定时器中止不再计数,若产生中断的话,也仅产生一次中断。one shot mode timer
One-Shot模式采集过程相对比较直白,即触发一次定时就工作一次,下一次需要重新去启动,其大致工作过程如下:
1)调用Gpt_EnableNotification() API使能对应通道的中断服务函数;
2)调用Gpt_Startimer()开始定时;
3)在GPT Timer达到设定时间后会进入对应的中断服务函数;
4)当需要再次定时时重新调用Gpt_Startimer()开始定时;
4)当不需要再继续定时调用Gpt_Stoptimer(),关闭定时器,停止计时。

五、配置
例1:GPT定时器模块是程序中非常重要的模块,它可以定义不同的时间段在While循环中运行,保证重要程度不同的功能能够稳定工作。(基于S32K312芯片进行开发,采用在不同定时器的时间段去点亮LED灯。来展现Gpt是否配对)

1.首先在EB中创建新工程,并添加以下模块GPT原本不需要定义引脚(Port与Dio是负责点灯)
在这里插入图片描述2.在Port中添加MCU_LED的引脚,在Dio中将它定义出来(可以使用Dio_WriteChannel定义该引脚的高低电平)

在这里插入图片描述
3. 首先打开Gpt模块,选择Pre模式,方便初始化,关闭Wakeup相关内容(没有用到wakeup模块,开启后会报错)
在这里插入图片描述
4.在Gpt模块中打开PIT0_CH0的中断,并添加相应的通道
在这里插入图片描述
5. 添加Gpt所用的时钟,并添加上诉引脚的具体配置(Gpt采用SLOW_CLK,MCU配置可看之前的MCU详解)
在这里插入图片描述
6.在详细配置界面,注意中断回调函数的打开与命名。
在这里插入图片描述
7. 在Platform模块中打开PIT0通道的中断与中断回调在这里插入图片描述
8、开启定时器
Gpt_StartTimer(GptConf_GptChannelConfiguration_GptChannelConfiguration_0, 3000U);

定义最小时间段(时钟除以3000为频率,周期为频率的倒数)。
9、开启中断调用
Gpt_EnableNotification(GptConf_GptChannelConfiguration_GptChannelConfiguration_0);

开启Gpt的中断回调。

例2 通过GPT定时器中断喂外置看门狗
1、打开GPT模块,在Channel Configuration中添加一个GPT通道
在这里插入图片描述
2、对新添加的GPT通道进行配置
在这里插入图片描述
Channel mode为计数模式,单次还是连续
Channel CLk Src 为中断来源,内部还是外部
Channel tick frequency 为时钟频率
Channel tick value max 为最大计数值
Enable debug 在debug模式停止计数
notification为中断回调函数
Channel clk src ref 参考的时钟来源
3、在clock reference point 中添加与MCU对应的时钟来源
在这里插入图片描述
4、在OS模块中添加一个中断源与GPT模块的通道对应
在这里插入图片描述
name为对应GPT通道的中断源
Harware prionrty为中断的优先级
5、开启定时器
Gpt_StartTimer(GptConf_GptChannelConfiguration_GptChannelConfiguration_0, 1000U);

定义最小时间段(时钟除以1000为频率,周期为频率的倒数)。
6、开启中断调用
Gpt_EnableNotification(GptConf_GptChannelConfiguration_GptChannelConfiguration_0);

开启Gpt的中断回调。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐