【TC3xx芯片】TC3xx芯片的Clock System功能详解

目录

前言

正文

1.时钟源

1.1 有源晶振和无源晶振

1.1.1 无源晶振

1.1.2 有源晶振

1.1.3 有源晶振和无源晶振的区别

1.1 振荡器电路(OSC)

1.1.1外部输入时钟模式

1.1.2 外部晶体 / 陶瓷谐振器模式

1.1.3 OSC控制寄存器

1.1.4 配置OSC

1.1.5 OSC看门狗

1.1.6 配置SMU和时钟相关的Alarm

1.2 备用时钟

1.3 OSC实际应用配置

2. 时钟倍频PLL

2.1 特点

2.2 系统时钟锁相环PLL

2.3 系统PLL寄存器

2.4 外设时钟锁相环PLL

2.5 PLL实际应用配置

3. 时钟分配(CCU)

3.1 时钟控制单元

3.2 以MCCAN为例配置时钟频率

4. 总结


前言

时钟好比MCU的心跳,只有时钟正常了,MCU的核及外设才能正常工作。从源头到系统到外设理解每一个时钟的来源及其具体值才能方便后面理解MCAL的GPT,PWM,ICU等模块的配置(MCAL模块中的Tick数就是基于模块时钟的)。本系列文章就来详细介绍TC3xx芯片的时钟系统及其具体配置。

缩略词

简写

全称

OSC

Oscillator Circuit

PLL

Phase-Locked Loop

DCO

Digitally Controlled Oscillator

正文

1.时钟源

晶振好比人的心脏,晶振产生的时钟脉冲好比心脏产生的心跳,所以,晶振对于MCU来讲必不可少,晶振没有起振,MCU必定无法工作。

1.1 有源晶振和无源晶振

无源晶振又名“无源晶体”、“石英晶体谐振器”,英文名Crystal或Crystal Resonator。有源晶振又称“石英晶体振荡器”,英文名Crystal Oscillator。

1.1.1 无源晶振

无源晶振一般有两个引脚,无极性。它自身无法振动, 一般外部都接有两个10-22PF的瓷片电容。

无源晶振参考电路无源晶振信号质量较差,通常需要精确匹配外围电路(用于信号匹配的电容、电感、电阻等),更换不同频率的晶体时周边配置 电路也需要做相应的调整。一般建议采用精度较高的石英晶体。

1.1.2 有源晶振

有源晶振有4只引脚,是一个完整的振荡器,其中除了石英晶体外,还有晶体管和阻容元件,因此体积较大。有源晶振的封装有4个引脚,分别为VCC (电压)、GND (地)、OUT (时钟信号输出)、NC (空脚)。

有源晶振参考电路有源晶振不需要CPU的内部振荡器,信号稳定,质量较好,且连接方式比

较简单(主要做好电源滤波,通常使用一个电容和电感构成滤波网络,输出端用一个小阻值的

电阻过滤信号即可) , 不需要复杂的配置电路。

 

1.1.3 有源晶振和无源晶振的区别

1、有源晶振比较贵, 但是有源晶振自身就能振动。无论无源晶振, 还是有源晶振, 都有自身的优点和缺点所在, 若考虑产品成本, 建议可以选择无源晶振电路; 若考虑产品性能, 建议选择有源晶振电路, 省时方便也能保证产品性能。

2、无源晶振最高精度为5ppm, 而有源晶振的精度则可以达到0. 1ppm。精度越高, 频率稳定性也更好。有源晶振在稳定性上要胜过无源晶振, 但也有自身小小的缺陷, 有源晶振的信号电平是固定, 所以需要选择好合适输出电平,灵活性较差。

3、有源晶振一般4个脚,1个电源,1个接地,1个信号输出端,1个NC (空脚)。有个点标记的为1脚, 按逆时针(管脚向下)分别为2、3、4。

4、无源晶振有2个引脚,要借助于外部的时钟电路(接到主IC内部的振荡电路) 才能产生振荡信号, 自身无法振荡。

参考文档:

http://www.interquip-china.com/?c=msg&id=2553&bd_vid=6323699165298490610

1.1 振荡器电路(OSC)

振荡器电路是一种 Pierce 振荡器(Pierce oscillator),设计用于与外部晶体(external crystal) / 陶瓷谐振器(ceramic resonator)或外部稳定时钟源(external stable clock source)配合使用。 该电路由一个反向放大器组成, XTAL1 作为输入, XTAL2 作为带有集成反馈电阻的输出。

1.1.1外部输入时钟模式

使用外部输入时钟模式时,外部时钟信号连接到OSC模块的XTAL1引进,XTAL2引脚保持悬空状态。

Figure 1 AURIX™ TC3xx Platform Direct Clock Input

如果在正常模式直接使用外部时钟提供的时钟信号时,不使用外部晶体 / 陶瓷谐振器并绕过振荡器,则输入频率需要等于或大于 PLL 的 DCO 输入频率 (该值在Data sheet中列出)。

1.1.2 外部晶体 / 陶瓷谐振器模式

Figure 2 显示了两种工作模式的推荐外部电路:外部晶体 / 陶瓷谐振器模式 (带和不带外部组件)。

Figure 2 External Circuitry for Crystal / Ceramic Resonator operation

1.1.3 OSC控制寄存器

Oscillator Circuit Control Register用来配置OSC模式和晶振频率。主要用到的配置位域为:

OSCCON.MODE 配置晶振模式

OSCCON.OSCVAL 配置晶振频率

OSCCON.PLLLV 标识OSC频率是否可用

OSCCON.PLLHV标识OSC频率是否可用

1.1.4 配置OSC

只有配置了OSC后,外部晶振才能作为时钟源工作。

Power-on复位后OSC模块是被disabled,需要重新配置。在任何其他重置过程中和之后,振荡器不会受到影响,并按照先前配置的方式工作,这种情况下不需要重新配置。

可以通过SSW来配置OSC,也可以在App中直接配置OSC。值得注意的是:OSCCON寄存器是受Endinit保护的,配置的时候需要解锁Endinit。

参考文档:【TC3xx芯片】TC3xx芯片的Endinit功能详解

1.1.5 OSC看门狗

通过配置 SYSPLLCON0.Insel = 01B ,选择振荡器时钟作为看门狗的源。

与系统 PLL 结合使用时,将实施监控功能。 定义此功能的目的是检测外部晶体 / 陶瓷谐振器的严重故障。 系统可以检测到时钟输入丢失或输入频率过高 (在较高谐波上运行)。

振荡器监视程序监视来自 OSC 的传入时钟频率 fOSC。 稳定且定义的输入频率是操作的强制要求。 因此,每次系统重置后都会自动选择此模式。

预期输入频率 fOSC 通过位字段 OSCCON.OSCVAL 选择。 OSC WDT 检查频率是否过低或过高。

fOSC = OSCCON.OSCVAL - 1 + 16MHz

在配置 OSC WDT 功能之前,应禁用所有 SMU 振荡器看门狗报警响应选项,以避免意外的 SMU 报警。 此后,可以更改 OSCCON.OSCVAL 的值。 然后, OSC_WDT 应通过设置 OSCCON.OSCRES 重置。 这将请求使用新配置启动 OSC WDT 监控。 当设定 OSCCON.PLLLV 和 / 或 OSCCON.PLLHV 的预期正监测结果时,输入频率处于预期范围内。 当设置 OSCCON.OSCRES 清除 OSCCON.PLLLV 和 OSCCON.PLLHV 时,应设置两个状态标志。 因此,在再次启用 SMU 报警响应之前,应清除这两个标志。 如果只设置了位 OSCCON.OSCRES 而未对 OSCCON.OSCVAL 进行任何修改,也应使用 SMU 报警禁用 - 清除 - 启用序列。

如果 SMU 检测到振荡器监视报警,则必须执行与 PLL 锁定丢失事件相同的恢复过程。

Note:

振荡器看门狗主要用于 PLL 输入时钟 fOSC _i 通过寄存器 SYSPLLCON0.Insel = 01B 设置为 fOSC0 时。 如果 SYSCLK 通过 SYSPLLCON0.Insel = 10B 用作 fOSC _i 的源,用户应将 SYSCLK 频率限制在与使用晶体相同的范围内,或禁用 SMU 中的看门狗报警。 通过 SYSPLLCON0.Insel = 00B 使用备份时钟作为 fOSC _i 的输入时,也需要禁用看门狗报警。 数据表中列出了通过分配的 GPIO 输入引脚驱动 SYSCLK 时的可用晶体频率范围和允许的频率范围。

1.1.6 配置SMU和时钟相关的Alarm

SMU模块在后续的TC3xx系类文章中再详细讲解,这里仅仅列出在配置OSC时相关的SMU寄存器。

只有SMU_KEYS寄存器的CFGLCK[7:0]配置为0xBC时才能配置SMU.

配置SMU_AGiCFj寄存器Disable Clock相关的Alarm.

和Clock Alarm相关的Group是Group 8, 也就是AGiCFj中I == 8.

Note: AG8CF0, AG8CF1, AG8CF2三个寄存器的同一个bit的组合关系决定一个Alarm的类型。

举例:

AG8CF0[0].CF0, AG8CF1[0] .CF0, AG8CF2[0] .CF0 就是三个bit, 组合为一个0x0 – 0x7的具体Alarm类型,如果

AG8CF0[0] == 1,

AG8CF1[0] .CF0 == 1,

AG8CF2[0] .CF0== 1,

那么最后组合为111 = 0x7,产生的Alarm就是SMU_CPU_RST.

1.2 备用时钟

备用时钟源可用作备用时钟源。 此时钟源提供稳定但可靠的时钟源,可用作系统的时钟源。 它提供的准确度低于外部晶体或陶瓷谐振器。 不能启用或禁用备份时钟,也不能通过其他方式控制备份时钟,以阻止其常规操作。 因此,除了选择备份时钟作为源 (CCUCON0.CLKSEL = 00B 作为时钟分配的时钟源, SYSPLLCON0.Insel = 00B 作为两个 PLL 的时钟源) 外,没有可用的控制位。

1.3 OSC实际应用配置

需求:配置使用一个20MHz的外部无源晶振。

#include "IfxScu_reg.h"#include "IfxSmu_reg.h"static uint8 Startup_ClockInit_ConfigOSC(void){/*Disable SMU Clock Alarm*/MODULE_SMU.KEYS.U = (uint32)0xBCU;             /* Enable access to SMU registers */MODULE_SMU.CMD.U  = (uint32)0x05U;MODULE_SMU.AG[8].U  = 0x1FU;                   /* Clear SMU Alarms*/MODULE_SMU.KEYS.U = (uint32)0U;/*Congig OSC -- Start*/Ifx_SCU_OSCCON scuOsccon;uint32 timeoutCount;uint8 error = 0;UnlockEndinit_Core0();scuOsccon.U      = MODULE_SCU.OSCCON.U;scuOsccon.B.MODE = 0U;/*fOSC = OSCCON.OSCVAL - 1 + 16MHz */scuOsccon.B.OSCVAL = (uint32)5U;MODULE_SCU.OSCCON.U       = scuOsccon.U;/* Check if the configuration is valid */timeoutCount = 0xFFFFF;while((MODULE_SCU.OSCCON.B.PLLLV == 0U) && (MODULE_SCU.OSCCON.B.PLLHV == 0U))                                         {if (((--(timeoutCount)) <= 0){(error) = 1;break;}}  /*Congig OSC -- End*//* Enable SMU Clock Alarms */MODULE_SMU.KEYS.U = (uint32)0xBCU;             /* Enable access to SMU registers */MODULE_SMU.CMD.U  = (uint32)0x00000005;MODULE_SMU.AG[8].U  = 0x1FU;   /* Clear SMU Alarms*/MODULE_SMU.KEYS.U = (uint32)0U;LockEndinit_Core0();return error;}

2. 时钟倍频PLL

系统 PLL 可以将低频外部时钟信号转换为高速内部时钟,以获得最佳性能。 它允许通过改变不同的分频器因子来使用多种输入和输出频率。

系统 PLL 还具有故障安全逻辑,可检测到非生成外部时钟行为,如异常频率偏差或外部时钟完全丢失。 如果它在外部时钟上失去锁定,它可以执行紧急操作。

2.1 特点

. DCO锁检测

. 3 位输入分隔器 P (除以 PDIV+1)

. 7 位反馈分隔器 N (乘以 NDIV+1)

. 3 位输出分隔器 K2 (除以 K2DIV+1)

. 振荡器监视(Oscillator Watchdog)

        -检测输入频率是否太低

        -检测输入频率是否太高

. 低频率抖动调制

2.2 系统时钟锁相环PLL

Figure 3 System PLL Block Diagram

输入频率 fOSC 除以因子 P ,乘以因子 N ,然后再除以因子 K2。

输出频率计算公式如下:

fPLL0 = (N* fOSC) / (P * K2)

fPLL0需要 fOSC 的输入时钟频率。 因此,建议通过检查 OSCCON.PLLV 来检查和监控输入频率 fOSC 是否可用。 为了更好地监控,还可以通过 OSCCON.PLLHV 监控上频。

系统操作频率由三个分频器(divider)的值控制: P , N 和 K2。 修改两个分频器 P 和 N 对 DCO 频率有直接影响,可能导致锁定状态丢失。 修改 K2 分频器对锁定状态没有影响,但仍会更改系统 PLL 输出频率 fPLL0.

注意:通过更改 K2-Divider 的值来更改系统操作频率,可以直接连接到设备的功耗。 因此,必须谨慎行事。

当必须修改系统 PLL 输出频率的频率时,应遵循以下顺序:

应禁用为失去锁定而生成的 SMU 警报。

CCU 使用不同的时钟源时,可以配置系统 PLL 并检查其位置 DCO 锁定状态。 第一个目标频率的选择方式应与 CCU 当前使用的目标频率相匹配,或仅略高一些。 这可以避免在以后切换至系统 PLL 时发生系统操作频率 (因此也避免功耗) 的大变化。 应按以下方式选择 P 和 N 分频因子(divider):

. 选择 P 和 N 时, fDCO位于其允许值的下半部分。 这会导致功耗略有降低,但抖动略有增加。

. 选择 P 和 N 时, fDCO位于其允许值的上部区域。 这会导致功耗略有增加,但抖动略有降低。

通过更新 P , N 和 K2 分频因子完成第一次PLL时钟配置后,应检查 DCO 锁定状态指示 (SYSPLLSTAT.LOCK = 1)。

系统 PLL 锁定后,可以切换至系统 PLL。 系统 PLL 丢失锁定事件的 SMU 状态标志应被清除,然后再次启用SMU监控。

现在只能通过更改 K2-Divider 来配置目标系统 PLL 输出目标频率。 根据 K2-Divider 的值,选择输出时钟的周期时间。 这可能会对使用外部通信接口的操作产生影响。 多步更改 k2-Divider ,以避免输出频率发生大变化,从而避免功耗发生大变化。

注意:

1.建议配置完P 和 N 分频器(divider)的新值后重置 DCO 锁定检测 (SYSPLLCON0.RESLD = 1) ,这样就能得到一个芯片预定义好的DCO锁的检测时间(让DCO锁有充足时间检测并锁定) 。

2. 由于两个 PLL (System PLL and Peripheral PLL)的紧急从 PLL 切换至备用时钟同时激活,强烈建议仅在设置了外围 PLL 并将其锁定到目标频率时,才将系统时钟切换至系统 PLL。 如果执行了顺序设置,则可能会发生外设 PLL 在设置过程中丢失锁定事件,这也会导致系统时钟切换至备用时钟。

3. 建议在设置 DCO 频率并锁定系统 PLL 后步进的设置系统 PLL K2-Divider (降低功率突变冲击)。 此外,用户必须在再次更改 SYSPLLCON1.K2DIV 值之前检查 SYSPLLSTAT.K2RDY =1。 SYSPLLCON1.K2DIV 寄存器在上一次写入仍在进行时被锁定,如 SYSPLLSTAT.K2RDY =0 所示。

System PLL Lock Detection

系统 PLL 具有锁定检测(lock detection)功能,用于监控系统 PLL 的 DCO 部分,以区分稳定和不稳定的 DCO 电路行为。 如果两个输入fREF 和 fDIV 的差异太大,锁定探测器(lock detector)会将 DCO 电路标记为不稳定,因此 DCO 的输出fDCO. 低于某一级别的一个或两个输入频率的变化不会被锁定标记,因为 DCO 可以处理小的变化且保证系统没有任何问题。

System PLL Loss-of-Lock Event

由于晶体 / 陶瓷谐振器或外部时钟线断裂,系统PLL 可能会解锁。 在这种情况下,会生成 SMU 警报事件。

System PLL Power Down Mode

系统 PLL 提供断电模式。 如果根本不需要外围 PLL ,则可以进入此模式以节省电源。 通过设置位 SYSPLLCON0.PLLPWD 进入断电模式。 当系统 PLL 处于断电模式时,不会生成系统PLL 输出频率。

Frequency Modulation

系统 PLL 输出频率 fPLL0还可以通过低频调制进行修改,以减少 EMI。 随机序列被添加到 DCO ,从而形成随机调制的 fDCO。 调制频率由 fREF定义。

调制通过位 SYSPLLCON0.MODEN 启用。 调制本身会在配置的调制幅度 (MA) 范围内随机改变 DCO 频率。 调制振幅通过 SYSPLLCON2.MODCFG[9:0] 选择。

SYSPLLCON2.MODCFG[9:0] = HEX[(64 * (MA / 100)) * (fOSC / P) *(N/ fMV)]

Example: for MA = 1.25%; fOSC = 20 MHz; P = 2; N = 60; fMV = 3.6 MHz the resulting bit field setting is 0x85.

调制的执行方式是,调制所增加的累积抖动保持在JMOD以下 (有关定义的值,请参阅数据表)。 调制本身通过 fREF进行监控,因此应使用尽可能最小的值配置分压器。

2.3 系统PLL寄存器

系统PLL状态寄存器

系统控制寄存器0

系统PLL配置寄存器1

2.4 外设时钟锁相环PLL

外设PLL配置基本和系统PLL类似,这里只给出时钟倍频图及其计算公式。

Figure 4 Peripheral PLL Block Diagram

fPLL1 = (N* fOSC) / (P * K2)

fPLL2 = (N* fOSC) / (P * K3 * 1.6) if DIVBY = 0 or fPLL2 = (N* fOSC) / (P * K3 * 2) if DIVBY = 1

fHSCT = fDCO / 2

通过配置外设PLL的配置寄存器就能配置P, K2, K3参数的具体值。

2.5 PLL实际应用配置

需求1:配置fOSC到100MHz.

公式:fPLL0 = (N* fOSC) / (P * K2)

fOSC == 20MHz

N = SYSPLLCON0.NDIV + 1 = 29(0x1D, 配置SYSPLLCON0.NDIV为29) + 1 = 30

P = SYSPLLCON0.PDIV + 1 = 0(配置SYSPLLCON0.PDIV为0) + 1 = 1

K2 = SYSPLLCON1.K2DIV + 1 = 5(配置SYSPLLCON1.K2DIV为5) +1 = 6

fPLL0 = (N* fOSC) / (P * K2) = (30 * 20)/(1 * 6) = 100MHz

查看SYSPLLSTAT寄存器的PWDSTAT和K2RD位域来判断时钟配置结果。

需求2:配置fPLL1到320MHz.

需求3:配置fPLL2到200MHz.

需求4:配置fHSCT到640MHz.

计算公式:

fPLL1 = (N* fOSC) / (P * K2)

fPLL2 = (N* fOSC) / (P * K3 * 1.6) if DIVBY = 0 or fPLL2 = (N* fOSC) / (P * K3 * 2) if DIVBY = 1

fHSCT = fDCO / 2

同样,我们配置:

N = 32

P = 1

K2 = 2

K3 = 2

fPLL1 = (N* fOSC) / (P * K2) = (32 * 20) / (1 * 2) = 320 MHz.

fPLL2 = (N* fOSC) / (P * K3 * 1.6) if DIVBY = 0 or fPLL2 = (N* fOSC) / (P * K3 * 2) if DIVBY = 1

= (32 * 20) / (1 * 2 * 1.6) = 200 MHz.

fHSCT = fDCO / 2 = = (N* fOSC) / (P) = 640 MHz.

示例代码:

#include "IfxScu_reg.h"#include "IfxSmu_reg.h"static uint8 Startup_ClockInit_ConfigPLL(void)
{Ifx_SCU_SYSPLLCON0 SysPLLCon0;Ifx_SCU_PERPLLCON0 ScuPerPllCon0;Ifx_SCU_PERPLLCON1 ScuPerPllCon1;uint32 TimeoutCount;uint8 Error = 0;LockEndinit_Core0();/* Configure the system PLL */SysPLLCon0.U       = MODULE_SCU.SYSPLLCON0.U;SysPLLCon0.B.PDIV  = 0x00;SysPLLCon0.B.NDIV  = 0x1D;SysPLLCon0.B.INSEL = 1; // fOSC is used as clock sourceMODULE_SCU.SYSPLLCON0.U   = SysPLLCon0.U;/* Configure the peripheral PLL */ScuPerPllCon0.U       = MODULE_SCU.PERPLLCON0.U;ScuPerPllCon0.B.DIVBY = 0x00;ScuPerPllCon0.B.PDIV  = 0x00;ScuPerPllCon0.B.NDIV  = 0x1F;MODULE_SCU.PERPLLCON0.U      = ScuPerPllCon0.U;/* Power up the system PLL and peripheral PLL */MODULE_SCU.SYSPLLCON0.B.PLLPWD = 1;MODULE_SCU.PERPLLCON0.B.PLLPWD = 1;/* Check if the configuration is valid */TimeoutCount = 0x3000;while((MODULE_SCU.SYSPLLSTAT.B.PWDSTAT == 1U) || (MODULE_SCU.PERPLLSTAT.B.PWDSTAT == 1U))                                         {if (((--(TimeoutCount)) <= 0){(Error ) = 1;break;}}  /* Check if the configuration is valid */TimeoutCount = 0x5000;while((MODULE_SCU.SYSPLLSTAT.B.K2RDY == 0U) ||(MODULE_SCU.PERPLLSTAT.B.K2RDY == 0U) ||(MODULE_SCU.PERPLLSTAT.B.K3RDY == 0U))                                        {if (((--TimeoutCount)) <= 0){(Error ) = 1;break;}}  MODULE_SCU.SYSPLLCON1.B.K2DIV = 5;ScuPerPllCon1.U       = MODULE_SCU.PERPLLCON1.U;ScuPerPllCon1.B.K2DIV = 1;ScuPerPllCon1.B.K3DIV = 1;MODULE_SCU.PERPLLCON1.U = ScuPerPllCon1.U;TimeoutCount = 0x5000;while((MODULE_SCU.SYSPLLSTAT.B.K2RDY == 0U) ||(MODULE_SCU.PERPLLSTAT.B.K2RDY == 0U) ||(MODULE_SCU.PERPLLSTAT.B.K3RDY == 0U))                                       {if (((--(TimeoutCount)) <= 0){(Error ) = 1;break;}}  /* Start PLL locking for latest set values*/MODULE_SCU.SYSPLLCON0.B.RESLD = 1;  MODULE_SCU.PERPLLCON0.B.RESLD = 1;/*Wait for PLL lock to be set*/TimeoutCount = 0x3000;while((MODULE_SCU.SYSPLLSTAT.B.LOCK == 0U) || (MODULE_SCU.PERPLLSTAT.B.LOCK == 0U))                                         {if (((--(TimeoutCount)) <= 0){(Error ) = 1;break;}}  UnlockEndinit_Core0();}

3. 时钟分配(CCU)

配置好时钟系统的时钟源(OSC)和锁相环倍频(PLL),系统操作所依赖的Root Clock就有了。 接下来,MCU的所有外设模块,CPU核都需要从Root Clock通过分屏来适配自己需要的时钟。 各个模块都需要适配时钟,主要是为了优化性能和降低功耗。

对于时钟分配,系统分为多个子时钟域,可以在这些域中单独配置时钟速度。 内部接口派生的每个子时钟域也有限制。 每个子时钟域从时钟角度定义逻辑单元。

时钟分配通过时钟控制单元 (CCU) 完成。 CCU 接收由两个 PLL (fPLL0 and fPLL1/2) ,备用时钟fBack 和 fOSC0创建的时钟。 这些时钟可以直接转发或划分,以便提供子时钟域。

3.1 时钟控制单元

Figure 5 Clock Control Unit Overview

对于大多数时钟,提供了线性分频器来调整时钟频率以满足应用要求。 此分隔符由寄存器 CCUCONy 中的位字段 XXXDIV 控制。

时钟系统的配置非常灵活。 这允许将频率变化调整为应用程序定义的特定电流限制。

每个模块都有default时钟源以及推荐(√)的时钟源,以及可选的倍频/分频系数。在配置某个具体模块的时钟时,首先选择时钟源,然后再选分频系数。

3.2 以MCCAN为例配置时钟频率

CCUCON0.CLKSEL配置fsource0, fsrc1, and fsource2三个时钟的时钟源。

MCAN的配置在CCUCON1寄存器上

CCUCON1.MCANDIV配置fMCANI的分频系数。

CCUCON1.CLKSELMCAN配置MCAN的时钟源。

CCUCON1寄存器的默认值位0x1010 0302,也就是:

CCUCON1.MCANDIV = 2

CCUCON1.CLKSELMCAN = 0  à  fMCAN clock是不工作的。

需求fMCAN clock配置到80MHz.

第一步:了解时钟源

从第二章已知

fPLL0为100MHz.

fPLL1为320MHz.

fPLL2为200MHz.

第二步:CCUCON0.CLKSEL配置为0x01B

也就是

 fsource0 == fPLL0 == 100MHz

fsource1 == fPLL1 == 320MHz

fsource2 == fPLL2 == 200MHz

第三步:配置CCUCON1.MCANDIV = 0x4H

也就是

fMCANI = fsource1/4 = 320/4 = 80MHz.

第四步:配置CCUCON1.CLKSELMCAN = 01B,fMCANI is used as clock source fMCAN

也就是

fMCANI ==  fMCAN  == 80MHz.

4. 总结

时钟配置基本都是按下图的推荐参数来配置的

Figure 6 Clocking System example with external 20MHz crystal / clock input

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/204359.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Frameworks 开发总结之七

1.修改android 系统/system/下面文件时权限不够问题 下面提到的方式目前在Bobcat的userdebug image上测试可行,还没有在user上测试过. 修改前: leif@leif:~$ adb root restarting adbd as root leif@leif:~$ adb disable-verity verity is already disabled using overlayf…

Unity 关于SpriteRenderer 和正交相机缩放

float oldWidth 750f;float oldHeight 1334f;float newWidth Screen.width;float newHeight Screen.height;float oldAspect oldWidth / oldHeight;float newAspect newWidth / newHeight;//水平方向缩放float horizontalCompressionRatio newAspect / oldAspect;//垂直…

笔记十七、认识React的路由插件react-router-dom和基本使用

react-router 分类 web使用 react-router-dom native使用 react-router-native anywhere&#xff08;使用麻烦&#xff09; react-router 安装 yarn add react-router-dom main.jsx import React from "react"; import ReactDOM from "react-dom/client"…

基于可微分渲染器的相机位置优化【PyTorch3D】

在这个教程中&#xff0c;我们将使用可微渲染学习给定参考图像的相机的 [x, y, z] 位置。 我们将首先使用相机的起始位置初始化渲染器。 然后&#xff0c;我们将使用它来生成图像&#xff0c;使用参考图像计算损失&#xff0c;最后通过整个管道进行反向传播以更新相机的位置。…

C#,《小白学程序》第五课:队列(Queue)其一,排队的技术与算法

日常生活中常见的排队&#xff0c;软件怎么体现呢&#xff1f; 排队的基本原则是&#xff1a;先到先得&#xff0c;先到先吃&#xff0c;先进先出 1 文本格式 /// <summary> /// 《小白学程序》第五课&#xff1a;队列&#xff08;Queue&#xff09; /// 日常生活中常见…

申银万国期货通过ZStack Cube信创超融合一体机打造金融信创平台

信创是数字中国建设的重要组成部分&#xff0c;也是数字经济发展的关键推动力量。作为云基础软件企业&#xff0c;云轴科技ZStack产品矩阵全面覆盖数据中心云基础设施&#xff0c;ZStack信创云首批通过可信云《一云多芯IaaS平台能力要求》先进级&#xff0c;是其中唯一兼容四种…

Git使用基础总结(从小白到新手版)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

C语言 移位操作符

<< 左移操作符>> 右移操作符 注&#xff1a;移位操作符的操作数只能是整数。 移位操作符移动的是二进制位。 整数的二进制表示有3种&#xff1a; 原码反码补码 正的整数的原码、反码、补码相同。 负的整数的原码、反码、补码是要计算的。 由负整数原码计算出反…

新王加冕,GPT-4V 屠榜视觉问答

当前&#xff0c;多模态大型模型&#xff08;Multi-modal Large Language Model, MLLM&#xff09;在视觉问答&#xff08;VQA&#xff09;领域展现了卓越的能力。然而&#xff0c;真正的挑战在于知识密集型 VQA 任务&#xff0c;这要求不仅要识别视觉元素&#xff0c;还需要结…

ARM Cortex-M核的内核态,用户态

首先&#xff0c;用户态和内核态是从操作系统层面上来划分的&#xff0c;如果没有操作系统&#xff0c;我可以直接运行在特权模式下&#xff0c;并使用特权指令。在这种情况下&#xff0c;我将负责管理和控制系统资源&#xff0c;执行关键操作&#xff0c;以及确保系统的安全性…

untiy 配置iis服务器来打开webgl

最简单的方法是不需要配置服务器&#xff0c;打包的时候直接build and run&#xff0c;但是有时候如果我们需要调整js的内容&#xff0c;会很不方便&#xff0c;所以配置一个iis服务器还是很有必要的 首先要开启iis服务 控制面板&#xff0c;查看方式选类型&#xff0c;点击程…

前端 vue 面试题(二)

文章目录 如何让vue页面重新渲染组件间通信vue为什么要mutation、 action操作插槽、具名插槽、作用域插槽vue编译使用的是什么库&#xff1f;vue怎么实现treeshakingwebpack实现treeshaking为什么只有es module 能支持 tree shaking mixin 的作用mixin的底层原理nexTick原理vue…

csdn博客编写技巧

随便记录一下csdn博客编写时候用的到技巧&#xff0c;以作备忘。 1. 表格 1.1 Markdown-Table-Generator 这个是csdn编辑器中&#xff0c;工具栏自带的表格用法。主要优点是比较直观&#xff0c;缺点是无法设置表格中行列的宽高。 用法&#xff1a; | 表头一 | 表头二 | |-…

5 时间序列预测入门:LSTM+Transformer

0 引言 论文地址&#xff1a;https://arxiv.org/abs/1706.03762 1 Transformer Transformer 模型是一种用于处理序列数据的深度学习模型&#xff0c;主要用于解决自然语言处理&#xff08;NLP&#xff09;任务。它在许多 NLP 任务中取得了重大突破&#xff0c;如机器翻译、文本…

【用unity实现100个游戏之17】从零开始制作一个类幸存者肉鸽(Roguelike)游戏3(附项目源码)

文章目录 本节最终效果前言近战武器控制近战武器生成升级增加武器伤害和数量查找离主角最近的敌人子弹预制体生成子弹发射子弹参考源码完结 本节最终效果 前言 本节紧跟着上一篇&#xff0c;主要实现武器功能。 近战武器 新增Bullet&#xff0c;子弹脚本 public class Bull…

java三大集合类--List

List Set Map 一、List 几个小问题&#xff1a; 1、接口可以被继承吗&#xff1f;&#xff08;可以&#xff09; 2、接口可以被多个类实现吗&#xff1f;&#xff08;可以&#xff09; 3、以下两种写法有什么区别&#xff1f; //List list1new List();是错误的因为List()…

ZKP15.2 Formal Methods in ZK (Part I)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 15: Secure ZK Circuits via Formal Methods (Guest Lecturer: Yu Feng (UCSB & Veridise)) 15.2 Formal Methods in ZK (Part I) Circuits Workflow Source Code: Witness Generation and ConstraintsWitness Generatio…

Java零基础——SpringMVC篇

1.SpringMVC介绍 SpringMVC是Spring框架中的一个组件&#xff0c;是一个轻量级的web的MVC框架&#xff0c;充当controller,其本质就是一个Servlet。 1.1 传统Servlet的不足 每个请求&#xff0c;都需要定义一个Servlet。虽然可以在service方法中&#xff0c;根据业务标识进行…

HCIP---MPLS---LDP

文章目录 目录 文章目录 前言 一.LDP基本工作机制 LDP工作原理概述 LDP对等体&#xff1a; 二.本地LDP会话自动建立过程 三.LDP优化 PHP机制&#xff1a; 四.LDP配置 总结 前言 MPLS 基于标签转发表进行转发&#xff0c;与路由表类似&#xff0c;标签转发表有两种获取渠道&a…

【Rust】快速教程——自定义类型、数字转枚举、Cargo运行

前言 超过一定的年龄之后&#xff0c;所谓人生&#xff0c;无非是一个不断丧失的过程而已。宝贵的东西&#xff0c;会像梳子豁了齿一样从手中滑落下去。你所爱的人会一个接着一个&#xff0c;从身旁悄然消逝。——《1Q84》 \;\\\;\\\; 目录 前言自定义类型数字转枚举Cargo.tom…