笔者搞了快一个星期的GPT的测试了,从配置到代码一遍又一遍的操作和阅读。觉得有必要把学习成功稍微总结一下了;学AUTOSAR最后还是得熟悉代码,毕竟AUTOSAR只是目的,而代码才是实现的手段。中间的逻辑关系看代码一目了然;这篇文章蹿了好久才写完,以后大概可以照这个模式把MCAL的所以模块都写一遍吧。
目录
一、什么是GPT
二、基于EB的GPT模块介绍:
2.1 变体配置(cinfig Variant)---一般默认选择VariantPostBuild:
2.2 GPT通道设置--GptChannelConfigSet
2.3、GptConfigurationOfOptApi
2.4 GptDriverConfiguration
2.5、GPT预定义计时器配置
三、GPT驱动模块API和函数的使用方法及原理
3.1GPT驱动模块API
3.2计时器通道相关
3.3 API调用流程
3.4 GPT_SetMode
GPT驱动(General Purpose Timer Driver)是使用通用定时器单元的硬件定时器通道,它为操作系统或者其他基础软件模块提供计时功能。GPT驱动可以提供启动和停止硬件定时器、得到定时器数值、控制时间触发的中断、控制时间触发的中断唤醒等功能。除此之外,GPT能初始化、控制MCU内部的通用定时器,用来产生一次性(One-shot)或者连续性(Continuous)的定时通知。GPT驱动通常为操作系统(OS)提供定时服务,或者当OS Alarm负担过重时为BSW其他模块提供定时服务。
GPT通道可以设置为连续模式(CONTINUOUS)或单次模式(ONESHOT)。
①连续模式:定时器到达目标时间后会自动清零并继续运行。
②单次模式:定时器到达目标时间,即计数值达到设定值时,定时器会自动停止,保持计数值不变,且通道状态从“运行”变为“超时”。
图1、GPT模块图形化界面介绍
由图1可知,GPT模块配置从上至下主要分为五大模块:
VariantPostBuild:
代码里面使用到的数据,在编译和链接完成后仍没有添加到里面,而是代码里面通过指针的方式指向某个FLASH地址,并且这个地址所对应的数据是空的.这些数据不是在编码阶段提供的,而通常是在制造过程中或以后阶段提供(工厂产线等)。主要指可重新加载的、模块外的常量;
VariantPreCompile:
所有的代码和数据在编译器运行前就已经决定了,编译完成(这里指链接完得到二进制文件)后代码和有效数据同时放到ECU的FLASH中(指代码和数据均已被包含在二进制文件里面)
GptChannelConfigSet是一个容器,用来存放已配置的GPT通道;此容器是包含已配置GPT通道的配置集的基础。通过这种方式,可以为后构建过程定义不同的配置集;
点击GptChannelConfiguration,我们就进入了具体的配置界面:
这里我配置了9个GPTchannel,双击数字0,进入通道的具体配置
小结:一个正常通道的配置,需要设置通道ID、选择对应的计时器、分配对应的计时器通道、选择通道模式、指定定时器通道的滴答频率、命名中断通知函数;
GPT的API服务配置,点击方框可启用相应的API;
GPT驱动方面的配置,主要包含了错误检测、预计时器使能、
2. GptPredefTimer100us32bitEnable :
开启/禁用GPT Predef Timer 100μs32bit功能,勾选方框开启后可使用GptPredefTimer100us32bit功能;
设置GPT Predef Timers使能等级,滴答时间为1μs。有四种可选项,
GPT_PREDEF_TIMER_1US_16BIT_ENABLED、GPT_PREDEF_TIMER_1US_24BIT_ENABLED、GPT_PREDEF_TIMER_1US_32BIT_ENABLED、
GPT_PREDEF_TIMER_1US_DISABLED;
4. GptReportWakeupSource :
启用/禁用唤醒源报告
Gpt_CheckWakeup函数只有在GptReportWakeupSource静态配置为可用时才可行。
Gpt_SetMode函数只有在配置参数GptReportWakeupSource启用时才可用。
Gpt_DisableWakeup函数只有在GptReportWakeupSource静态配置为可用时才可行。
Gpt_EnableWakeup函数只有在GptReportWakeupSource静态配置为可用时才可行
5. GptClockReferencePoint:
这个容器就是对系统时钟的映射;该容器包含一个参数,它表示对类型为McuClockReferencePoint的容器的引用(在模块MCU中定义)。容器需要支持多个时钟引用(依赖于硬件)。
GPT Predef Timer :是由GPT Driver提供的一个自由运行的计数器。如果计时器已经达到最大值(最大值= 2n -1, n=比特数),计时器将在下一次计时器滴答时继续运行,值为“0”。哪些GPT预定义定时器可用,取决于硬件(时钟,硬件定时器,预分频器,定时器寄存器的宽度,..)和配置。GPT Predef Timer具有预定义的物理时间单位和范围。除非有特殊要求,一般随便选一个配置。
GPT驱动模块可以初始化、控制MCU内部的通用寄存器,并且为如下功能提供接口函数和配置参数:
● 启动、停止硬件计时器;
● 获取硬件计时器的值;
● 控制时间触发的中断通知;
● 控制时间触发的唤醒中断(须硬件支持)。
并不是所有的硬件计时器都由GPT驱动模块控制,一些硬件计时器由OS驱动模块或者复杂驱动(CDD)模块控制。一个计时通道的节拍时长是由通道配置参数及MCU 驱动模块中系统时钟分布决定的, 在AUTOSAR MCAL规范中并未对节拍时长进行限制。GPT驱动模块提供了如表3-1所示的API供上层软件组件调用。
表3-1 GPT驱动模块提供的API
GPT驱动程序提供启动和停止计时器通道(分配给计时器硬件的逻辑计时器实例)的服务,每个通道通过调用:Gpt_StartTimer 、Gpt_StopTimer
“目标时间”作为参数传递给Gpt_StartTimer。因此,对于计时器通道的每个开始,目标时间都可以单独设置。
计时器通道的状态和状态转换如图3-2所示
3-2 计时器通道状态和状态转化
计时器通道两种模式设置原理:
使用函数Gpt_GetTimeElapsed、Gpt_GetTimeRemaining可以获得当前
计时器已计时时间和剩余时间。
图3-3所示为连续计时模式下计时器已计时时间和剩余时间。使用Gpt_StartTimer、Gpt_StopTimer可以单独打开或关闭每个计时器通道。Gpt_StartTime会把参数传入目标时间,因此,目标时间在每次打开计时器通道时都可以设置。
图3-3 连续计时模式下计时器已计时时间和剩余时间
一次计时模式和连续计时模式。当通道被配置为一次计时模式时,计时器计时到目标时间后会自动停止并保持当前值不变,同时计时器通道状态从“运行”变为“expired”(逾时)状态,而连续模式下不会进入该状态,而是直接进入下一次定时器计数;图3-4所示为一次计时模式下计时器的状态流程。
图3-4 一次计时模式下计时器的状态流程
当计时器通道被配置为连续计时模式时,计时器计时到目标时间后会继续在下一个节拍从0开始计时,因此,计时周期=目标时间+1。图3-5所示为连续计时模式下计时器的状态流程。
图3-5 连续计时模式下计时器的状态流程
在AUTOSAR MCAL规范中给出了一次计时模式下GPT驱动模块API的调用流程,如图3-6所示。
图3-6 一次计时模式下GPT驱动模块API的调用流程
在AUTOSAR MCAL规范中给出了连续计时模式下GPT驱动模块API
的调用流程,如图3-7所示。
图3-7 连续计时模式下GPT驱动模块API的调用流程
初始化后,GPT驱动程序处于“正常模式”。
函数Gpt_SetMode应该将GPT驱动程序的操作模式设置为给定的模式参数;
Gpt_SetMode函数只有在配置参数GptReportWakeupSource启用时才可用;
GPT驱动程序的操作模式和可能的模式转换如图3-8所示
图3-8 GPT驱动模式转化流程