【MCAL】TC397+EB-tresos之GPT配置实战 - 定时器

本篇文章介绍了在TC397平台使用EB-tresos对GPT驱动模块进行配置的实战过程,不仅介绍了使用GTM来实现定时器的方案,还介绍了基于GPT12来实现连续定时器的实例。因为GTM是德国博世公司开发的IP,而英飞凌的芯片集成了这个IP,并在这个基础上搭建了通用定时器等功能,所以一个简单如定时器这种单片机的常用功能,配置实现起来也感觉非常的割裂,鉴于这种情况,笔者在概述上尽量的补充了一些概念来帮助读者理解后面的实战内容,并补充了基于GPT12来实现定时器的方案。

目录

概述

GTM(Generic Timer Module) 

SCU(System Control Unit)

GPT12

环境与目标 

EB-tresos配置GPT实现1ms定时器

MCU配置

GTM配置 

GtmClusterConf_0

GtmGlobalConfiguration 

McuGtmTimChannelAllocationConf 

GPT配置

General

GptChannelConfiguration 

GptNotification

GtmTimerOutputModuleConfiguration 

IRQ配置

ResourceM配置

GPT驱动使用与调试

EB-tresos配置GPT实现2ms定时翻转I/O口

MCU配置

McuGpt12ModuleAllocationConf

McuPllDistributionSettingConfig

McuGpt12PrescalerConf

GPT配置 

GptChannelConfiguration

GptNotification 

Gpt12TimerOutputModuleConfiguration  

IRQ配置 

GPT12驱动使用与调试


概述

GPT(General Purpose Timer)驱动程序负责为 AUTOSAR规范中定义的标准计时器功能提供对应的API。相应的底层定时器引擎是可以是包含在AURIX2G系列处理器中的GTM定时器通道(TOM/ATOM slice)或者GPT12定时器。用户可以基于驱动程序配置实现多个通道,在每个通道上上层程序的可以执行以下操作:

  • 启动/停止定时器
  • 启用/禁用唤醒功能
  • 启用/禁用回调通知
  • 单次或连续操作模式
  • 使用TOM切片实现的GPT Predef Timer功能。

下图是英飞凌针对Autosar MCAL的架构实现,GPT位置如下。

下图为GPT驱动模块的软硬件调用接口图。


GTM(Generic Timer Module) 

GPT驱动利用GTM这个IP核提供的通道来实现连续定时模式、单次定时模式和预定义定时器。

连续和单次模式逻辑通道需要一个来自TOM(Timer Output Module)/ATOM(ARU-connected Timer Output Module)切片的定时器通道。预定义定时器仅使用GTM的IP核提供的TOM切片,因为TOM是16位定时器,跟24位定时器ATOM相比,它更容易实现通道的级联从而产生多种不同位数定时器的派生。举例说明,如果 fGTM 配置为可以直接推导特定的定时器所需的频率(如1us预定义定时器对应1MHz,100us 预定义定时器为10KHz),16位预置定时器只需要一个TOM 通道来实现n*1us/n*100us的定时器,则不需要TRIGOUT功能(通道级联),若fGTM配置为可以不能直接推导特定的定时器所需的频率,则首先由一个Tom通道来实现1us/100us的Tick频率,然后再级联下一个TOM通道来实现n*1us/n*100us的定时器。我们还可以利用这种TRIGOUT(级联)特性来使用多个TOM通道实现24位/32位定时器。

从上面可以得到结论,如果fGTM配置不能直接推导出定时器所需频率,且要实现一个24位/32位的定时器,那么我们需要3个通道,三个通道号需要按顺序依次递增。我们此次选用的GtmTimerUsed为GTMTom0Channel0。

时钟方面,fGTM可在MCU模块中的McuPllDistributionSettingConfig进行直接配置(200Mhz),因为CMU(Clock Management Unit)属于Cluster0,所以可以在GtmClusterConf_0里对其进行分频(2分频)得到fCLS0。

然后需要在McuGtmClockManagementConf里配置分频的分子与分母(分别为1)得到CmuGlobalClock,然后选择FixedClock源时钟为CmuGlobalClock,这样我们就可以将FixedClock2作为GPT模块的GtmTimerClock。最终时钟的计算为((200Mhz/2)/2^4)=6250 000Hz,则要得到一毫秒的中断,超时的Tick数应为6250。


SCU(System Control Unit)

GPT驱动程序的时钟取决于SCU这个IP核。通用定时器需要fGTM和fSPB(System Peripheral Bus)时钟信号。

SCU为所有外设提供时钟,MCU驱动程序负责配置芯片时钟树。为避免因同时写入而发生冲突,使用MCALLIB提供的API执行对所有ENDINIT保护寄存器的更新。


GPT12

GPT驱动使用GPT12这个IP核实现连续定时器模式和单次定时器模式,其并不支持预定义模式。使用 GPT1 模块实现连续模式逻辑通道需要两个定时器,核心定时器T3和辅助定时器之一(T2或T4)。使用 GPT2 模块实现连续模式逻辑通道只需要T6(使用CAPREL寄存器作为重新加载寄存器)。单次模式逻辑通道的实现只需要来自 GPT1 或 GPT2 块中的一个计时器。

GP1(T2,T3,T4)的所有三个定时器可以配置成四种基本模式:定时器模式,门控定时器模式,计数器模式或者增量接口模式。

下面简单针对其几个输入/输出引脚做一下解释。

  • TxIN:为门控模式下的门控信号(启动/停止计时)输入或者在计数器模式中用作输入。计数模式下可以通过T3CON寄存器中的位域T3I来控制输入上升沿计数还是下降沿。T3CON寄存器中的位域T3M可以选择定时器处于什么模式。
  • TxEUD:计数方向( 上/下)通过外部上/下控制输入 TxEUD( 具有引脚功能)上的信号来动态改变 。
  • 输出翻转锁存T3OTL :可指明内核定时器 T3 的上溢/下溢, 输出翻转锁存的状态在相关的引脚T3OUT(相关引脚功能) 上输出。

我们下边的例子实现的是连续定时器模式,所以用到了核心定时器T3和辅助定时器T2,T2用于重载核心定时器T3,T3的翻转锁存状态触发辅助定时器作为其T3的重载寄存器使用。辅助寄存器还可以作为捕获寄存器使用,在TxIN电平翻转的时候获取内核定时器的值。


环境与目标 

本文使用的为英飞凌提供的开发板KIT_A2G_TC397XA_TFT,芯片为TC397,外部的时钟为20Mhz。

涉及的软件如下。

  • EB-tresos:用于生成动态代码,具体工程搭建参考《【AUTOSAR MCAL】MCAL基础与EB tresos工程新建》。
  • HighTech:用于编译生成elf文件,具体的工程搭建参考《【MCAL】HighTec集成TC3xx对应MCAL的Demo》。
  • UDE 5.2:用于下载和调试程序。

涉及的参考文档如下表。

序号参考资料内容
1《Infineon-AURIX_TC39x-UserManual-v02_00-EN》英飞凌TC39x用户手册
2《ApplicationKitManual-TC3X7-ADAS-V21.pdf》开发板KIT_A2G_TC397XA_TFT说明
3《MC-ISAR_TC3xx_UM_Gpt.pdf》英飞凌提供的TC39x芯片Gpt用户手册

配置目标如下:

  1. 使用GPT实现1ms的定时器中断,在中断处理函数中累加值,用作系统时标。
  2. 使用GPT12实现2ms定时器中断,在中断处理函数中翻转I/O口状态。

EB-tresos配置GPT实现1ms定时器

MCU配置

配置GTM外设为200Mhz频率。


GTM配置 

GtmClusterConf_0

配置fCLS0为fGTM的二分频,即为100Mhz。


GtmGlobalConfiguration 

配置CMU的全局频率等于fCLS0(100Mhz),公式为。然后选择CMU的FixedClock来源为CMU的全局频率。


McuGtmTimChannelAllocationConf 

最后配置Tom0的Channel0用作GPT使用。


GPT配置

General

配置GPT模块General部分,需要我们注意的配置项有以下几个。

  • GptEnableDisableNotificationApi:使能回调函数的API,此处属于下面回调函数配置的开关。
  • GptTimeElapsedApi:已经运行时间的计数,例如本例子的1ms假设运行了0.3ms,这个API返回值为0.3ms的Ticks。
  • GptTimeRemainingApi:剩余时间的计数,例如本例子的1ms假设运行了0.3ms,这个APl返回值为剩余0.7ms的Ticks.


GptChannelConfiguration 

这里需要注意的配置有以下几个。

  • GptAssignedHwUnit:选择硬件时钟是GTM还是GPT12。
  • GptChannelMode:运行模式是连续还是单次触发。


GptNotification

中断函数命名为Gpt_1ms。


GtmTimerOutputModuleConfiguration 

选择GTM使用的Timer为Tom1Channel0。时钟源选择CMU输出的Fixed_Clock_1。


IRQ配置

可以看到TOM0的channel0中断输出使用的是SR0。


ResourceM配置

分配核0使用资源,添加GPT:GptChannelConfiguration_0。


GPT驱动使用与调试

首先,实现一个名为Gpt_1ms函数(形参和返回值均为Void)。

/**
* @brief       系统时标更新
*
* @param[in]   none
* @param[out]  none
*
* @return      none
*/void Gpt_1ms(void)
{GetTimeglapsed = Gpt_GetTimerlapsed(GptConf_GptChannelConfiguration_GptChannelConfiguration_0);GetTimePemsining = Gpt_GetTimeFemaining(GptConf_GptChannelConfiguration_GptChannelConfiguration_0);/* 1ms Interrupt */if(GptDelay == TRUE){Delaycount++;}mcal_tick_cnt++;
}

然后将MCAL的示例中的Gtm_Ir与Demo_Gpt添加到工程中。

在初始化过程中调用GPT_Demo()即可完成GPT的初始化。

记住按照计算的数值修改定时器溢出时的值为6250。

LOCAL_INLINE void Gpt_lStartDemo(void)
{/* Enable notification for Timer channel 0 */Gpt_EnableNotification(0);/* 16 bit max value in GPT12 timer */Gpt_StartTimer(0,6250U);
}

最后使用UDS下载程序到板卡中,在中断函数中打断点能正常进入。


EB-tresos配置GPT实现2ms定时翻转I/O口

MCU配置

McuGpt12ModuleAllocationConf

将辅助定时器T2与主定时器T3设置为GPT驱动。


McuPllDistributionSettingConfig

 因为fGPT = fSPB,所以配置fSPB为100Mhz。


McuGpt12PrescalerConf

配置GPT1的分频值。

根据手册,此处至少为4,经过如此的配置之后,GPT1的时钟参数如下图所示。


GPT配置 

GptChannelConfiguration

选择GPT12作为GPT的硬件实现单元。


GptNotification 

定义中断回调函数的名称为loHwAb_GptT3Notification。


Gpt12TimerOutputModuleConfiguration  


IRQ配置 

配置T3的中断优先级为19。


GPT12驱动使用与调试

首先,初始化部分我们要使能中断并且开启回调函数。

	/*gpt12 irq*/SRC_GPT120T3.B.SRE = 1;Gpt_EnableNotification(GptConf_GptChannelConfiguration_GptChannelConfiguration_GPT12);Gpt_StartTimer(GptConf_GptChannelConfiguration_GptChannelConfiguration_GPT12, 50000);Mcu_17_Gpt12_TimerStart(MCU_GPT12_TIMER3);

这里为什么Timer溢出的值为50000,是因为前面MCU阶段配置了4分频SPB为100Mhz。
那么100 000 000/4 = 25 000 000,即每秒运行Ticks为25 000 000,则2ms运行为25 00 000 / 1000* 2 = 50 000。

中断回调代码如下。

void IoHwAb_GptT3Notification(void)
{Dio_FlipChannel(DioConf_DioChannel_DioChannel_Flip);}

最终测量IO口的翻转结果如下。


十六宿舍 原创作品,转载必须标注原文链接。

©2023 Yang Li. All rights reserved.

欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/653880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝牙----蓝牙连接建立_连接建立

蓝牙----蓝牙连接建立_连接建立 蓝牙连接建立过程图1.主机扫描到广播包1.1判断是否是自己关心的广播包1.2广播地址添加到扫描列表 2.主机扫描结束,建立连接3.主从连接成功后,执行连接建立后事件3.1.主机将连接句柄和设备地址添加到连接列表3.2.主机进行G…

Docker 基础篇

目录 一、Docker 简介 1. Docker 2. Linux 容器 3. 传统虚拟机和容器的对比 4. Docker 的作用 5. Docker 的基本组成(Docker 三要素) 6. Docker 工作原理 7. Docker 架构 8. Docker 下载 二、Docker 安装 1. CentOS Docker 安装 2. CentOS8 …

贝锐蒲公英全新网页认证,保障企业访客无线网络安全

随着企业规模的不断扩大、人员的增长、无线终端数量/类型的增加,传统WiFi无线网络会暴露出越来越多的问题,导致无线网络管理困难。 比如:采用弱密码、安全防护不到位的默认设置、员工缺乏信息安全意识、未经授人员权访问无线网络…… 这些问…

SELINUX导致的网络服务问题解决

第一:开启相关服务,监控SELINUX 相关服务:setroubleshoot,auditd,大多数都是以se开头的 如果没有此服务,先yum下,然后查看状态 这里关于auditd说明,centos7不可以用systemctl重启auditd服务,…

深入了解Matplotlib中的子图创建方法

深入了解Matplotlib中的子图创建方法 一 add_axes( **kwargs):1.1 函数介绍1.2 示例一 创建第一张子图1.2 示例二 polar参数的运用1.3 示例三 创建多张子图 二 add_subplot(*args, **kwargs):2.1 函数介绍2.2 示例一 三 两种方法的区别3.1 参数形式3.2 布局灵活性3.3 适用场景3…

美化背景(拼图小游戏)

package Puzzlegame.com.wxj.ui;import javax.swing.*; import javax.swing.border.BevelBorder; import java.util.Random;public class GameJframe extends JFrame { //游戏主界面 //创建一个二维数组//目的:管理数据//加载图片的时候,会根据二维数组中…

ECRS软件:引领企业走向精益制造的未来

随着科技的快速发展和市场竞争的不断加剧,制造业正面临着前所未有的挑战和机遇。为了在激烈的市场竞争中立于不败之地,越来越多的企业开始寻求转型和升级,精益制造成为了一个备受关注的方向。而在这个过程中,ECRS软件以其独特的作…

【C++】对外接口封装以及导出动态链接库DLL

VS 使用C编写对外接口并封装成DLL 一、接口的封装二、VS设置三、查看生成的DLL接口 一、接口的封装 首先创建头文件,包含我们所依赖的库的头文件名称,并且申明我们要对外封装的接口名称,示例: 头文件: #pragma once …

CSAPP shelllab

CSAPP shell lab shell lab 的目标 实现shell 功能,包括解析命令,调用可执行文件和内置命令,(quit, jobs,fg, 和bg)。实现job控制和signal handler。 shell 介绍 Shell中的作业(job)管理是一种用于跟踪和控制正在运…

2023年:个人年度成长与团队协作成就

文章目录 个人职业发展的喜悦团队成就的辉煌公众号CSDN申请了移动安全领域新星创作者获得6月城市之星北京TOP 10获得23年博客之星TOP 41年度总结 知识星球 开拓新领域的决心免费知识大陆付费知识大陆 展望未来福利时间知识星球会员一年知识星球立减88券 在这个充满挑战与机遇的…

(2)(2.9) Holybro Microhard P900无线电遥测设备

文章目录 前言 1 特点 2 规格 3 包装内包括 前言 Holybro Microhard Radio 集成了 microhard Pico 系列射频模块,能够在强大的拓扑结构中提供高性能无线串行通信,如点对点、点对多点和安全 Mesh(P840 不提供 Mesh)。 它采用跳…

SQL注入的剩余类型

除了联合查询注入,报错注入,盲注注入 sql注入还有以下几类🦹🦹🦹🦹🦹 开始填坑 1.UA注入 原理:有些网站会把用户的UA信息写入数据库,用来收集和统计用户…

【技术分享】Ubuntu 20.04如何更改用户名

产品简介 本文适用于所有RK3568/RK3588平台产品在Ubuntu 20.04系统上如何更改用户名,本文以IDO-EVB3588开发板为例,在ubuntu20.04系统上修改用户名industio为usernew。 IDO-EVB3588开发板是一款基于RK3588平台的产品。该开发板集成了四核Cortex-A76和四…

扫描电子显微镜电子束辐射损伤和如何减轻

扫描电镜(Scanning Electron Microscope, SEM)是一种常用的材料表征技术,它通过聚焦电子束扫描样品表面,利用电子与样品相互作用产生的信号来获得高分辨率的形貌图像。然而,电子束的辐射可能会对样品造成损伤&#xff…

Qt6入门教程 13:QPushButton

目录 一.QPushButton 1.多选 2.互斥 3.设置菜单 4.图标按钮 4.1给按钮添加图标 4.2异形按钮 二.设置Qt样式表 一.QPushButton QPushButton是与QAbstractButton最接近的完全体按钮,它具备QAbstractButton的所有特性,并且支持设置菜单。 1.多选 …

2024幻兽帕鲁服务器,阿里云配置

阿里云幻兽帕鲁服务器Palworld服务器推荐4核16G配置,可以选择通用型g7实例或通用算力型u1实例,ECS通用型g7实例4核16G配置价格是502.32元一个月,算力型u1实例4核16G是432.0元/月,经济型e实例是共享型云服务器,价格是32…

docker容器运维命令

文章目录 docker psdocker execdocker inspectdocker topdocker attachdocker waitdocker exportdocker importdocker portdocker cpdocker diffdocker renamedocker statsdocker update总结 docker ps 列出容器。 docker ps [OPTIONS]OPTIONS说明: -a :显示所有的…

Python列表中的append功能及用法举例

Python列表中的append功能及用法举例 🌵文章目录🌵 🌳引言🌳🌳append()🌳🍀功能介绍🍀🍀语法🍀🍀示例🍀🍀注意事项&#x…

总结NB-IoT模块和单片机的区别

在学习了NB-IoT模块后,紧接着又学习了单片机系统,单片机和NB-IoT模块有什么不同之处呢,总结为以下几点。 大纲如图: 一、硬件层面 1、采用芯片不同, (1)封装:封装尺寸、方式不同&a…

网络原理,网络通信以及网络协议

​​​​💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录专栏:网络原理,网络通信以及网络协议 🎉欢迎大家点赞👍评论📝收藏⭐文章 文章目录 网络原理概念网络通信局域网LAN广域网WAN 网络通信IP地址端口号…