![cover](https://image.xiaode.tech/LskyPic/2024/11/23/674149d757b6c.png)
【TC234_输出1Mhz时钟SCU_EXTCLK1模块】
前言
系统控制单元 SCU(System Control Unit)章节内容如下图,此文章用到外部时钟输出EXTCLK1模块儿(External Clock Output )。文章从3个方面实现原理、代码实现、代码分析记录学习过程。
实现原理
TC234(英飞凌)是一款高性能的32位TriCore CPU内核的微控制器,具有以下主要参数和特性:
CPU性能:
运行频率:高达200MHz,支持多种采样和控制策略。
指令集:支持多种指令,具有DSP功能。
存储容量:
闪存:高达2MB,具有ECC保护。
EEPROM:128KB。
RAM:高达192KB,具有ECC保护。
接口和通信:
CAN接口:6路CAN,共享128个邮箱,其中4个支持CAN FD。
其他通信接口:包括FlexRay、LIN、QSPI、SENT传感器接口等。
安全特性:
硬件安全模块(HSM):可编程HSM,支持硬件安全功能。
安全管理单元(SMU):处理安全监视器警报。
内存测试单元(MTU):具有ECC、内存初始化和MBIST功能。
其他特性:
通用定时器模块(GTM):强大的通用定时器功能。
电源管理:单电压电源3.3V。
封装形式:TQFP-144封装。
工作温度范围:-40°C到+125°C。
应用领域:
广泛应用于PLC、太阳能逆变器、开关电源(SMPS)、不间断电源(UPS)、轻网络和网关、电动汽车等领域
系统控制单元 SCU在时钟系统里主要给单片机内部提供各种这样的时钟。
SCU相关寄存器实际地址
EXTCLK1和EXTCLK0差异:
fout是分频寄存器不一样
EXTCLK1多了个电平反转
fspb时钟进来,通过EXTCON.DIV1分频(fout=fspb/(DIV1+1)),EXTCON.NSEL决定是否反向,EXTCON.EN1 使能。接下来要确定fspb的频率是多少?
fspb的频率=fPLL锁相环的频率
fPLL锁相环:fPLL 对 fosc(外部晶振)的倍频、分频
寄存器数值+1
下面开始计算fspb和EXTCLK1输出频率,假设寄存器数值配置如下
NDIV=59
PDIV=1
K2=2
DIV=1
需要配置普通模式
代码实现(TC234_管脚P23.1输出1Mhz)
示波器量管脚
/*********************************************************************************************************************/
#include "IfxScuCcu.h"
#include "IfxScu_PinMap.h"
#include "IfxPort.h"
/*********************************************************************************************************************/
/*------------------------------------------------------Macros-------------------------------------------------------*/
/*********************************************************************************************************************/
#define PLL_FREQ 200000000.0f /* PLL frequency */
#define SPB_FREQ PLL_FREQ / 2 /* SPB frequency */
#define PINOUT &MODULE_P23, 1 //&MODULE_P23, 1 /* Port 23 pin 1 for SCU clock output */
#define FDR_STEP 0x3CE /* Divider for out frequency */
#define DIV_MODE 0x1 /* Divider mode: 0x1 is normal mode */
#define EXT_CLK 0x0 /* Set external clock: 0x00 is Fout */
#define EXT_CLK_EN 0x1 /* Enable external clock */
#define CLK_SEL 0x1 /* Select clock source: 0x1 is Fpll */
/*********************************************************************************************************************/
/*--------------------------------------------Function Implementations-----------------------------------------------*/
/*********************************************************************************************************************/
/* This function configures the output for the SCU clock */
void configOutputScuClock(void)
{
/* Remove safety to allow register modification */
IfxScuWdt_clearSafetyEndinitInline(IfxScuWdt_getSafetyWatchdogPasswordInline());
// SCU_CCUCON0.B.CLKSEL = CLK_SEL; /* Select Fpll as clock source */
// SCU_EXTCON.B.EN0 = EXT_CLK_EN; /* Enable external clock */
// SCU_EXTCON.B.SEL0 = EXT_CLK; /* Select Fout as external clock */
// SCU_FDR.B.STEP = FDR_STEP; /* Set FDR step */
// SCU_FDR.B.DM = DIV_MODE; /* Set divider mode to normal */
SCU_EXTCON.B.EN1 = EXT_CLK_EN;/* Enable external clock */
SCU_EXTCON.B.SEL1 = EXT_CLK; /* Select Fout as external clock */
SCU_EXTCON.B.DIV1 = 99;
/* Set safety to allow register modification */
IfxScuWdt_setSafetyEndinitInline(IfxScuWdt_getSafetyWatchdogPasswordInline());
/* Select the SCU output port pin P23.1 and set the pad driver to high speed */
IfxPort_setPinMode(PINOUT, IfxPort_Mode_outputPushPullAlt5);
IfxPort_setPinPadDriver(PINOUT, IfxPort_PadDriver_cmosAutomotiveSpeed1);
}
/* This function initializes the SCU clock */
void initScuClock(void)
{
IfxScuCcu_Config scuClockConfig; /* Define the SCU configuration structure */
IfxScuCcu_initConfig(&scuClockConfig); /* Initialize the configuration for with default values */
/* Calculate the PLL dividers */
IfxScuCcu_calculateSysPllDividers(&scuClockConfig, PLL_FREQ);
/* Initialize the SCU CCU */
IfxScuCcu_init(&scuClockConfig);
/* Set the Serial Peripheral Bus (SPB) frequency */
IfxScuCcu_setSpbFrequency(SPB_FREQ);
/* Configure the SCU clock output */
configOutputScuClock();
}
代码分析
配置PLL的寄存器
/* Calculate the PLL dividers */
IfxScuCcu_calculateSysPllDividers(&scuClockConfig, PLL_FREQ);
这个函数里
配置fspb总线频率的主要寄存器
/* Set the Serial Peripheral Bus (SPB) frequency */
IfxScuCcu_setSpbFrequency(SPB_FREQ);
参考链接
TC234数据手册:TC21x-TC22x-TC23x User Manual.pdf(不多3435页狗头)