本篇文章介绍了在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驱动模块负责以下工作:
本文的参考资料见下表。
序号 | 参考资料 | 内容 |
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针对不同的驱动模块的配置项根据功能进行了容器的划分,下面是后边配置涉及的容器。
我们首先打开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配置界面,需要修改的一个配置选项如下。
其余的选项根据功能开发需要选宏开关即可,我们这里直接采取默认的选项即可。需要着重理解的选项如下:
这部分为MCU模式相关的通用配置,我们暂时不需要改动。
此部分包含芯片复位的配置,这部分我们需要修改的配置如下。
这部分功能为各核心Trap使能相关配置,我们暂时不需要改动。
这里是Mcu时钟配置的容器,其中主要包含了以下一些容器。
时钟系统本身是由不同的构建块组成的时钟树,下面是几个构建块包含的内容。
此容器包含系统锁相环的配置,主要完成对时钟源晶振频率的倍/分频,从而达到配置的频率。下图为系统PLL功能逻辑图。
需要注意的配置如下。
此容器包含外设PLL的配置,下图为对应的功能逻辑图。
这里我们主要关注下面的配置项。
这个容器包含在时钟树内的各种片内外设时钟配置。
这里需要我们首先注意的是以下的配置。
剩下的配置则对应了各个片内外设,我们用到哪里就需要关注那部分。
包含MCU外部时钟的配置参数,因为我们用的是外部晶振,这里就不涉及了。
这个容器定义了TC3xx时钟监视的配置,这里我们不需要改动。
这个容器主要包含Mcu不同模式的配置集合。主要需要我们关注的为:
这是一个容器,用于引用 DemEventParameter元素,这些元素使用Dem_ReportErrorStatus() API,以防发生相应的错误。EventId 取自引用的DemEventParameter的DemEventId符号名称。容器中提供了标准化错误,并且可以通过特定于供应商的错误引用进行扩展。这部分我们不需要修改。
此部分容器包含初始化设置一部分RAM区域,通过Mcu_InitRamSection()函数来实现,我们没有使用。
这里在配置完芯片类型,建立MCU模块,这部分重启原因配置就会生成了。用户可以通过Mcu_GetResetReason()获取重启原因。
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.
欢迎关注 『十六宿舍』,大家喜欢的话,给个,更多关于嵌入式相关技术的内容持续更新中。