前言

系统控制单元 SCU(System Control Unit)章节内容如下图,此文章用到外部时钟输出EXTCLK1模块儿(External Clock Output )。文章从3个方面实现原理、代码实现、代码分析记录学习过程。

实现原理

TC234(英飞凌)是一款高性能的32位TriCore CPU内核的微控制器,具有以下主要参数和特性‌:

  1. CPU性能‌:

    • 运行频率‌:高达200MHz,支持多种采样和控制策略。

    • 指令集‌:支持多种指令,具有DSP功能。

  2. 存储容量‌:

    • 闪存‌:高达2MB,具有ECC保护。

    • EEPROM‌:128KB。

    • RAM‌:高达192KB,具有ECC保护。

  3. 接口和通信‌:

    • CAN接口‌:6路CAN,共享128个邮箱,其中4个支持CAN FD

    • 其他通信接口‌:包括FlexRay、LIN、QSPI、SENT传感器接口等。

  4. 安全特性‌:

    • 硬件安全模块(HSM)‌:可编程HSM,支持硬件安全功能。

    • 安全管理单元(SMU)‌:处理安全监视器警报。

    • 内存测试单元(MTU)‌:具有ECC、内存初始化和MBIST功能。

  5. 其他特性‌:

    • 通用定时器模块(GTM)‌:强大的通用定时器功能。

    • 电源管理‌:单电压电源3.3V。

    • 封装形式‌:TQFP-144封装。

    • 工作温度范围‌:-40°C到+125°C。

  6. 应用领域‌:

    • 广泛应用于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

fPLL=\frac{N}{P.K2} .fosc(外部晶振20Mhz)(1)\\ fPLL=\frac{(NDIV+1)}{(PDIV+1).(K2+1)} .fosc(寄存数值+1) NDIV=59;PDIV=1;K2=2;(2)\\ fPLL=\frac{(59+1)}{(1+1).(2+1)} .20Mhz=200Mhz(带入数值)(3) \\ fspb=\frac{fPLL}{2} =100Mhz (fspb的时钟源是fPLL)(4)\\ fout=\frac{fspb}{DIV1+1} ,DIV1=99;(5)\\ fout=\frac{200}{99+1} =1Mhz (6)\\

​需要配置普通模式

代码实现(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页狗头)

行则将至,道阻且长~