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

本文详细介绍了在TC397平台如何使用EB-treso工具对MCU驱动模块进行时钟配置,包括系统时钟设置、PLL配置和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。涉及的软件包括:

需要注意的是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.

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

<think>好的,我现在需要帮助用户了解Infineon TC397处理器的时钟配置与管理相关的问题。首先,我需要回顾一下用户提供的引用内容,特别是引用[1]、[2]、[4]中提到的信息。用户提到了TC397时钟复杂性,可能涉及到系统时钟、ADC时钟、同步/异步模式以及FreeRTOS的移植相关内容。 首先,根据引用[1],TC397是一款高性能汽车级微控制器,适用于复杂的实时应用,如自动驾驶。这意味着其时钟系统需要高度可靠和精确,以满足实时性和计算能力的要求。引用[2]详细说明了AdcSyncClockDisable和AdcSystemClock参数,涉及到ADC模块的时钟配置,特别是同步/异步模式下的时钟生成和系统时钟的作用。引用[4]提到了SPI配置中的同步/异步模式以及中断处理,这可能与时钟同步有关。 接下来,我需要整理TC397时钟系统的关键组成部分。通常,微控制器的时钟系统包括时钟源(如外部晶体振荡器、内部RC振荡器)、时钟分配网络(分频器、倍频器)、各个外设的时钟控制等。TC397可能具有多个时钟域,例如CPU时钟、外设时钟、ADC时钟等,这些时钟需要协调工作以避免冲突或时序问题。 根据引用[2],AdcSystemClock是MCU驱动程序配置的系统时钟,用于ADC模块的定时器触发。这说明ADC模块的时钟依赖于系统时钟,并且可能存在同步或异步模式的选择。AdcSyncClockDisable参数决定了模拟时钟是否在同步模式下生成,这可能会影响ADC的转换精度和速度,特别是在多模块协同工作时需要同步时钟。 另外,引用[4]中提到的SPI同步/异步配置可能涉及到时钟信号的同步问题,例如SPI通信的主从设备时钟同步,以及中断触发的时序问题。时钟配置不当可能导致数据传输错误或中断响应延迟。 用户的问题可能集中在如何正确配置这些时钟源,处理多时钟域之间的协调,以及解决同步/异步模式下的潜在问题。例如,如何设置系统时钟的分频系数,如何确保ADC模块在同步模式下与系统时钟同步,如何处理不同外设时钟之间的冲突等。 此外,还需要考虑实时操作系统(如FreeRTOS,引用[3])对时钟的需求,例如系统节拍定时器的配置,任务调度与时钟中断的关系,这可能影响系统的实时性能。 可能的复杂性包括时钟配置的复杂性,不同模块时钟需求的冲突,低功耗模式下时钟的动态调整,以及时钟故障检测与恢复机制。例如,在汽车应用中,可能需要时钟冗余或故障切换机制,以确保在时钟源故障时系统仍能安全运行。 总结来说,回答需要涵盖TC397时钟系统的结构、关键配置参数(如系统时钟、外设时钟)、同步/异步模式的影响、时钟配置的步骤和常见问题,以及相关的调试和优化方法。需要结合用户提供的引用内容,特别是ADC和SPI相关的时钟配置实例,来具体说明如何管理时钟复杂性。</think>### TC397处理器时钟配置与管理的复杂性分析 TC397时钟系统设计复杂,主要因其多核架构、实时性需求及外设多样性。以下是关键要点及配置逻辑: #### 1. **时钟源与分配机制** - **多级时钟源**:TC397支持外部晶振(4-40MHz)、内部快速RC振荡器(FRC)和备份时钟(Backup Clock),需通过`SCU_CLKCR`寄存器选择主时钟源[^1]。 - **分频/倍频控制**:通过`CCU`(Clock Control Unit)实现,例如: $$ \text{CPU时钟} = \frac{\text{PLL输出}}{CCU\_DIV\_CFG[CCUDIV]} $$ 需确保分频系数不超过模块最大频率限制。 #### 2. **外设时钟同步问题** - **ADC时钟同步**: 引用[^2]指出`AdcSyncClockDisable`参数控制ADC模拟时钟的同步模式。**同步模式**下,ADC时钟与系统时钟相位对齐,避免采样抖动;**异步模式**则可能引入±1ns的时间偏差,需通过校准补偿。 ```c // 配置ADC同步时钟示例(EB-tresos) AdcConfigSet.SyncClockMode = ADC_SYNC_CLOCK_ENABLED; ``` - **SPI时钟模式冲突**: 引用[^4]提到SPI主从设备需时钟极性(CPOL)和相位(CPHA)匹配。异步传输时,若主从时钟源不同步,需启用`SPI_CR.SLSOFF`(从选择延迟)避免数据竞争。 #### 3. **多核时钟域协调** - **核心间时钟独立性**:每个TriCore核心可独立设置时钟分频(通过`CCU_CONSTOP`寄存器),但共享外设(如CAN、Eth)需统一时钟源,否则会导致通信异常。 - **实时操作系统影响**: 如FreeRTOS的SysTick需与核心时钟一致,若配置为异步时钟源(如FRC),可能导致任务调度时间漂移[^3]。 #### 4. **低功耗模式切换** - **时钟动态切换**:在`Sleep`模式下,需关闭非必要时钟(如`SCU_PMCSR[CLKSEL]`切换至备份时钟),但唤醒后需重新同步PLL,耗时约100μs,可能影响实时性。 #### 5. **常见问题与调试** - **故障案例**: - **ADC采样偏移**:异步模式下未校准时钟偏差,导致采样值波动,需启用`AdcGlobalSync`功能[^2]。 - **SPI数据错位**:主从设备CPOL/CPHA配置不一致,需检查`SPI_GLOBAL_CONFIG.ClockSettings`。 - **调试工具**: 使用`AURIX Development Studio`的时钟树可视化工具,可实时监控各模块时钟频率及状态。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值