电子说
正文
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内部的振荡电路) 才能产生振荡信号, 自身无法振荡。
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。
参考文档:
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)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; }
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !