时钟源

博客作者:Mark Harris

微控制器依赖于其时钟源。处理器、总线和外围设备都使用时钟来同步它们的操作。时钟决定了处理器执行指令的速度,因此它对性能至关重要。但是,时钟源到底有多重要?微控制器中的时钟频率是什么?它的精度有多重要?简单来说,这取决于……微控制器正在执行的任务及其接口。

需要考虑的两个要素是:时钟的速度,它决定了事情发生的快慢;以及时钟的准确度,它决定了每个时钟周期之间的一致性,以及时钟随时间可能发生的变化。

为什么时钟源很重要

微控制器的中央处理器可以被认为是执行特定功能的同步逻辑块链。如果系统微控制器时钟运行得太慢,则处理时间会更长。如果时钟运行得太快,则可能没有足够的时间在下一组开始之前完成所需的操作——处理器与从动态内存到接口引脚等一系列不同的元件模块连接。时钟速度的任何显著误差都会对微控制器内部操作产生不可预测的后果。

数据采样

微控制器时钟信号将控制任何模数操作的转换速率。时钟的速度将决定对模拟信号进行采样的最大速率;时钟的精度将决定采样率的准确性。假设您每秒记录两次带有时间戳的样本。在该情况下,时钟频率出现1%的误差(在内部振荡器中并不少见)很快就会消除样本时间戳与挂钟上显示的时间之间的任何关联。如果时钟源有1%的恒定偏移,您的样本时间戳每天将误差超过14分钟。

波形生成

在数据采样方面,微控制器的时钟信号将控制任何数模操作的转换速率。时钟的速度将决定可以为模拟信号生成的最大频率。时钟的准确性将决定生成波形的准确性。

异步串行通信

微控制器时钟信号的一个关键应用是管理异步通信,其中时钟信号决定何时对输入数据流进行采样,一旦接收到起始位,并确定输出数据流中每个数据位之间的转换时间波形。

在异步通信中,发射器和接收器依赖于相同的时钟速度来编码和解码数据流。但这些时钟不需要同步;它们只需要有足够的相等时钟频率。这是因为接收器在检测到信号线上的第一个边缘时开始处理传入的数据流。然后它需要在数据流的持续时间内保持正确的时钟速度,以便在正确的时间对数据位进行采样。所需精度将取决于必须对数据进行采样的窗口。每个数据位都可能具有其信号的上升沿和下降沿,其中数据的值是不确定的,当数据有效并且可以被采样时,就会在边缘之间留下周期。

这个采样周期将取决于通信链路的类型和长度。长传输距离和高电容电缆会增加上升和下降时间。噪声的存在也可能增加信号稳定所需的时间。

它还将取决于时钟速度和消息格式。对于短数据流,精度要求可能相对宽松,因为每次接收到新数据流时采样时钟都会重置。然而,对于具有长数据流的高速串行通信,所需的精度可能会变得更加精确。例如,CAN总线协议使其对系统时钟偏移非常敏感,以至于使用任何非晶体时钟信号源都可能存在问题。

以UART设备为例,我们可以看到绝对时钟速率并不重要,因为UART接收器会在每一帧开始时自行同步。该问题简化了可以容忍的发送和接收UART时钟之间的差异。

时钟源选项

在为特定微控制器选择时钟源时,通常有几个不同的选项可供选择。具体选项将取决于您将使用的微控制器时钟的品牌和型号,因此我们将在这里讨论所有标准选项。

这些不同的选项主要通过其准确性、成本和元件数量来区分。使用所有优质微控制器都包含的内部时钟源将是最便宜且最简单的选项,但通常也最不准确。使用外部时钟源将提高精度,但代价是需要将额外的元件添加到电路板并增加设计的复杂性。

选择哪个选项将取决于您需要什么样的性能以及您在电路板空间和预算方面的限制。由于为任何给定微控制器生成时钟信号总是有几个备选方案,因此请研究您的特定器件的数据手册。这通常会提供一些有关您可以使用哪些类型的时钟源以及如何最好地实现它们的有用信息。

内部振荡器

微控制器通常带有一个内部电阻电容振荡器,以产生一个基本的时钟信号和一个锁相环以提供频率倍增功能。然而,使用内部振荡器的问题是它们的精度远低于频率稳定性较差的外部振荡器。微控制器芯片内部的任何RC电路都不是理想的位置,这是由于RC电路对高温的依赖性和元件公差固有的较大范围。通常,具有良好热管理的微控制器可以提供精度在1%到5%范围内的时钟信号。这对于一些较慢的异步通信总线和管理低频模拟信号处理来说可能已经足够好了。尽管如此,在大多数典型应用中,这仍然不够准确。

可能值得一提的是,通过使用锁相环,可以用更准确的外部时钟信号校正内部时钟信号,以提高内部振荡器的性能。然而,如果外部时钟信号可用,那么使用它而不是内部时钟更有意义,除非微控制器有任何特定的约束条件会阻止这样做。

外部振荡器

微控制器的时钟源有两种主要类型:机械谐振器,包括晶体和陶瓷谐振器,以及无源RC振荡器。

振荡器的最基本形式是RC电路,它仿效内部振荡器电路,但使用精度值更高的元件,并使用热管理技术将元件与微控制器时钟和电路的任何其他热元件产生的热量隔离开来。虽然这可以将精度提高至少一个数量级,但对于外部振荡器来说,这仍然是最不准确的选择,并且对于相对相似的成本和封装尺寸,还有更好的解决方案可供选择。RC电路生成的时钟也会受到电源电平波动的影响,并且容易受到电气干扰,从而限制了它们在大多数典型应用中的实用性。

晶体振荡器是最常见的外部振荡器,需要精确的时钟信号。石英晶体和支持电路提供了出色的稳定性和精度。典型的低成本晶体振荡器的精度可以优于百万分之一,除最具时间敏感性的应用以外,可满足所有应用的要求。但是,石英晶体可能会受到环境因素的影响,需要额外的保护。石英晶体的支持电路也可能导致高阻抗输出,需要与电路的其余部分进行额外的阻抗匹配。如果预算允许,使用现成的晶体振荡器模块而不是离散元件可以降低对环境影响的敏感性,并使电路板设计更加简单。它们通常提供低阻抗方波输出,从而简化了与电路设计其余部分的集成,其精度与使用离散晶体非常相似。

另一种选择是基于IC谐振器电路的硅振荡器,它易于实现,精度约为0.05%。比外部RC电路略好,但远不及晶体振荡器。然而,硅振荡器比晶体振荡器更坚固可靠,非常适合器件可能受到严重机械振动的操作环境。

最后,还有陶瓷谐振器可供选择,其精度虽然不如晶体振荡器,但比硅振荡器更精确。它们基于压电式陶瓷材料,使用谐振机械振动来生成时钟信号。其主要优势在于采用简单的集成封装,比晶体振荡器及其支持元件占用空间更小。然而,与晶体振荡器一样,它们对环境因素很敏感,包括温度、湿度、振动和电气干扰。

在选择外部振荡器时,功耗可能是一个重要的决定性因素。离散振荡器电路的功耗主要由反馈放大器的电源电流及其电容值决定。一个典型的晶体振荡器电路会消耗数十毫安电流。陶瓷谐振器电路通常需要比晶体振荡器更大的负载电容值,因此需要更多的功率。硅振荡器的功耗主要与工作频率成正比。不过,它们有多种选项可供选择,从消耗几毫安电流的低功耗设备到消耗数十毫安的标准设备。

结论

总而言之,您需要为微控制器使用的时钟信号类型主要取决于其嵌入的器件性质及其操作环境。与高速异步通信总线和高频模拟信号的接口将需要精确的时钟信号。假设器件需要在恶劣的环境中运行,无论是在广泛的温度范围内,还是在高电磁干扰水平下,或是受到机械振动的影响,这都可能限制可选方案。对于没有如此时间敏感或环境挑战性的微控制器时钟,可以采用更便宜的解决方案。

来源:Altium

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 19

最近碰到一个客户,他们在 i.MX RT500 上使能了 FlexSPI->MCR0[RXCLKSRC] = 2(即 loopbackFromSckPad),这个选项字面上的意思是设置读选通采样时钟源为 SCK 引脚,这个选项在恩智浦官方的代码包里未曾使能过。

客户在使用过程中遇到高频时 SCK 引脚被降压的问题(从正常的 1.8V 降至 1.2V),那么这个 loopbackFromSckPad 选项到底是什么作用,以及有什么使用限制呢?

注1: 参考手册里显示支持loopbackFromSckPad选项的型号有 i.MX RT1040/1050/1060/1064/1180/500

注2: 参考手册里没有提及支持loopbackFromSckPad选项的型号有 i.MX RT1010/1015/1020/1024/1160/1170/600

一、为什么存在Read Strobe?

对于串行 SPI 接口存储器,FlexSPI 外设主要支持如下两种读数据时序:一是所谓的经典 SPI 模式,IO0 (MOSI) 专用于发送命令和地址,IO1 (MISO) 专用于接收数据(图中上面的时序)。二是 Multi-I/O SPI 模式,SIO[n:0] 一起用于发送命令地址以及接收数据(图中下面的时序)。

显然经典 SPI 模式下 IO[1:0] 是单向的,而 Multi-I/O SPI 模式下,SIO[n:0] 是双向的。当 SIO 用于双向传输时,过程中必然存在引脚方向切换,而 FlexSPI 外设在处理 SIO 方向切换时,无法做到零等待周期读取数据,这就是为什么 Multi-I/O SPI 读时序中总是会存在 Dummy 周期。

1.png

因为 Dummy 周期的存在,FlexSPI 外设内部实际上有一个 Read Strobe 信号(即 DQS)来控制数据的选通性(即什么时候开始数据有效,将数据存入内部 FIFO)。更直白点说,Read Strobe 信号的存在就是由于 FlexSPI 外设无法支持如下这种情况的读时序(下图中 COMMAND 实际应为 COMMAND&ADDR)。

2.png

二、FlexSPI内部Read Strobe设计

在i.MX RT参考手册里有如下 FlexSPI 前端采样单元框图,其中 ipp_ind_dqs_fa/b_int[x] 即是 Read Strobe 信号,它控制着 FIFO 中实际数据的存储。

3.png

ipp_ind_dqs_fa/b_int[x] 信号共有四种来源,最原始的信号源由 FlexSPI->MCR0[RXCLKSRC] 选择,中间可能还会经过 DLLxCR 单元(这部分以后会另写文章单独介绍)、Phase Chain 单元做处理,然后送到采样单元里。

4.png

下图是 FlexSPI->MCR0[RXCLKSRC] = 0 的情况,此时 Read Strobe 经由 ipp_do_dqs0_fa/b 纯内部 loopback 回来,没有经过任何延迟单元。这种配置一般仅用于经典 SPI 传输模式(低速 60MHz SDR 场合),适用低容量 SPI NOR / EEPROM,这时候 FlexSPI DQS Pad 可用作其它功能或者 GPIO。

5.png

下图是 FlexSPI->MCR0[RXCLKSRC] = 1 的情况,此时 Read Strobe 经由悬空的 DQS 引脚 ipp_do_dqs1_fa/b 再 loopback 回来,此时有了 DQS 引脚绕一圈的延迟。这种配置可用于 Multi-I/O SPI 传输模式(较高速 133MHz SDR 场合),适用不含 DQS 引脚的大容量 QuadSPI NOR Flash,但是 FlexSPI DQS Pad 需要悬空。

注: 有一篇旧文 《使能串行NOR Flash的DTR模式》 跟这种配置相关,这时候 dummy cycle 数的设置很关键。

6.png

下图是 FlexSPI->MCR0[RXCLKSRC] = 3 的情况,此时 Read Strobe 完全由外部存储器的 DQS 引脚输出 ipp_ind_dqs3_fa/b 直通进来。这种配置可用于 Multi-I/O SPI 传输模式(最高速 166MHz/200MHz DDR 场合),适用于包含 DQS 引脚的 OctalSPI NOR Flash,这时 FlexSPI DQS Pad 与外部存储器相连。

注: 我有两篇旧文 《串行NOR Flash的DQS信号功能》、《启动含DQS的Octal Flash可不严格设Dummy Cycle》 跟这种配置相关。

三、loopbackFromSckPad选项意义

前面铺垫了那么多,终于来到本文的主题了,即下图 FlexSPI->MCR0[RXCLKSRC] = 2 的情况,此时 Read Strobe 经由 SCK 引脚 ipp_ind_sck_fa/b 再 loopback 回来,此时有了 SCK 引脚绕一圈的延迟。

这种配置从应用角度与 FlexSPI->MCR0[RXCLKSRC] = 1(即 loopbackFromDqsPad) 差不多,也可用于 Multi-I/O SPI 传输模式(较高速 133MHz SDR 场合),适用不含 DQS 引脚的大容量 QuadSPI NOR Flash,但是这时候 FlexSPI DQS Pad 被解放出来了,这也是它的最主要意义。

7.png

别小看只是省了一个 DQS 引脚,也许你认为 i.MX RT 有那么多I/O ,省一个引脚意义不大,但是如果某些 FlexSPI 引脚组不带 DQS 信号,你又想配置 FlexSPI 以 60MHz 以上频率去访问 Flash,这时候 FlexSPI->MCR0[RXCLKSRC] = 2 选项就会帮上大忙了,见旧文 《不支持DQS的FlexSPI引脚组连接串行NOR Flash注意事项》

四、loopbackFromSckPad使用限制

FlexSPI->MCR0[RXCLKSRC] = 2 选项虽好,但有如下两个实际使用限制:

  • 存在信号完整性问题:主要出现在 SCK 频率过高或者板级 PCB 上 SCK 信号走线过长时。

  • SCK自由运行模式下不可用:对于某些 FPGA 应用,有时需要设置 FlexSPI->MCR0[SCKFREERUNEN] = 1,即 SCK 需要持续给外部设备内部 PLL 提供参考时钟。

来源:恩智浦MCU加油站

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 20

作者 | strongerHuang

微信公众号 | 嵌入式专栏

STM32CubeMX中Cortex系统定时器(System Timer)选择1分频和8分频,为啥生成代码一样?

“STM32的SysTick时钟源来自哪里?"

因为STM32CubeMX会启动SysTick作为延时(HAL_Delay)函数的时基,而SysTick作为Cortex内核的一部分,就会用到Cortex系统定时器。

那么,问题就来了SysTick时钟源来自哪里?

1、数据手册和STM32CubeMX时钟树

数据手册时钟树:

“STM32的SysTick时钟源来自哪里?"

STM32CubeMX时钟树:

“STM32的SysTick时钟源来自哪里?"

你会发现:数据手册中的只有『/8』分频,而STM32CubeMX除了『/8』分频,还有『/1』分频。

2、SysTick时钟初始化代码

不管是使用标准外设库,还是HAL库,你初始化SysTick,都会调用内核中的SysTick_Config函数。

标准库常用初始化:

SysTick_Config(SystemCoreClock / 1000);

HAL库初始化同样也是调用底层的初始化函数:

uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb)
{
   return SysTick_Config(TicksNumb);
}

初始化调用这段代码之后,SysTick将会实现1ms中断一次。

这段代码实现1ms中断一次相信大家都能理解,但是这里SysTick初始化和上面说的时钟『/8』有关系吗?

3、SysTick时钟源是来自哪里?

这个问题只要认真看参考手册都能找到答案。

RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SysTick)的外部时钟。

通过对SysTick控制与状态寄存器的设置,可选择上述时钟或Cortex(HCLK)时钟作为SysTick时钟。(--来自参考手册)

也就是说SysTick时钟源可以来自两个地方:

  • AHB时钟8分频

  • HCLK(内核)时钟

通过SysTick控制与状态寄存器的设置进行选择时钟源。

具体就是通过CLKSOURCE(时钟源)这一Bit位来选择:

“STM32的SysTick时钟源来自哪里?"

再次看SysTick_Config函数源码:

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
  {
    return (1UL);                                                   /* Reload value impossible */
  }

  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */
  return (0UL);                                                     /* Function successful */
}
(在core_cm3.h,或者core_cm4.h等内核源码中)

你会发现,其实源码已经默认使用HCLK(内核)时钟。

而SysTick_Config函数属于内核(如core_cm3.h)已经写好源码,一般我们不去修改。

所以,到这里,你会明白:SysTick时钟源其实就是用的HCLK(内核)时钟。

4、最后

开篇的问题:STM32CubeMX中Cortex系统定时器(System Timer)选择1分频和8分频,为啥生成代码一样?

“STM32的SysTick时钟源来自哪里?"

难道,STM32CubeMX配置Cortex系统定时器时钟是有Bug吗?

来源:嵌入式专栏
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 111
订阅 RSS - 时钟源