当前位置: 代码网 > it编程>游戏开发>ar > [ 搞一点AutoSar ]基于EB的MCAL-GPT全模块配置与解析

[ 搞一点AutoSar ]基于EB的MCAL-GPT全模块配置与解析

2024年08月06日 ar 我要评论
基于EB配置的GPT模块解析,吐血总结,跪求多多点赞收藏吧!

目录

一、什么是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

        gpt驱动(general purpose timer driver)是使用通用定时器单元的硬件定时器通道,它为操作系统或者其他基础软件模块提供计时功能。gpt驱动可以提供启动和停止硬件定时器、得到定时器数值、控制时间触发的中断、控制时间触发的中断唤醒等功能。除此之外,gpt能初始化、控制mcu内部的通用定时器,用来产生一次性(one-shot)或者连续性(continuous)的定时通知。gpt驱动通常为操作系统(os)提供定时服务,或者当os alarm负担过重时为bsw其他模块提供定时服务。

gpt通道可以设置为连续模式(continuous)或单次模式(oneshot)。

①连续模式:定时器到达目标时间后会自动清零并继续运行。

②单次模式:定时器到达目标时间,即计数值达到设定值时,定时器会自动停止,保持计数值不变,且通道状态从“运行”变为“超时”。

二、基于eb的gpt模块介绍:

                                                        图1、gpt模块图形化界面介绍 

由图1可知,gpt模块配置从上至下主要分为五大模块:

  • cinfig variant --变体
  • gptchannelconfigset --gpt通道配置
  • gptconfigurationofoptapi --gpt的api配置
  • gptdriverconfiguration --gpt驱动配置
  • gptpredeftimerconfig --gpt预定义计时器配置

2.1 变体配置(cinfig variant)---一般默认选择variantpostbuild: 

 

variantpostbuild:

代码里面使用到的数据,在编译和链接完成后仍没有添加到里面,而是代码里面通过指针的方式指向某个flash地址,并且这个地址所对应的数据是空的.这些数据不是在编码阶段提供的,而通常是在制造过程中或以后阶段提供(工厂产线等)。主要指可重新加载的、模块外的常量;

variantprecompile:

所有的代码和数据在编译器运行前就已经决定了,编译完成(这里指链接完得到二进制文件)后代码和有效数据同时放到ecu的flash中(指代码和数据均已被包含在二进制文件里面)

 2.2 gpt通道设置--gptchannelconfigset

 

gptchannelconfigset是一个容器,用来存放已配置的gpt通道;此容器是包含已配置gpt通道的配置集的基础。通过这种方式,可以为后构建过程定义不同的配置集;

点击gptchannelconfiguration,我们就进入了具体的配置界面:

 

这里我配置了9个gptchannel,双击数字0,进入通道的具体配置 

 

  1. gptchannelid : gpt通道序列号
  2. gpthwmodule:硬件模块配置,这里分配了btm4计时器给这个通道
  3. gpthwmoduleprescaler (0 -> 255):硬件模块预分频值(预分频有点复杂,这里一般按要求配置就好)
  4. gpthwmodulechannel:硬件模块通道,一个计时器可以分配两个通道go、g1;这里选择了g0通道;
  5. gptchannelmode:通道模式,有两种模式,单次模式和连续模式;这里选择了连续模式;  
  6. gptchanneltickfrequency (0 -> infinity):指定定时器通道的滴答频率,单位为hz,具体该配多少由硬件决定;
  7. gptchanneltickvaluemax  :计时器通道能够计数的最大刻度值(由硬件决定)。下一个滴答时刻,计时器重新转到零。4294967295转化为16进制为ffff  ffff;代表该种硬件对应的寄存器最多存的数据量0xffffffff;
  8. gptenablewakeup  : 使能唤醒服务,点击方框可及激活唤醒功能;
  9. gptnotification  : 选择中断通知服务,这里命名为gpt4_go_irq(4代表使用的是计时器btm4,go代表选择的硬件通道是go,irq代表的是中断函数);

小结:一个正常通道的配置,需要设置通道id、选择对应的计时器、分配对应的计时器通道、选择通道模式、指定定时器通道的滴答频率、命名中断通知函数;

2.3、gptconfigurationofoptapi

gpt的api服务配置,点击方框可启用相应的api;

 

  1. gptdeinitapi : gpt 去初始化函数api,将gpt驱动状态恢复到默认状态;
  2. gptenabledisablenotificationapi:使能/去使能中断通知函数api;
  3. gpttimeremainingapi  : 计时器时间剩余api;
  4. gptwakeupfunctionalityapi:唤醒功能api;
  5. gptpredeftimerfunctionalityapi :预计时器功能api;
  6. gpttimeelapsedapi :记录当前计时器已计时时间的api;
  7. gptversioninfoapi  :版本信息获取api;

2.4 gptdriverconfiguration 

 

gpt驱动方面的配置,主要包含了错误检测、预计时器使能、

  1. 1. gptdeverrordetect  是否启用错误检测功能;

2. gptpredeftimer100us32bitenable :

开启/禁用gpt predef timer 100μs32bit功能,勾选方框开启后可使用gptpredeftimer100us32bit功能;

  1. 3. gptpredeftimer1usenablinggrade 

ff9f6fd4988e45c2a6c6a9d8ede062c7.png

设置gpt predef timers使能等级,滴答时间为1μs。

预定义定时器的位数16/24/32,代表的是寄存器的最大存储数据,即定时器的最大定时时间;例如16bit的定时器最大定时时间为2的16次方--65535个tick(tick由时钟频率决定); 1us代表一个tick的持续时间为1 us,那么100us就代表一个tick=100us; 所以你会看到上图16位的定时器的最大计时时间约为65ms;

有四种可选项,

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中定义)。容器需要支持多个时钟引用(依赖于硬件)。

2.5、gpt预定义计时器配置 

 

 gpt predef timer  :是由gpt driver提供的一个自由运行的计数器。如果计时器已经达到最大值(最大值= 2n -1, n=比特数),计时器将在下一次计时器滴答时继续运行,值为“0”。哪些gpt预定义定时器可用,取决于硬件(时钟,硬件定时器,预分频器,定时器寄存器的宽度,..)和配置。gpt predef timer具有预定义的物理时间单位和范围。除非有特殊要求,一般随便选一个配置。

三、gpt驱动模块api和函数的使用方法及原理

3.1gpt驱动模块api

gpt驱动模块可以初始化、控制mcu内部的通用寄存器,并且为如下功能提供接口函数和配置参数:

● 启动、停止硬件计时器;

● 获取硬件计时器的值;

● 控制时间触发的中断通知;

● 控制时间触发的唤醒中断(须硬件支持)。

并不是所有的硬件计时器都由gpt驱动模块控制,一些硬件计时器由os驱动模块或者复杂驱动(cdd)模块控制。一个计时通道的节拍时长是由通道配置参数及mcu 驱动模块中系统时钟分布决定的, 在autosar mcal规范中并未对节拍时长进行限制。gpt驱动模块提供了如表3-1所示的api供上层软件组件调用。

57caa75fcef84cceba277968d93febb5.png

表3-1 gpt驱动模块提供的api 

3.2计时器通道相关

gpt驱动程序提供启动和停止计时器通道(分配给计时器硬件的逻辑计时器实例)的服务,每个通道通过调用:gpt_starttimer 、gpt_stoptimer

“目标时间”作为参数传递给gpt_starttimer。因此,对于计时器通道的每个开始,目标时间都可以单独设置。

 计时器通道的状态和状态转换如图3-2所示

0629ce44d30b47888801730b8aecdc26.png

3-2 计时器通道状态和状态转化 

计时器通道两种模式设置原理

使用函数gpt_gettimeelapsed、gpt_gettimeremaining可以获得当前

计时器已计时时间和剩余时间。

图3-3所示为连续计时模式下计时器已计时时间和剩余时间。使用gpt_starttimer、gpt_stoptimer可以单独打开或关闭每个计时器通道。gpt_starttime会把参数传入目标时间,因此,目标时间在每次打开计时器通道时都可以设置。

51f566dc97af47d48b204358e9b6c05e.png

 图3-3 连续计时模式下计时器已计时时间和剩余时间

一次计时模式和连续计时模式。当通道被配置为一次计时模式时,计时器计时到目标时间后会自动停止并保持当前值不变,同时计时器通道状态从“运行”变为“expired”(逾时)状态,而连续模式下不会进入该状态,而是直接进入下一次定时器计数;图3-4所示为一次计时模式下计时器的状态流程。  

833e090d7ade48a4b3a83856ad31c42e.png

图3-4 一次计时模式下计时器的状态流程 

当计时器通道被配置为连续计时模式时,计时器计时到目标时间后会继续在下一个节拍从0开始计时,因此,计时周期=目标时间+1。图3-5所示为连续计时模式下计时器的状态流程。 

0e4ad03484df48f0b1492518befd00f6.png

图3-5 连续计时模式下计时器的状态流程

3.3 api调用流程

在autosar mcal规范中给出了一次计时模式下gpt驱动模块api的调用流程,如图3-6所示。

aed9d19e23c645aab7bff2baf6b5443a.png

图3-6 一次计时模式下gpt驱动模块api的调用流程

在autosar mcal规范中给出了连续计时模式下gpt驱动模块api

的调用流程,如图3-7所示。

d58605060ed6481eac2289db50442fc5.png

图3-7 连续计时模式下gpt驱动模块api的调用流程 

3.4 gpt_setmode 

 

初始化后,gpt驱动程序处于“正常模式”。

函数gpt_setmode应该将gpt驱动程序的操作模式设置为给定的模式参数;

gpt_setmode函数只有在配置参数gptreportwakeupsource启用时才可用;

gpt驱动程序的操作模式和可能的模式转换如图3-8所示

 

图3-8 gpt驱动模式转化流程

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com