时钟和时钟控制单元CCU1 功能及原理分析1.1 TC23x时钟架构解析核心构建模块Clock Source 基础时钟源外部晶振/内部RC振荡器Clock Speed Upscaling PLL倍频电路提升时钟频率Clock Distribution 时钟分配网络将时钟分发至CPU/外设/GTM等Individual Clock Config 外设级时钟门控/分频如单独配置ADC、PWM1.2 Clock Speed Upscaling1相位锁相环PLL模式控制Normal Mode 正常模型 常用Prescaler ModeFreerunning Mode正常模式下输入频率fosc先通过P分频再乘以N然后通过k2或k3再分频fPLLN1P1K21fOSC f_{PLL} \frac{N 1}{P 1K2 1}f_{OSC}fPLLP1K21N1fOSCfPLL2N1P1K31fOSC f_{PLL2} \frac{N 1}{P 1K3 1}f_{OSC}fPLL2P1K31N1fOSC例如当fOSC20MHzN29P0K22K35 f_{OSC} 20MHzN29P0K22K35fOSC20MHzN29P0K22K35计算得到fPLL200MHzfPLL2100MHz f_{PLL} 200MHzf_{PLL2} 100MHzfPLL200MHzfPLL2100MHz2PLL_ERAY为汽车以太网提供高精度时钟模式控制Normal Mode 正常模型 常用Prescaler ModeFreerunning Mode正常模式下输入频率fosc先通过ErayP分频再乘以ErayN然后通过ErayK2或ErayK3再分频fPLLERAYErayN1ErayP1ErayK21fOSC f_{PLLERAY} \frac{ErayN 1}{ErayP 1ErayK2 1}f_{OSC}fPLLERAYErayP1ErayK21ErayN1fOSCfPLL2ERAYErayN1ErayP1ErayK31fOSC f_{PLL2ERAY} \frac{ErayN 1}{ErayP 1ErayK3 1}f_{OSC}fPLL2ERAYErayP1ErayK31ErayN1fOSC例如当fOSC20MHzErayN23ErayP0ErayK22ErayK34 f_{OSC} 20MHzErayN23ErayP0ErayK22ErayK34fOSC20MHzErayN23ErayP0ErayK22ErayK34计算得到fPLLERAY160MHzfPLL2ERAY96MHz f_{PLLERAY} 160MHzf_{PLL2ERAY} 96MHzfPLLERAY160MHzfPLL2ERAY96MHzNote这里P的值与外部晶振的频率有关这里fPFD必须满足芯片手册规定范围1−25MHz Note这里P的值与外部晶振的频率有关这里f_{PFD}必须满足芯片手册规定范围1-25MHzNote这里P的值与外部晶振的频率有关这里fPFD必须满足芯片手册规定范围1−25MHzfPFDfOSCP1 f_{PFD} \frac{f_{OSC}}{P 1}fPFDP1fOSC1.3 Clock Distribution时钟来源PLL/PLL2、PLL_ERAY/PLL_ERAY2、back-up、OSC02 EB工程搭建2.1 创建工程1首先打开EB软件依次点击File - New - Configuration Project2在弹出的窗口中输入工程名称选择路径。本例选择使用默认路径。之后点击Next继续3此处选择需要的芯片型号并填写ECU ID在下面第一个选项打钩它会自动为新建工程添加最低需要的子元素。点击Next继续4这一步选择工程需要的模块。 Resource为默认必选项用来设置芯片具体型号。在这里我们选择MCU模块添加后点击Finsh完成2.2 配置Resource模块下图即为建好的EB工程新工程首先要打开Resource模块在ResourceSubDerivative中选择相应的芯片型号TC234LP_32F200FTC234是 AURIX™ TC23x 系列中的一个子系列属于中端性能的 32 位多核微控制器TriCore™架构面向汽车和工业应用LP表示低功耗Low Power版本32F200F3.2MB Flash容量200MHZ主频F封装2.3 配置Mcu模块1打开Mcu-General模块配置晶振频率20MHz使能McuPerformReset和McuClearColdReset功能。McuPerformResetApi触发微控制器的软件复位Software Reset使 MCU 重新启动类似于看门狗复位或手动复位。McuClearColdResetApi清除冷复位Cold Reset状态标志用于识别复位源或初始化复位相关配置。2选择McuModuleConfiguration选项卡双击选择打开其中的配置文件McuModuleConfiguration_0;3McuModuleConfiguration_0-General选项卡中配置Mcu复位设置4McuModuleConfiguration_0-McuClockSettingConfig选项卡中双击打开McuClockSettingConfig_0配置参数得到目标时钟配置项含义具体配置参数请参照下图MCU频率200MHz2.4 生成配置文件最后点击工具栏上的Generate按钮生成配置好的文件output\generated文件夹下包括头文件inc和源文件scr3 Tasking工程搭建3.1 创建工程1打开TASKING VX-toolset for TriCore软件依次点击 File - New -TASKING TriCore C/C Project2在在弹出的窗口中输入工程名字设置路径以及选择工程类型这里为了方便直接选择了Hello World C Project。之后点击Next继续3选择芯片TC23X之后点击Finish完成创建3.2 导入库文件和EB生成的配置文件1在建好的工程里做如下操作在EB安装路径下找到Aurix_MC-ISAR文件夹复制到工程中将EB生成的output文件夹复制到工程中2此工程中只用到了MCU模块Aurix_MC-ISAR文件夹中有很多多余文件需要删掉保证编译正确3.3 创建文件在当前工程中新建头文件MemMap.h代码中有调用防止编译出错。在ClockTest.c中添加代码所用Demo板需要在BMHD位置写入起始地址才能启动程序。添加Mcal_safeErrorHandler函数代码中有调用添加相应头文件#includestdio.h#includeStd_Types.h#includeMcu.hconstunsignedintBMHD_VAL[]__at(0xa0000000){0x80000020,0xB3590078,0x00000000,0x00000000,0x00000000,0xFFFFFFFF,0x9BC407AB,0x643BF854};voidMcal_SafeErrorHandler(uint32 ErrorType){}intmain(void){Printf(“Hello world\n”);}3.4 工程属性配置1右键工程名选择菜单中的Properties选项弹出界面如下图所示2点击C/C Build – Settings—Optimization Level 调为0-None3将所需文件的路径都添加在Include Paths项目下${workspace_loc:/${ProjName}/Aurix_MC-ISAR}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/general}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/general/inc}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/general/tricore}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/general/tricore/compiler}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/general/tricore/inc}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/general/tricore/inc/TC23x}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/integration_general}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/integration_general/inc}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore/cfg1}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore/cfg1/inc}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore/cfg1/lib}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore/cfg1/obj}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore/cfg1/src}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore/ssc}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore/ssc/inc}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore/ssc/lib}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore/ssc/obj}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore/ssc/src}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/tricore_general}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/tricore_general/ssc}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/tricore_general/ssc/inc}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/tricore_general/ssc/lib}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/tricore_general/ssc/obj}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/tricore_general/ssc/src}${workspace_loc:/${ProjName}/output}${workspace_loc:/${ProjName}/output/inc}${workspace_loc:/${ProjName}/output/src}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/dio_infineon_tricore}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/dio_infineon_tricore/ssc}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/dio_infineon_tricore/ssc/inc}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/dio_infineon_tricore/ssc/src}4在Preprocessing项目中要讲Automatic include of ‘,sfr’ file 前面的钩取消掉。在Defined symbols下添加一个条目_TASKING_C_TRICORE_1。3.5 编译完成上述操作后此工程即可以被编译通过。4 API接口API接口解释Mcu_InitMCU初始化Mcu_InitClock时钟初始化Mcu_DistributePllClock激活PLL时钟并分配给系统时钟Mcu_GetPllStatus获取PLL时钟锁定状态Mcu_ClearColdResetStatus清除冷复位状态Mcu_PerformReset软件复位MCUMcu_GetResetReason获取复位原因Mcu_InitRamSection初始化RAM空间5 Demo示例在main函数中添加如下代码intmain(void){Std_ReturnType RetVal;// MCU初始化加载Mcu_ConfigRoot中的时钟参数包括PLL/ERAY的预配置Mcu_Init(Mcu_ConfigRoot[0]);// 时钟初始化实际配置PLL和ERAY根据Mcu_kClockConfiguration0的参数设置寄存器RetValMcu_InitClock(0);if(RetValE_OK){// 获取PLL时钟锁相状态确认PLL稳定输出目标频率while((Mcu_GetPllStatus())0){};// 激活PLL时钟并分配给系统时钟配置寄存机将PLL时钟分配给CPU/SPB/SRI/外设如ERAY、SPB等Mcu_DistributePllClock();}Mcu_InitRamSection(0U);// 初始化RAM空间}6 测试通过劳德巴赫监测CPU寄存器查看到寄存器中的值正是我们在EB中配置的值。
【AUTOSAR实战系列 · TC23x篇】MCU时钟模块原理与EB配置
时钟和时钟控制单元CCU1 功能及原理分析1.1 TC23x时钟架构解析核心构建模块Clock Source 基础时钟源外部晶振/内部RC振荡器Clock Speed Upscaling PLL倍频电路提升时钟频率Clock Distribution 时钟分配网络将时钟分发至CPU/外设/GTM等Individual Clock Config 外设级时钟门控/分频如单独配置ADC、PWM1.2 Clock Speed Upscaling1相位锁相环PLL模式控制Normal Mode 正常模型 常用Prescaler ModeFreerunning Mode正常模式下输入频率fosc先通过P分频再乘以N然后通过k2或k3再分频fPLLN1P1K21fOSC f_{PLL} \frac{N 1}{P 1K2 1}f_{OSC}fPLLP1K21N1fOSCfPLL2N1P1K31fOSC f_{PLL2} \frac{N 1}{P 1K3 1}f_{OSC}fPLL2P1K31N1fOSC例如当fOSC20MHzN29P0K22K35 f_{OSC} 20MHzN29P0K22K35fOSC20MHzN29P0K22K35计算得到fPLL200MHzfPLL2100MHz f_{PLL} 200MHzf_{PLL2} 100MHzfPLL200MHzfPLL2100MHz2PLL_ERAY为汽车以太网提供高精度时钟模式控制Normal Mode 正常模型 常用Prescaler ModeFreerunning Mode正常模式下输入频率fosc先通过ErayP分频再乘以ErayN然后通过ErayK2或ErayK3再分频fPLLERAYErayN1ErayP1ErayK21fOSC f_{PLLERAY} \frac{ErayN 1}{ErayP 1ErayK2 1}f_{OSC}fPLLERAYErayP1ErayK21ErayN1fOSCfPLL2ERAYErayN1ErayP1ErayK31fOSC f_{PLL2ERAY} \frac{ErayN 1}{ErayP 1ErayK3 1}f_{OSC}fPLL2ERAYErayP1ErayK31ErayN1fOSC例如当fOSC20MHzErayN23ErayP0ErayK22ErayK34 f_{OSC} 20MHzErayN23ErayP0ErayK22ErayK34fOSC20MHzErayN23ErayP0ErayK22ErayK34计算得到fPLLERAY160MHzfPLL2ERAY96MHz f_{PLLERAY} 160MHzf_{PLL2ERAY} 96MHzfPLLERAY160MHzfPLL2ERAY96MHzNote这里P的值与外部晶振的频率有关这里fPFD必须满足芯片手册规定范围1−25MHz Note这里P的值与外部晶振的频率有关这里f_{PFD}必须满足芯片手册规定范围1-25MHzNote这里P的值与外部晶振的频率有关这里fPFD必须满足芯片手册规定范围1−25MHzfPFDfOSCP1 f_{PFD} \frac{f_{OSC}}{P 1}fPFDP1fOSC1.3 Clock Distribution时钟来源PLL/PLL2、PLL_ERAY/PLL_ERAY2、back-up、OSC02 EB工程搭建2.1 创建工程1首先打开EB软件依次点击File - New - Configuration Project2在弹出的窗口中输入工程名称选择路径。本例选择使用默认路径。之后点击Next继续3此处选择需要的芯片型号并填写ECU ID在下面第一个选项打钩它会自动为新建工程添加最低需要的子元素。点击Next继续4这一步选择工程需要的模块。 Resource为默认必选项用来设置芯片具体型号。在这里我们选择MCU模块添加后点击Finsh完成2.2 配置Resource模块下图即为建好的EB工程新工程首先要打开Resource模块在ResourceSubDerivative中选择相应的芯片型号TC234LP_32F200FTC234是 AURIX™ TC23x 系列中的一个子系列属于中端性能的 32 位多核微控制器TriCore™架构面向汽车和工业应用LP表示低功耗Low Power版本32F200F3.2MB Flash容量200MHZ主频F封装2.3 配置Mcu模块1打开Mcu-General模块配置晶振频率20MHz使能McuPerformReset和McuClearColdReset功能。McuPerformResetApi触发微控制器的软件复位Software Reset使 MCU 重新启动类似于看门狗复位或手动复位。McuClearColdResetApi清除冷复位Cold Reset状态标志用于识别复位源或初始化复位相关配置。2选择McuModuleConfiguration选项卡双击选择打开其中的配置文件McuModuleConfiguration_0;3McuModuleConfiguration_0-General选项卡中配置Mcu复位设置4McuModuleConfiguration_0-McuClockSettingConfig选项卡中双击打开McuClockSettingConfig_0配置参数得到目标时钟配置项含义具体配置参数请参照下图MCU频率200MHz2.4 生成配置文件最后点击工具栏上的Generate按钮生成配置好的文件output\generated文件夹下包括头文件inc和源文件scr3 Tasking工程搭建3.1 创建工程1打开TASKING VX-toolset for TriCore软件依次点击 File - New -TASKING TriCore C/C Project2在在弹出的窗口中输入工程名字设置路径以及选择工程类型这里为了方便直接选择了Hello World C Project。之后点击Next继续3选择芯片TC23X之后点击Finish完成创建3.2 导入库文件和EB生成的配置文件1在建好的工程里做如下操作在EB安装路径下找到Aurix_MC-ISAR文件夹复制到工程中将EB生成的output文件夹复制到工程中2此工程中只用到了MCU模块Aurix_MC-ISAR文件夹中有很多多余文件需要删掉保证编译正确3.3 创建文件在当前工程中新建头文件MemMap.h代码中有调用防止编译出错。在ClockTest.c中添加代码所用Demo板需要在BMHD位置写入起始地址才能启动程序。添加Mcal_safeErrorHandler函数代码中有调用添加相应头文件#includestdio.h#includeStd_Types.h#includeMcu.hconstunsignedintBMHD_VAL[]__at(0xa0000000){0x80000020,0xB3590078,0x00000000,0x00000000,0x00000000,0xFFFFFFFF,0x9BC407AB,0x643BF854};voidMcal_SafeErrorHandler(uint32 ErrorType){}intmain(void){Printf(“Hello world\n”);}3.4 工程属性配置1右键工程名选择菜单中的Properties选项弹出界面如下图所示2点击C/C Build – Settings—Optimization Level 调为0-None3将所需文件的路径都添加在Include Paths项目下${workspace_loc:/${ProjName}/Aurix_MC-ISAR}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/general}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/general/inc}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/general/tricore}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/general/tricore/compiler}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/general/tricore/inc}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/general/tricore/inc/TC23x}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/integration_general}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/integration_general/inc}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore/cfg1}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore/cfg1/inc}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore/cfg1/lib}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore/cfg1/obj}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore/cfg1/src}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore/ssc}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore/ssc/inc}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore/ssc/lib}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore/ssc/obj}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/mcu_infineon_tricore/ssc/src}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/tricore_general}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/tricore_general/ssc}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/tricore_general/ssc/inc}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/tricore_general/ssc/lib}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/tricore_general/ssc/obj}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/tricore_general/ssc/src}${workspace_loc:/${ProjName}/output}${workspace_loc:/${ProjName}/output/inc}${workspace_loc:/${ProjName}/output/src}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/dio_infineon_tricore}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/dio_infineon_tricore/ssc}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/dio_infineon_tricore/ssc/inc}${workspace_loc:/${ProjName}/Aurix_MC-ISAR/dio_infineon_tricore/ssc/src}4在Preprocessing项目中要讲Automatic include of ‘,sfr’ file 前面的钩取消掉。在Defined symbols下添加一个条目_TASKING_C_TRICORE_1。3.5 编译完成上述操作后此工程即可以被编译通过。4 API接口API接口解释Mcu_InitMCU初始化Mcu_InitClock时钟初始化Mcu_DistributePllClock激活PLL时钟并分配给系统时钟Mcu_GetPllStatus获取PLL时钟锁定状态Mcu_ClearColdResetStatus清除冷复位状态Mcu_PerformReset软件复位MCUMcu_GetResetReason获取复位原因Mcu_InitRamSection初始化RAM空间5 Demo示例在main函数中添加如下代码intmain(void){Std_ReturnType RetVal;// MCU初始化加载Mcu_ConfigRoot中的时钟参数包括PLL/ERAY的预配置Mcu_Init(Mcu_ConfigRoot[0]);// 时钟初始化实际配置PLL和ERAY根据Mcu_kClockConfiguration0的参数设置寄存器RetValMcu_InitClock(0);if(RetValE_OK){// 获取PLL时钟锁相状态确认PLL稳定输出目标频率while((Mcu_GetPllStatus())0){};// 激活PLL时钟并分配给系统时钟配置寄存机将PLL时钟分配给CPU/SPB/SRI/外设如ERAY、SPB等Mcu_DistributePllClock();}Mcu_InitRamSection(0U);// 初始化RAM空间}6 测试通过劳德巴赫监测CPU寄存器查看到寄存器中的值正是我们在EB中配置的值。