摘要:本文简要介绍S32K3xx系列芯片的时钟树,EB时钟配置
关键词:车载嵌入式芯片应用
一、前言:
对于任何一款MCU芯片的学习,首先要做的应该是了解这款芯片的时钟树配置,因为芯片上所有的外设必须在具备时钟的前提下才能工作,这篇文章主要分享一下我对S32K3系列芯片的时钟树的理解,同时介绍一下如何通过EB工具来配置时钟。
EB工具熟练使用后可大大提高软件的开发效率,使用方便,但对于新手而言也是有利有弊,有利方面则是可以按照官方的历程进行界面的配置,很多配置虽然无法理解,但是按照历程配置完全一样即可,这样生成的驱动代码也可正常运行,可快速上手项目的开发。弊端则是不能很好的理解芯片内部寄存器的配置以及运行原理,当出现调试问题时无法快速的定位和解决。因此在学习的过程中建议大家尝试手撕代码,手写配置MCU寄存器,在这个过程中会大大提升自身的技术,不过项目中尽量还是采用EB生产的代码,因为手写代码往往存在风险,没有EB生成的代码稳定。不过经过手撕代码的过程后,在反回来使用EB工具,会发现EB工具的使用是真的容易,很多不理解的配置也会变得通透。这篇文章主要介绍EB配置的时钟树,关于手写的配置代码在后续的分享中展现。
二、时钟树:
关于S32K3XX系列的时钟树,可借助S32DS工具来查看,打开任意一个官方历程即可,随后点击配置工具-时钟,如下所示:
随后进入如下界面:
1、时钟源
首先要时钟源有哪些,从图中可以看出时钟源有一下几种:
(1) SIRC:内部低速时钟源 32K
(2) FIRC:内部高速时钟源 48M
(3) SXOSC:外部低速时钟源 32k
(4) FXOSC: 外部高速时钟源 16M
(5) EXTERNAL CLOCLS:以太网外部时钟源 100M以太网通常使用25M的时钟源
2、七大时钟
时钟由时钟源产生,经过时钟选择器和使用分频器生成七大时钟,而这七大时钟则是为ARM内核以及相关外设提供时钟来源,因此在时钟配置过程中,需要配置相应的时钟选择器和分频器,从而生成这七大时钟。
(1) CORE CLK:用于内核与部分外设
(2) AIPS_PLAT_CLK:用于MCU外设 例如UART0
(3) AIPS_SLOW_CLK:用于MCU外设 例如SPI、UART等
(4) HSE CLK: S32K3xx系列独有的硬件引擎,后续可展开介绍
(5) DCM CLK:DTCM空间
(6) LBIST_CLK:暂时没有用过该部分功能
(7) QSPI_MEM_CLK :用于QSPI外设
3、外设时钟配置步骤
下面以UART1外设的时钟配置为例,展开说明时钟树的配置过程,步骤如下所示:
(1) 时钟源选择
MCU上电后会默认选择FIRC时钟源,但在项目中通过使用外部时钟源,即选择FXOSC = 16M,时钟源的选择通过MC_ME寄存器配置,关于MC_ME的使用在后续介绍。
(2) PLL时钟配置
通过时钟树可以看到,FXOSC=16M,可以通过PLL倍频到960M,随后再经过分频得到PLL_PHI0和PLL_PHI1,大小可配置为160M。
(3) 时钟选择器配置
选择PLL_PHI0
(4) 分频器配置
将PLL_PHI0再次分频得到七大时钟,其中AIPS_SLOW_CLK=40M,由上图可知,UART1外设挂在AIPS_SLOW_CLK时钟下,因此UART1的外设时钟来源为40M。
(5) MC_ME配置
MC_ME类似一个开关,默认是关闭的,需要开启UART1外设时,需要在MC_ME寄存器中开启。
(6) UART1波特率
外设时钟来源为40M,此时经过UART外设模块内部寄存器的再次分频,可将40M时钟再次分频,最后得到UART的波特率。
三 EB配置时钟:
本文章主要介绍在NXP S32K3平台中,利用EB软件进行时钟树的配置。过程中以16M外部晶振作为时钟源输入,得到PLL后再以PLL为时钟源,得到AIPS_PLAT_CLK、AIPS_SLOW_CLK等时钟供各外设使用。
1、首先打开Mcu模块选项卡,时钟配置都在此选项卡中
2、进入General选项卡,打勾Post Build Variant Used,并把Config Variant选择为VariantPreCompile.
3、在McuControlledClocksConfiguration中,将所有时钟均选择有MCU控制:
4、在McuModuleConfiguration中配置输入时钟源。根据板子上的晶振实际规格,填写各参数External Crystal Frequency、External Slow Crystal Frequency。其中Mcu Number of Mode Settings、Mcu Number of RAM Sectors等均可点击最右侧计算器型按钮根据工程中配置自动计算。
2、时钟树配置
1、进入McuClockSettingConfig选项卡中。创建一个新的时钟配置项
双击Index下的编号即可进入改时钟配置项。
2、根据实际需求配置McuFIRC、McuSIRC、McuFXOSC、McuSXOSC
3、进入McuPLL选项卡进行PLL配置。将PLL under MCU control、PLL Enabled 打勾,以使能PLL功能。
4、根据实际需求选择McuPll_Configuration中的各参数,16M晶振可如下图所示进行配置,并将PHI0 Divider enable打勾。
5、完成步骤四后,即可在McuPll_Parameter中直接点击计算器按钮,自动计算各参数并写入。此时PLL_PHI0设置为160Mhz
6、返回McuClockSettingConfig_0界面,选择McuCgm0PcsConfig选项卡。添加一个McuCgm0PcsConfig配置项,配置如下
7、进入McuCgm0ClockMux0开始配置其余时钟,供各外设使用。选择CGM0 Clock Mux0 Source为PLL时钟(PLL_PHI0_CLK)。设置好分频系数后点击自动计算按钮
直接计算出其时钟频率即可。需要注意的是得到的各时钟频率必须符合手册要求。
8、进入McuClockReferencePoint选项卡,在这里添加外设要使用的时钟参考点,外设有用到时钟参考点就配置,没有可不管。各外设所使用的时钟需要参考手册中描述根据需求自行配置。在后续的外设配置中会要求用户选择其时钟源。
9、时钟配置完成,回到Mcu主界面,在McuModeSettingConf选项卡下新增一个配置,双击进入,模式设置为RUN即可。
10、使能各分区时钟,不同的外设挂在在不同的分区时钟下,可以清晰的在McuPeripheral下看到。由于后续都会用到,可直接打开所有分区,配置如下
11、在McuPeripheral中根据需求使能各外设时钟,在Peripheral Clock Enable中打勾即可。
后续只需生产代码即可,注意还需要将相关的静态代码添加到工程中,搭建一个完成的工程才能用于调试,有关工程如何搭建就不在这里介绍了,感兴趣的朋友可以关注我后续的分享。