前言
时钟好比MCU的心跳,只有时钟正常了,MCU的核及外设才能正常工作。从源头到系统到外设理解每一个时钟的来源及其具体值才能方便后面理解MCAL的GPT,PWM,ICU等模块的配置(MCAL模块中的Tick数就是基于模块时钟的)。本系列文章就来详细介绍TC3xx芯片的时钟系统及其具体配置。本文为TC3xx芯片时钟系统的时钟源详解。
缩略词
简写 | 全称 |
OSC | Oscillator Circuit |
PLL | Phase-Locked Loop |
DCO | Digitally Controlled Oscillator |
注:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!
正文
晶振好比人的心脏,晶振产生的时钟脉冲好比心脏产生的心跳,所以,晶振对于MCU来讲必不可少,晶振没有起振,MCU必定无法工作。
无源晶振又名“无源晶体”、“石英晶体谐振器”,英文名Crystal或Crystal Resonator。有源晶振又称“石英晶体振荡器”,英文名Crystal Oscillator。
无源晶振一般有两个引脚,无极性。它自身无法振动, 一般外部都接有两个10-22PF的瓷片电容。
无源晶振参考电路无源晶振信号质量较差,通常需要精确匹配外围电路(用于信号匹配的电容、电感、电阻等),更换不同频率的晶体时周边配置 电路也需要做相应的调整。一般建议采用精度较高的石英晶体。
有源晶振有4只引脚,是一个完整的振荡器,其中除了石英晶体外,还有晶体管和阻容元件,因此体积较大。有源晶振的封装有4个引脚,分别为VCC (电压)、GND (地)、OUT (时钟信号输出)、NC (空脚)。
有源晶振参考电路有源晶振不需要CPU的内部振荡器,信号稳定,质量较好,且连接方式比
较简单(主要做好电源滤波,通常使用一个电容和电感构成滤波网络,输出端用一个小阻值的
电阻过滤信号即可) , 不需要复杂的配置电路。
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
振荡器电路是一种 Pierce 振荡器(Pierce oscillator),设计用于与外部晶体(external crystal) / 陶瓷谐振器(ceramic resonator)或外部稳定时钟源(external stable clock source)配合使用。 该电路由一个反向放大器组成, XTAL1 作为输入, XTAL2 作为带有集成反馈电阻的输出。
使用外部输入时钟模式时,外部时钟信号连接到OSC模块的XTAL1引进,XTAL2引脚保持悬空状态。
Figure 1 AURIX™ TC3xx Platform Direct Clock Input
如果在正常模式直接使用外部时钟提供的时钟信号时,不使用外部晶体 / 陶瓷谐振器并绕过振荡器,则输入频率需要等于或大于 PLL 的 DCO 输入频率 (该值在Data sheet中列出)。
Figure 2 显示了两种工作模式的推荐外部电路:外部晶体 / 陶瓷谐振器模式 (带和不带外部组件)。
Figure 2 External Circuitry for Crystal / Ceramic Resonator operation
Oscillator Circuit Control Register用来配置OSC模式和晶振频率。主要用到的配置位域为:OSCCON.MODE 配置晶振模式
OSCCON.OSCVAL配置晶振频率
OSCCON.PLLLV标识OSC频率是否可用
OSCCON.PLLHV标识OSC频率是否可用
只有配置了OSC后,外部晶振才能作为时钟源工作。
Power-on复位后OSC模块是被disabled,需要重新配置。在任何其他重置过程中和之后,振荡器不会受到影响,并按照先前配置的方式工作,这种情况下不需要重新配置。
可以通过SSW来配置OSC,也可以在App中直接配置OSC。值得注意的是:OSCCON寄存器是受Endinit保护的,配置的时候需要解锁Endinit。
参考文档:
通过配置 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 时的可用晶体频率范围和允许的频率范围。
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.
备用时钟源可用作备用时钟源。此时钟源提供稳定但可靠的时钟源,可用作系统的时钟源。它提供的准确度低于外部晶体或陶瓷谐振器。不能启用或禁用备份时钟,也不能通过其他方式控制备份时钟,以阻止其常规操作。因此,除了选择备份时钟作为源 (CCUCON0.CLKSEL = 00B 作为时钟分配的时钟源, SYSPLLCON0.Insel = 00B 作为两个 PLL 的时钟源) 外,没有可用的控制位。
需求:配置使用一个20MHz的外部无源晶振。
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)0x00000005;
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;
}
Note:下一篇文章介绍TC3xx芯片时钟系统的锁相环PLL.
End
「汽车电子嵌入式在CSDN上同步推出AUTOSAR精进之路专栏,本专栏每个模块完全按实际项目中开发及维护过程来详细介绍。模块核心概念介绍、实际需求描述、实际工程配置、特殊需求介绍及背后原理、实际工程使用经验总结。目的是让读者看完每一个章节后能理解原理后根据需求完成一个模块的配置或者解决一个问题。」
点击文章最后左下角的阅读原文可以获取更多信息
或者复制如下链接到浏览器获取更多信息
https://blog.csdn.net/qq_36056498/article/details/132125693
文末福利
2.为便于技术交流,创建了汽车电子嵌入式技术交流群,可尽情探讨AP,CP,DDS,SOME/IP等前沿热点话题,后台回复“加群”即可加入;
注:本文引用了一些第三方工具和文档,若有侵权,请联系作者删除!
推荐阅读
汽车电子嵌入式精彩文章汇总第一期:20210530-20230703
AUTOSAR 架构下EcuM唤醒源事件详解
AUTOSAR架构下NVM Block连续写及Default Value问题分析
AUTOSAR架构下NvM模块详细分析
AUTOSAR架构下报文掉线超时不上报问题分析
Classic Autosar下的以太网通讯架构概览
通信中间件Someip服务化通信
AUTOSAR架构下Fee详细分析
TC37x芯片FLASH基本概念介绍
AUTOSAR架构下Fls详细分析
TC3xx芯片DMU介绍
TC3xx芯片MPU介绍
TC3xx芯片的Trap详解
AUTOSAR架构下的OS错误处理
AUTOSAR架构下QM Application如何访问ASIL Application
AUTOSAR架构下多核启动
TC3xx芯片的Trap详解(二)
AUTOSAR架构下多核Shutdown
AUTOSAR架构下多核通信
RH850U2A芯片平台Spinlock的底层实现
End
欢迎点赞,关注,转发,在看,您的每一次鼓励,都是我最大的动力!
汽车电子嵌入式
微信扫描二维码,关注我的公众号