关于tresos Studio(EB)的MCAL配置之GPT

news2025/3/9 17:21:58

概念

GPT,全称General Purpose Timer,就是个通用定时器,取的名字奇怪了点。定时器是一定要的,要么提供给BSW去使用,要么提供给OS去使用。

配置

General

GptDeinitApi控制接口Gpt_DeInit是否启用

GptEnableDisableNotificationApi控制接口Gpt_EnableNotification和Gpt_DisableNotification是否启用。

GptTimeElapsedApi控制接口Gpt_GetTimeElapsed是否启用

GptTimeRemainingApi控制接口Gpt_GetTimeRemaining是否启用

GptTimeElapsedApi控制接口Gpt_GetTimeElapsed是否启用

GptTimeRemainingApi控制接口Gpt_GetTimeRemaining是否启用

GptVersionInfoApi控制接口Gpt_GetVersionInfo是否启用

GptWakeupFunctionalityApi控制唤醒相关功能接口接口Gpt_SetMode, Gpt_EnableWakeup,Gpt_DisableWakeup和Gpt_Cbk_CheckWakeup()是否启用。

这里介绍一下定时器唤醒机制:如果硬件支持并启用,内部硬件计时器可以作为唤醒源,如果一个通道作为唤醒源,就不能用来做其他的用途。

GptDevErrorDetect开发者错误检测是PORT_DEV_ERROR_DETECT宏定义的开关,新人可以勾选,它能帮你检查出一些开发阶段的错误。老手一般不打开,因为会影响到代码的执行效率。

GptReportWakeupSource控制唤醒源报告是否启用

GptEnableDualClockMode在模式转换时启用预分频器设置,一般用不上。

GptEnablePit64启用pit 64位功能,PIT就是Periodic Interrupt Timer周期中断定时器,PIT64就是一个大点的PIT计时器,能容纳更大的tick数据,因为芯片只有32位,所以分开高32位和低32位传回来。

 

GptClockReferencePoint

这里就是在GPT模块里面创建个时钟引用,本身不创建任何东西,只是把MCU模块里面配置的时钟引用过来,作为一个基准时钟,给到GptChannelConfigSet里面的定时器去用。

GptChannelConfigSet

GptChannelConfiguration里面的才是主要的配置,每个容器就是一个通用定时器。

 

GptChannelId自己排序的号

GptHwChannel物理通用定时器通道,可以选STM(System Timer Module系统时钟模块)/GTM(Generic Timer Module通用定时器模块)/PIT(Periodic Interrupt Timer周期中断定时器)之类的。

 

  • STM(系统时钟模块):适用于系统级任务,如系统心跳或任务调度,通常与系统时钟直接相关。
  • GTM(通用定时器模块):适合需要多种功能的场景,如PWM生成、输入捕捉和比较输出,灵活性高。
  • PIT(周期中断定时器):专为生成周期性中断设计,适合需要定期执行任务的情况。

GptChannelMode定时器超时之后的行为,也就是连续计时还是一次性计时。

GptChannelTickFrequency指定定时器的频率,单位为Hz。最大不能大于下面引用的GptClockReferencePoint引用的MCU时钟,下面称为“引用的MCU时钟”。

对于STM,引用的MCU时钟除以定时器频率小于等于256。

对于RTC,引用的MCU时钟除以定时器频率只能是32或512或16384。

其他通道改这个配置值是不起作用的。

GptFreezeEnable勾选之后不能在代码运行的时候修改硬件通道。

GptEnableWakeup使能通道唤醒功能

GptNotification通用定时器的回调函数,这个函数要自己实现,动态代码只会生成个定义,不会实现出来。

GptChannelClkSrcRef选择GptClockReferencePoint里面的引用,这个引用后面会再引用到MCU的时钟源。具体GPT的时钟基础就是引用的MCU频率,在Gpt_StartTimer接口里面设置超时时间,到达超时时间就会调用回调函数。

GptWakeupSourceRef唤醒源,从ECU状态管理器里面获取。

GptDisableEcumWakeupSourceNotification通过调用EcuM_CheckWakeup接口启用/禁用EcuM通知

静态代码

Gpt_CheckWakeup检查支持唤醒的GPT通道是否是唤醒事件的源,并调用ECU状态管理器服务EcuM_SetWakeupEvent,用于有效的GPT通道唤醒事件。在调用Gpt_Cbk_CheckWakeup之前,需要初始化驱动程序。

Gpt_DeInit逆初始化接口,根据硬件通道是STM/PIT/GTM/PIT1类型来操作对应的寄存器。譬如硬件通道是STM类型的,就操作STM_CR寄存器失能定时器、分频数设置为0,操作STM_CCR寄存器失能STM通道里面跟定时器相关的配置,操作STM_CMP寄存器将比较器里面的值清零,操作STM_CIR寄存器清除中断标志位。最后,无论是什么类型的硬件通道,都会把通道状态进行重置,模式设置为普通,回调函数指针清空。

Gpt_DisableWakeup禁用单个GPT通道的唤醒中断调用。实际上就是调用Gpt_LLD_DisableWakeup接口,根据硬件通道类型去失能对应通道的中断,入参是物理通道ID,需要在动态代码里面复制。

Gpt_EnableNotification开启单个GPT通道的唤醒中断调用,操作Gpt_DisableWakeup相反。

Gpt_GetTimeElapsed获取从开始计时或重新开始计时到现在的tick,实际上是调用Gpt_LLD_GetTimeElapsed接口获取当前tick返回。

Gpt_GetTimeRemaining获取现在到超时之间的tick,实际上是调用Gpt_LLD_GetTimeRemaining接口获取当前tick和超时tick进行相减后返回。

Gpt_GetVersionInfo获取版本信息,需要传入一个Std_VersionInfoType类型的结构体指针,接口会把版本信息赋值到传入的结构体里面。

Gpt_Init初始化的时候需要调用,入参是Gpt_ConfigType类型的结构体指针,接口会把入参的结构体或者Gpt_InitConfigPC结构体里面的内容赋值给全局结构体Gpt_Cfg_Ptr,这个结构体会在Gpt_LLD_SetSleepMode等GPT相关的操作函数里面使用到。

Gpt_SetMode设置GPT的模式,只有GPT_MODE_NORMAL和GPT_MODE_SLEEP可以选。如果是GPT_MODE_NORMAL,调用Gpt_LLD_SetNormalMode接口,有回调函数就使能回调函数,使能定时器。如果是GPT_MODE_SLEEP,调用Gpt_LLD_SetSleepMode,停止定时器并失能,有回调函数失能回调函数。并且在执行过程中调用Gpt_Schm_ProtectResource和Gpt_Schm_UnprotectResource保护GPT的执行。

Gpt_StartTimer启动定时器,入参为GPT通道和超时值,单位为tick。先调用Gpt_LLD_CheckStartTimeoutValue检查超时值是否合理,再调用Gpt_LLD_StartTimer开始计时。并且在执行过程中调用Gpt_Schm_ProtectResource和Gpt_Schm_UnprotectResource保护GPT的执行。

Gpt_StopTimer停止定时器,调用Gpt_LLD_StopTimer暂停计时。并且在执行过程中调用Gpt_Schm_ProtectResource和Gpt_Schm_UnprotectResource保护GPT的执行。

Gpt_DisableNotification失能定时器函数回调机制。

Gpt_DisableNotification_Pit64失能Pit64的回调机制,其实就是清除PIT1_TCTRL寄存器。并且在执行过程中调用Gpt_Schm_ProtectResource和Gpt_Schm_UnprotectResource保护GPT的执行。

介绍到这里,需要注意一件事情,就是启动定时器之前,如果有回调函数,就要先使能回调机制。暂停定时器的时候,如果有回调函数,就要失能回调机制,放在暂停定时器的前还是后都可以。

Gpt_EnableNotification_Pit64使能Pit64的回调机制

Gpt_EnableWakeup_Pit64使能PIT64的唤醒功能

Gpt_GetTimeElapsed_Pit64获取PIT64从开始计时或重新开始计时到现在的tick

Gpt_GetTimeRemaining_Pit64获取PIT64计时器离超时还有多久的tick

Gpt_StartTimer_Pit64启动PIT64计时器

Gpt_StopTimer_Pit64暂停PIT64计时器

动态代码

GPT_GTM_TOMx_CH_y_ISR_USED,其中x和y都是可变的数字,当你选择的GPT通道为GTM的,就会出现这类定义,这类定义会将动态代码里面的ISR(Gpt_TOM_x_CHy_CHz_ISR);接口编译进来,其中xyz都是可变数字。其实就是开启一个TOM的中断,并且把该接口实现,该接口本质上就是调用Gpt_Gtm_LLD_ProcessInterrupt接口执行产生中断时候的动作,譬如重载、调用回调函数之类的。

其他的GTM和STM、PIT也类似。

Gpt_InitChannelPC_1数组里面有每一个GPT的初始配置信息,用来给Gpt_Init初始化的。

 

 

 

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

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

相关文章

Uniapp项目运行到微信小程序、H5、APP等多个平台教程

摘要:Uniapp作为一款基于Vue.js的跨平台开发框架,支持“一次开发,多端部署”。本文将手把手教你如何将Uniapp项目运行到微信小程序、H5、APP等多个平台,并解析常见问题。 一、环境准备 在开始前,请确保已安装以下工具…

C/C++蓝桥杯算法真题打卡(Day4)

一、P11041 [蓝桥杯 2024 省 Java B] 报数游戏 - 洛谷 算法代码&#xff1a; #include<bits/stdc.h> using namespace std;// 计算第 n 个满足条件的数 long long findNthNumber(long long n) {long long low 1, high 1e18; // 二分查找范围while (low < high) {lo…

C++编写Redis客户端

目录 安装redis-plus-plus库 ​编辑 编译Credis客户端 redis的通用命令使用 get/set exists del keys expire /ttl type string类型核心操作 set和get set带有超时时间 set带有NX string带有XX mset mget getrange和setrange incr和decr list类型核心操作…

记录一下Django的密码重置(忘记密码)

一. Django默认的密码重置 1.路由 # url.pyfrom django.contrib.auth import views as auth_viewsurlpatterns [# 密码重置path(password_reset/, auth_views.PasswordResetView.as_view(), namepassword_reset),# 用户输入邮箱后&#xff0c;跳转到此页面path(password_res…

【运维篇】KubeSphere-02(经验汇总)

一、使用建议 1.对于数据库、对像存储比较重的要不能丢失&#xff0c;有异地存储备份需求的有状态服务&#xff0c;不建议采用k8s进行部署&#xff0c;会导致运维难度更大。 2.对于中间件如redis、MQ、harbor、seata、nacos、zookeeper可采用k8s部署。 3.对于无状态服务tomc…

Qt:多线程

目录 初识Qt多线程 QThread常用API QThread的使用 Qt中的锁 条件变量和信号量 初识Qt多线程 Qt 多线程 和 Linux 中的线程本质是一个东西 Linux 中学过的 多线程 APl&#xff0c;Linux 系统提供的 pthread 库 Qt 中针对系统提供的线程 API 重新封装了 C11 中&#xff0c;…

算法系列之广度优先搜索解决妖怪和尚过河问题

在算法学习中&#xff0c;广度优先搜索&#xff08;BFS&#xff09;是一种常用的图搜索算法&#xff0c;适用于解决最短路径问题、状态转换问题等。本文将介绍如何利用广度优先搜索解决经典的“妖怪和尚过河问题”。 问题描述 有三个妖怪和三个和尚需要过河。他们只有一条小船…

详解常用集合和映射中的线程安全问题

1. 前言 在 Java 中&#xff0c;集合和映射是常用的数据结构&#xff0c;它们分为线程安全和线程不安全两类。我们常用的集合包括&#xff1a;ArrayList、HashSet、CopyOnWriteArrayList、CopyOnWriteArraySet。常用的映射包括&#xff1a;HashMap、ConcurrentHashMap、Hashta…

计算机毕业设计SpringBoot+Vue.js车辆管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【js逆向】iwencai国内某金融网站实战

地址&#xff1a;aHR0cHM6Ly93d3cuaXdlbmNhaS5jb20vdW5pZmllZHdhcC9ob21lL2luZGV4 在搜索框中随便输入关键词 查看请求标头&#xff0c;请求头中有一个特殊的 Hexin-V,它是加密过的&#xff1b;响应数据包中全是明文。搞清楚Hexin-V的值是怎么生成的&#xff0c;这个值和cooki…

【音视频 | AAC】AAC编码库faac介绍、使用步骤、例子代码

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

Unity摄像机跟随物体

功能描述 实现摄像机跟随物体&#xff0c;并使物体始终保持在画面中心位置。 实现步骤 创建脚本&#xff1a;在Unity中创建一个新的C#脚本&#xff0c;命名为CameraFollow。 代码如下&#xff1a; using UnityEngine;public class CameraFollow : MonoBehaviour {public Tran…

dp_走方格(包含dfs分析,记忆化搜索)

类似题目解析&#xff1a;dp_最长上升子序列&#xff08;包含dfs分析&#xff0c;记忆化搜索&#xff09;-CSDN博客 题目链接&#xff1a;2067. 走方格 - AcWing题库 题目图片&#xff1a; 分析题目&#xff08;dfs&#xff09; 这个题目说有一个行为n行&#xff0c;列为m列…

如何用Kimi生成PPT?秒出PPT更高效!

做PPT是不是总是让你头疼&#xff1f;&#x1f629; 快速制作出专业的PPT&#xff0c;今天我们要推荐两款超级好用的AI工具——Kimi 和 秒出PPT&#xff01;我们来看看哪一款更适合你吧&#xff01;&#x1f680; &#x1f947; Kimi&#xff1a;让PPT制作更轻松 Kimi的生成效…

K8S学习之基础十八:k8s的灰度发布和金丝雀部署

灰度发布 逐步扩大新版本的发布范围&#xff0c;从少量用户逐步扩展到全体用户。 特点是分阶段发布、持续监控、逐步扩展 适合需要逐步验证和降低风险的更新 金丝雀部署 将新版本先部署到一小部分用户或服务器&#xff0c;观察其表现&#xff0c;再决定是否全面推广。 特点&…

Java 深度复制对象:从基础到实战

目录 一、深度复制的概念二、实现深度复制的方法1. 使用序列化2. 手动实现深度复制 三、总结 在 Java 编程中&#xff0c;对象的复制是一个常见的需求。然而&#xff0c;简单的复制操作&#xff08;如直接赋值&#xff09;只会复制对象的引用&#xff0c;而不是创建一个新的对象…

【前端】webstorm创建一个导航页面:HTML、CSS 和 JavaScript 的结合

文章目录 前言一、项目结构二、HTML 结构三、CSS 样式四、JavaScript 功能五、现代化风格优化htmlcssjavascript运行效果 总结 前言 在现代网页开发中&#xff0c;一个良好的导航栏是提升用户体验的重要组成部分。在这篇文章中&#xff0c;我将向您展示如何创建一个简单而完整…

AI编程: 一个案例对比CPU和GPU在深度学习方面的性能差异

背景 字节跳动正式发布中国首个AI原生集成开发环境工具&#xff08;AI IDE&#xff09;——AI编程工具Trae国内版。 该工具模型搭载doubao-1.5-pro&#xff0c;支持切换满血版DeepSeek R1&V3&#xff0c; 可以帮助各阶段开发者与AI流畅协作&#xff0c;更快、更高质量地完…

第11章 web应用程序安全(网络安全防御实战--蓝军武器库)

网络安全防御实战--蓝军武器库是2020年出版的&#xff0c;已经过去3年时间了&#xff0c;最近利用闲暇时间&#xff0c;抓紧吸收&#xff0c;总的来说&#xff0c;第11章开始学习利用web应用程序安全&#xff0c;主要讲信息收集、dns以及burpsuite&#xff0c;现在的资产测绘也…

GitHub上传项目

总结&#xff08;有基础的话直接执行这几步&#xff0c;就不需要再往下看了&#xff09;&#xff1a; git init 修改git的config文件&#xff1a;添加:[user]:name你的github用户名 email你注册github的用户名 git branch -m master main git remote add origin 你的URL gi…