【MCAL】TC397+EB-tresos之MCU配置实战 - 芯片时钟

本篇文章介绍了在TC397平台使用EB-treso对MCU驱动模块进行配置的实战过程,主要介绍了后续基本每个外设模块都要涉及的芯片时钟部分,帮助读者了解TC397芯片的时钟树结构,在后续计算配置不同外设模块诸如通信速率,定时器周期等,都能有一个清晰的输入频率来源理解。

目录

概述

MCU配置 

General:McuGeneralConfiguration

General:McuModuleConfiguration

McuResetSettingConf 

McuTrapSettingConf

McuClockSettingConfig 

McuSystemPllSettingConfig 

McuPeripheralPllSettingConfig

McuPllDistributionSettingConfig

McuExternalClockOutputConfig

McuClockMonitorConfig 

McuModeSettingConf

McuDemEventParameter

McuRamSectorSettingConf

McuResetReasonConf

MCU驱动使用与调试


概述

当我们使用需要用到时钟的外设时,基本都需要对MCU驱动模块进行配置。驱动程序提供AUTOSAR指定的运行时服务接口。MCU驱动模块负责以下工作:

  • 完成AUTOSAR上层组件指定的时钟、复位和静态低功耗模式功能配置。
  • Trap功能的配置。
  • 配置 BASIC 驱动程序所涉及的GTM、CCU6 和GPT12的全局特性。
  • 为定时器IP的其他驱动程序提供库支持 - GTM、CCU6、GPT12和STM。
  • 模拟转换器所需的相位同步器配置。
  • 符合AUTOSAR规范的Runtime APIs,用于时钟、复位、低功耗管理和RAM初始化。
  • 用于Trap管理的Runtime APIs。

本文的参考资料见下表。

序号参考资料内容
1《MC-ISAR_TC3xx_UM_Mcu.pdf》英飞凌提供的针对TC3xx芯片MCAL配置用户手册
2《MC-ISAR_TC3xx_Config_Verification_Manual_Mcu.pdf》英飞凌提供的针对TC3xx芯片配置验证手册,介绍动态代码与配置项的对应
3《Infineon-AURIX_TC39x-UserManual-v02_00-EN》英飞凌提供的TC39x芯片用户手册

下图为MCAL驱动模块涉及的软硬件接口关系图。

本次配置主要描述MCU本身需要配置的功能(主要为系统时钟),牵扯到独立功能的诸如GTM部分我们会在单独介绍其功能时描述对应MCU需要完成的配置。MCAL针对不同的驱动模块的配置项根据功能进行了容器的划分,下面是后边配置涉及的容器。


MCU配置 

我们首先打开EB,导入Mcu与McalLib(McalLib里面的函数会贯穿整个MCAL)。本文只介绍MCU本身需要配置的部分。

本次配置的主要目标是完成芯片的时钟配置。板卡为英飞凌提供的KIT_A2G_TC397XA_TFT。涉及的软件包括:

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

需要注意的是MCU配置尤其是时钟这块儿的依赖项比较多,建议先使用MCAL EB-tresos Demo中的配置,需要特殊处理时钟分频系数或者某模块的时钟时,再单独修改,路径为:MC-ISAR_AS422_TC3xx_BASIC_2.20.0\DemoWorkspace\McalDemo\TC39B\1_ToolEnv\2_Tresos\AS422\DemoApp\config\Mcu.xdm。


General:McuGeneralConfiguration

下图为General配置界面,需要修改的一个配置选项如下。

  • McuSafetyEnable:因为我们的DEM没有对应的配置,所以我们需要关闭安全检查,否则报错生成动态代码会报错。

其余的选项根据功能开发需要选宏开关即可,我们这里直接采取默认的选项即可。需要着重理解的选项如下:

  • McuInitClock:Mcu_InitClock API可用,用作初始化芯片时钟。
  • McuMainOscillatorFrequency :外部部晶体或陶瓷谐振器频率为20Mhz。
  • McuOscillatorMode:芯片时钟源是外部晶体或陶瓷谐振器模式。


General:McuModuleConfiguration

这部分为MCU模式相关的通用配置,我们暂时不需要改动。


McuResetSettingConf 

此部分包含芯片复位的配置,这部分我们需要修改的配置如下。

  • McuSWResetConf ::软件复位选择导致的,有系统复位与应用复位,这里选择应用复位,应用复位后芯片的所有外设、CPU和部分SCU寄存器会回到初始状态,其他部分(如RAM,时钟)状态维持不变,影响范围比系统复位要小,也因此应用复位耗时最短。因为APP跳转Boot的是通过软件复位来实现的,为了保持编程标志位在RAM中的值,需要选择应用复位。
  • McuSTMxResetOnApplResetEnable :STM定时器的计数值会在清零,重新计数。


McuTrapSettingConf

这部分功能为各核心Trap使能相关配置,我们暂时不需要改动。


McuClockSettingConfig 

这里是Mcu时钟配置的容器,其中主要包含了以下一些容器。

时钟系统本身是由不同的构建块组成的时钟树,下面是几个构建块包含的内容。

  • Clock Source:时钟树源头,可以是外部晶振或者内部系统时钟。 
  • Clock speed up-scaling:时钟的缩放部分,主要由PLL(锁相环)构成。
  • Clock distribution:时钟分配,由CCU负责。
  • Individual clock configuration:单独的时钟配置,针对片内外设(Peripherals)。


McuSystemPllSettingConfig 

此容器包含系统锁相环的配置,主要完成对时钟源晶振频率的倍/分频,从而达到配置的频率。下图为系统PLL功能逻辑图。

需要注意的配置如下。

  • McuClockReferencePointFrequency0:系统时钟,它的计算公式为Fpll =( (Fosc * (McuNDivider + 1)) / ((McuK2Divider+1)*(McuPDivider+1)))。  


McuPeripheralPllSettingConfig

此容器包含外设PLL的配置,下图为对应的功能逻辑图。

这里我们主要关注下面的配置项。

  • McuClockReferencePointFrequency1 (dynamic range):外设时钟1,Fpll1 =( (Fosc * (McuNDivider + 1)) / ((McuK2Divider+1)*(McuPDivider+1)))
  • McuClockReferencePointFrequency2 (dynamic range):外设时钟2,Fpll2 =( (Fosc * (McuNDivider + 1)) / ((McuK3Divider+1)*(McuPDivider+1)))


McuPllDistributionSettingConfig

这个容器包含在时钟树内的各种片内外设时钟配置。 

这里需要我们首先注意的是以下的配置。

  • McuClockDistributionInpClockSel:将备用时钟或者PLLx选为时钟分配单元输入,这里选用的是PLLx。
  • McuLowPowerDivValue:这个参数定义了低功率分频特性是否启用。这里为不启用。

剩下的配置则对应了各个片内外设,我们用到哪里就需要关注那部分。


McuExternalClockOutputConfig

包含MCU外部时钟的配置参数,因为我们用的是外部晶振,这里就不涉及了。


McuClockMonitorConfig 

这个容器定义了TC3xx时钟监视的配置,这里我们不需要改动。


McuModeSettingConf

这个容器主要包含Mcu不同模式的配置集合。主要需要我们关注的为:

  • McuMode:当前配置集合为空闲模式的集合,用于正常的程序运行。1为睡眠模式,2为待机模式。


McuDemEventParameter

这是一个容器,用于引用 DemEventParameter元素,这些元素使用Dem_ReportErrorStatus() API,以防发生相应的错误。EventId 取自引用的DemEventParameter的DemEventId符号名称。容器中提供了标准化错误,并且可以通过特定于供应商的错误引用进行扩展。这部分我们不需要修改。


McuRamSectorSettingConf

此部分容器包含初始化设置一部分RAM区域,通过Mcu_InitRamSection()函数来实现,我们没有使用。


McuResetReasonConf

这里在配置完芯片类型,建立MCU模块,这部分重启原因配置就会生成了。用户可以通过Mcu_GetResetReason()获取重启原因。


MCU驱动使用与调试

MCU驱动使用主要涉及的是系统时钟的初始化,首先调用Mcu_Init()初始化MCU通用配置,然后调用Mcu_InitClock()初始化芯片的时钟部分,最后使用Mcu_GetPllStatus()获取PLL状态,相位锁定之后(频率稳定),表示初始化完成,调用Mcu_DistributePllClock()将PLL时钟作为MCU时钟的源头。代码实现如下。

	volatile Mcu_ClockType ClockID = 0;Mcu_Init(&Mcu_Config);Mcu_InitClock(ClockID);Mcu GetPllStatusRetVal=Mcu_GetPllStatus ();while (MCU_PLL_UNLOCKED == Mcu_GetPllStatus()){/* wait for PLL locked */}Mcu_DistributePllClock ();

工程准备好之后,编译生成.elf文件然后将PLS正确与开发板相连(JTAG接口),然后打开UDE,与PLS连接上之后下载程序到办卡上,在Mcu_DistributePllClock ()接口前设置断点,如果能跑到这句话能初步说明PLL锁相环生成系统成功是OK的。


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

©2023 Yang Li. All rights reserved.

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

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

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

相关文章

Unity UnityWebRequest 在Mac上使用报CommectionError

今天是想把前两天写的Demo拿到Mac上打个IPA的完事我发现 在运行时释放游戏资源的时候UnityWebRequest返回的结果不是Success 查看Log发现是 req.result 是CommectionError error是 Cannot connect to destination host 代码如下: UnityWebRequest req UnityWebRequ…

【vim 学习系列文章 3.1 -- vim 删除 ^M】

请阅读【嵌入式开发学习必备专栏 之 VIM 专栏】 文章目录 ^M 来源^M 删除 ^M 来源 在 Vim 中打开文件时,您可能会遇到行尾的 ^M 字符,这通常是因为文件使用了 Windows 风格的回车换行符(CRLF),而不是 Unix/Linux 风格…

image 标签的 width 和 height 有大作用!!!

image 标签的 width 和 height 有大作用!!! 我们将在这里探讨一个问题, 如果在加载图片之后不影响图片下边文字的移动. 在给出答案之前, 要知道 width 在 2019 年之后 有了更多能力. 也就是浏览器会根据 width 和 height 计算 aspect-ratio. 当然, 为了实现我们的目标, 提前知…

如何在 NAS 上安装 ONLYOFFICE 文档?

文章作者:ajun 导览 ONLYOFFICE 文档 是一款开源办公套件,其是包含文本文档、电子表格、演示文稿、表单、PDF 查看器和转换工具的协作性编辑工具。它高度兼容微软 Office 格式,包括 .docx、.xlsx 、.pptx 、pdf等文件格式,并支持…

OpenHarmony 应用通用签名

一.背景 由于hap包需要经过签名才能安装到设备上,在DevEco Studio可以进行自动签名,但是自动签名只能安装在当前的设备上,在其他设备上不能安装,所以我们需要进行通用的手动签名,手动签名HarmonyOS和OpenHarmony流程是…

elasticsearch 笔记二:搜索DSL 语法(搜索API、Query DSL)

文章目录 一、搜索 API1. 搜索 API 端点地址2. URI Search3. 查询结果说明5. 特殊的查询参数用法6. Request body Search6.1 query 元素定义查询6.2 指定返回哪些内容6.2.1 source filter 对_source 字段进行选择6.2.2 stored_fields 来指定返回哪些 stored 字段6.2.3 docValue…

scanf函数返回值占位符详解,%*,%[]的应用

前言 scanf函数可以说是我们一开始就会接触的函数了,但在最近复习时我又找到而来一些之前不甚了解或是块要遗忘的知识,特作此篇。 一.返回值 我们之前提到了scanf返回值被忽略的问题: scanf函数返回值被忽略-CSDN博客 那么scanf的返回值…

分布式系统架构设计之分布式系统实践案例和未来展望

分布式系统在过去的几十年里经历了长足的发展,从最初的简单分布式架构到今天的微服务、云原生等先进架构,取得了丰硕的成果。本文将通过实际案例分享分布式系统的架构实践,并展望未来可能的发展方向。 一、实践案例 1、微服务化实践 背景 …

tcp/ip实现两个手机之间连接同步显示

app主界面 选择一:TCP客户端 选择二:TCP服务端 点击下图item时进入曲线绘制页面 如果是服务器端它不需要连任何设备就可以直接进入绘制界面如果是TCP的话就不能直接进入,否则就会提示未连接网络连接不能放在主线程,页面去调方法&…

IP地址的四大类型:动态IP、固定IP、实体IP、虚拟IP的区别与应用

在网络通信中,IP地址是设备在互联网上唯一标识的关键元素。动态IP、固定IP、实体IP和虚拟IP是四种不同类型的IP地址,它们各自具有独特的特点和应用场景。 1. 动态IP地址: 动态IP地址是由Internet Service Provider(ISP&#xff…

Python跨年烟花秀

写在前面 今年跨年怎么过呢~博主用python的pygame实现了一场炫酷的烟花秀,一起来看看吧! 环境需求 python3.11.4及以上PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境…

STM32CubeMX学习(二) USB CDC 双向通信

STM32CubeMX学习(二) USB CDC 双向通信 简介CubeMX新建工程(串口LED)测试串口和LED串口接收测试USB CDC通信 简介 利用正点原子F407探索者开发板,测试基于USB CDC的双向数据通信。 CubeMX新建工程(串口LE…

Prometheus通过consul实现自动服务发现

环境,软件准备 本次演示环境,我是在虚拟机上安装 Linux 系统来执行操作,以下是安装的软件及版本: System: CentOS Linux release 7.6Docker: 24.0.5Prometheus: v2.37.6Consul: 1.6.1 注意:这里为了方便启动 Prometheus、Consul服…

Vue Tinymce富文本组件自定义带下拉框的操作按钮

想实现如下效果 首先在init方法中的props,toolbar属性增加一个自定义按钮 增加一个setup方法 代码 setup: function(editor) { editor.ui.registry.addSplitButton(myDateButton, {text: 日期时间,onAction: (_) > editor.insertContent(getJsMonthDay(getNowDat…

Spring 是如何解决循环依赖的

1.什么是循环依赖? 所谓的循环依赖是指,A 依赖 B,B 又依赖 A,它们之间形成了循环依赖。或者是 A 依赖 B,B 依赖 C,C 又依赖 A。它们之间的依赖关系如下: 2.通过手写代码演示理解Spring循环依赖 DEMO: pu…

【机器学习】深度学习概论(二)

五、受限玻尔兹曼机(Restricted Boltzmann Machine,RBM) 5.1 RBM介绍 示例代码: Python 编写了一个简单的 RBM 实现,并用一些假数据训练了它。然后,他展示了如何用 RBM 来解释用户的电影偏好,以…

使用rust读取usb设备ACR122U的nfc卡片id

rust及其高效和安全著称,而且支持跨平台,所以就想使用这个rust开发一个桌面端程序,来读取nfc设备的nfc卡片的id信息,下面就做一个最简单的入门教程吧,也是我写的第三个rust应用。 当你电脑上安装好了rust环境之后&…

MySql篇——MySql使用常见问题及解决办法

这里汇总MySql使用常见问题及解决办法,会持续更新。 问题1.ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。 含义:你设置的密码不符合当前的密码等级。 可使用 SHOW VARIABLES LIKE validate_password%; 查看…

Spring-4-代理

前面提到过,在Spring中有两种类型的代理:使用JDK Proxy类创建的JDK代理以及使用CGLIB Enhancer类创建的基于CGLIB的代理。 你可能想知道这两种代理之间有什么区别,以及为什么 Spring需要两种代理类型。 在本节中,将详细研究代理…

count distinct在spark中的运行机制

文章目录 预备 数据和执行语句Expand第一次HashAggregateShuffle and Second HashAggregate最后结果性能原文 预备 数据和执行语句 SELECT COUNT(*), SUM(items), COUNT(DISTINCT product), COUNT(DISTINCT category) FROM orders;假设源数据分布在两个1核的结点上&#xff0…