前言
ARM内核微控制器集成了多种内部RC振荡器作为时钟源,其中包括HSI16(高速内部)、MSI(多速内部)、LSI(内部低速)、HSI48(内部高速)和SHSI(内部安全RC振荡器)。这些时钟源为系统时钟和特定外设提供精确的时钟信号。然而,振荡器的精度受工作温度影响,因此ARM内核微控制器提供了校准功能以确保时钟的准确性。
内部时钟源概述:
- HSI16:典型频率为16MHz,适用于需要高速时钟的应用。
- MSI:多速低功耗时钟源,可灵活配置以适应不同功耗和性能需求。
- LSI:32kHz低速内部时钟,常用于低功耗模式或唤醒定时器。
- HSI48:48MHz高速内部时钟,专为USB、RNG(真随机数发生器)和SDMMC等外设设计。
- SHSI:48MHz内部安全RC振荡器,专用于为SAES外设提供时钟。
时钟源精度与温度影响:
时钟源的精度随温度变化而变化。例如,HSI16在30°C时的精度为±0.5%,但在-40°C至125°C范围内精度会降低。为了补偿这种影响,ARM内核微控制器提供了内部校准机制。
校准方法:
- 基于最小误差的频率校准:通过调整振荡器的控制参数,找到与参考时钟相比具有最小误差的频率。
- 基于最大允许频率误差的校准:在允许的误差范围内调整振荡器频率,以满足系统要求。
- 预先测量值表搜索:使用预先测量的校准值表,根据系统条件搜索相应的校准值。
对于LSI振荡器的校准,通常通过连接到定时器的输入捕获功能来实现其频率的测量。
1 arm内核微控制器系统时钟源详解
arm内核微控制器通常为系统时钟提供了多种时钟源选项,确保在各种应用场景下都能获得可靠且高效的时钟信号。以下是这些时钟源的详细介绍:
-
HSI16:这是一款高速内部RC振荡器,其典型频率高达16MHz。HSI16以其低功耗(仅150μA)和快速启动时间的特性,为需要高性能且成本效益高的应用提供了理想的时钟源。
-
HSE:HSE代表高速外部振荡器,其频率范围在4至50MHz之间。HSE提供了更高的时钟频率精度和稳定性,适用于对时钟精度要求极高的应用。
-
MSI(MSIS):MSI是一款独特的多速内部RC振荡器,其频率范围从100kHz到48MHz可调。MSI基于四个内部RC振荡器(MSIRC0至MSIRC4),每个振荡器均配备四个分频器(/1、/2、/3和/4),为用户提供了多达16个频率选择。MSI不仅为系统时钟(MSIS)提供了稳定的时钟信号,还为外设内核时钟(MSIK)提供了支持。此外,MSI的设计使其工作电流与频率成正比,因此在CPU运行于低频时,能显著降低内部振荡器的功耗。
-
PLL:PLL(锁相环)是STM32U5系列中一款灵活的时钟乘法器,其频率范围从1MHz到160MHz。PLL可以由HSI16、MSI或HSE振荡器提供时钟源,通过调整PLL的乘数因子,用户可以轻松调整系统时钟的频率,以适应不同的应用需求。
-
HSI48:HSI48是一款内部48MHz RC振荡器,专为USB、RNG(真随机数发生器)和SDMMC(SD/SDIO MMC卡主机接口)等外设设计。HSI48提供了稳定且可靠的时钟信号,确保这些外设能够正常工作。
内部RC振荡器(HSI16、MSI和HSI48)因其低成本(无需外部元件)、快速启动时间和低功耗的特性而备受青睐。然而,与外部晶振或陶瓷谐振器相比,内部RC振荡器的频率精度稍逊一筹。为了提高内部RC振荡器的精度,arm微控制器提供了校准功能,用户可以通过软件对HSI16、MSI和HSI48振荡器进行校准,以获得更高的时钟精度。
此外,arm微控制器还具备外部振荡器故障检测功能。一旦检测到外部振荡器发生故障,系统将自动切换到MSI内部RC振荡器作为备份时钟源(辅助时钟),确保系统时钟的稳定性和可靠性。
图1 ARM内核MCU时钟示意图
1.1 ARM微控制器的次级时钟源概述
微控制器不仅提供了多样化的系统时钟源选项,还嵌入了一系列次级时钟源,这些时钟源虽不能直接用作系统时钟,但在特定应用中发挥着重要作用。以下是这些次级时钟源的详细介绍:
-
LSI(低速内部RC):LSI是一个32kHz的低速内部RC振荡器,专为低功耗应用设计。即使在停机和待机模式下,LSI也能保持运行,为IDWG(独立看门狗)、RTC(实时时钟)和LCD等关键功能提供时钟信号。需要注意的是,LSI振荡器无法校准,但其频率偏差可通过测量来评估,以便根据温度和电压变化进行必要的调整。
-
LSE晶振:LSE是一个可选的32.768kHz低速外部晶振RC,专门用于驱动RTC(实时时钟)。通过连接LSE晶振,用户可以获得更高的时钟精度,确保RTC时间的准确性。
-
HSI48:HSI48是一个48MHz的高速内部RC振荡器,专为USB外设提供高精度时钟而设计。它通过一个特制的CRS(时钟恢复系统)电路,确保USB通信的稳定性和可靠性。此外,HSI48还可用于驱动RNG(真随机数生成器)和SDMMC(SD/SDIO MMC卡主机接口)等外设。
-
MSIK:MSIK是多速内部RC振荡器时钟的一个分支,专门用于为外设内核提供时钟信号。它源自MSIRCx振荡器,并为用户提供了灵活的时钟选项,以适应不同外设的需求。
-
SHSI:SHSI是一个48MHz的内部RC振荡器,专为SAES外设提供时钟。它确保了SAES外设的精确时钟需求,为用户提供了安全可靠的加密和哈希处理功能。
这些次级时钟源不仅丰富了微控制器的功能,还为用户提供了更多的灵活性和选择空间。通过合理配置这些时钟源,用户可以根据具体应用的需求,优化系统的性能和功耗。
2 内部RC振荡器的校准与优化
鉴于生产过程中的微小差异,每个MCU微控制器内部的MSI和HSI16 RC振荡器的频率都可能有所不同。为了确保这些内部时钟源的准确性和稳定性,半导体在出厂时会对这些振荡器在TA = 30°C的温度条件下进行校准。当器件复位后,这些工厂校准值会自动加载到内部校准寄存器中。
然而,为了进一步提高振荡器在更广泛的温度和供电条件下的精度,用户可以对内部RC振荡器的频率进行微调。这就是微调位的作用所在,它们允许用户根据实际应用的需求调整振荡器的频率。
2.1 HSI16振荡器调整方法
对于HSI16振荡器,复位后,其校准值会加载到HSICAL[11:0]寄存器中。用户可以通过调整五个微调位HSITRIM[4:0]来对HSI16的频率进行微调。默认情况下,微调值设置为16,这意味着HSI16的频率将保持为出厂校准的默认值。
用户可以根据需要增加或减少微调值,从而相应地增加或减少HSI16的频率。具体来说:
- 将微调值设置为17至31时,HSI16的频率将增加。
- 将微调值设置为0至15时,HSI16的频率将降低。
- 将微调值保持为16时,HSI16的频率将维持默认值。
HSI16振荡器的微调步长约为0.18%,即大约29kHz。这意味着每次微调都能带来精确的频率调整,以满足特定应用的需求。
下面的图表展示了HSI16振荡器频率随校准值变化的情况。随着校准值的增加(即默认的HSICAL[11:0]值加上HSITRIM[4:0]微调值),HSI16振荡器的频率也会相应增加。这种灵活性使得ARM微控制器能够适应更广泛的应用场景,并提供更高的时钟精度。
图 2. HSI16 振荡器微调特性
2.2 MSIRCx 振荡器的校准与微调
ARM微控制器中,MSIRCx(x = 0..3)振荡器提供了灵活的时钟源选项。为确保这些内部RC振荡器的准确性,复位后,半导体厂商预设的校准值会加载到MSICALx[4:0]位中。然而,为了进一步提高时钟的精度,以适应不同应用场景下的温度和电压变化,芯片提供了五个微调位MSITRIM[4:0],允许用户对MSIRCx的频率进行微调。
校准过程基于将默认的MSICALx[4:0]值(复位值)与MSITRIMx[4:0]微调值相加。最终的结果将存储在MSICALx[4:0]寄存器中,计算公式为:MSICALx[4:0] = 默认的MSICALx[4:0] + MSITRIMx[4:0]。
以下是几个校准和微调的示例:
-
增加MSIRCx频率:
假设默认的MSI校准值MSICALx[4:0]为0x10。将0x01至0x0F之间的值写入MSITRIM[4:0]寄存器,会使校准值MSICALx[4:0]在0x11至0x1F的范围内变化。这表示MSIRCx的频率将增加1步(当MSITRIM[4:0]为0x01时,即0x11 - 0x10)至15步(当MSITRIM[4:0]为0x0F时,即0x1F - 0x10)。 -
降低MSIRCx频率:
同样,如果默认的MSI校准值为0x10,而将0x11至0x1F之间的值写入MSITRIM[4:0]寄存器,会导致校准值MSICALx[4:0]在0x01至0x0F的范围内。这表示MSIRCx的频率将降低1步(当MSITRIM[4:0]为0x11时,即0x01)至15步(当MSITRIM[4:0]为0x1F时,实际上是循环回到较低的校准值,因为MSICALx[4:0]是一个5位的寄存器)。 -
恢复到默认频率:
如果在MSITRIM[4:0]中写入与默认校准值相同的值(如0x10),则会导致MSICALx[4:0]的值变为0x00(因为5位加法会导致溢出)。在这种情况下,MSIRCx的频率将降低到其可能的最低值,即减少了16步。
通过仔细调整MSITRIM[4:0]的值,用户可以精确地控制MSIRCx振荡器的频率,以满足特定应用的需求,并在更广泛的温度和电压条件下实现更稳定的时钟性能。
图3 MSIRCx 振荡器调整的结果
2.3 HSI48振荡器的校准与微调
STM32U5微控制器中的HSI48振荡器,作为一个高精度内部时钟源,用于为USB外设等提供稳定的时钟信号。为确保其准确性和稳定性,复位后,意法半导体预设的校准值会加载到HSI48CAL[8:0]寄存器中。然而,为了应对不同工作条件下的微小频率偏移,STM32U5提供了六个微调位TRIM[6:0](位于CRS_CR寄存器中),允许用户对HSI48振荡器的频率进行微调。
默认情况下,微调值被设置为64,这意味着HSI48振荡器将按照出厂校准的默认频率运行。然而,用户可以根据实际需求,通过调整TRIM[6:0]的值来改变HSI48的频率。
HSI48振荡器的微调步长约为0.12%,即大约57kHz。这意味着每次微调都能带来精确的频率调整,以满足不同应用的需求。具体调整规则如下:
- 将微调值设置为65至127时,HSI48的频率将增加。具体来说,每增加1个微调值(从64开始),HSI48的频率就会上升约0.12%。
- 将微调值设置为0至63时,HSI48的频率将降低。同样地,每减少1个微调值(从64开始),HSI48的频率就会下降约0.12%。
- 当微调值保持为64时,HSI48的频率将维持默认值,即出厂校准的频率。
通过调整TRIM[6:0]的值,用户可以精确地控制HSI48振荡器的频率,确保其在各种工作条件下都能提供稳定的时钟信号。这种微调功能为USB通信、加密处理等需要高精度时钟的应用提供了极大的便利。
此外,图4(微调单调性图)直观地展示了HSI48振荡器频率随校准值(即默认的HSI48CAL[8:0]值加上TRIM[6:0]微调值)增加的变化趋势,帮助用户更好地理解微调效果。
图4 微调单调性图
3 校准原理
在ARM微控制器中,内部RC振荡器(如HSI16或MSIRCx)的校准对于确保系统时钟的准确性至关重要。以下是校准这些内部振荡器的基本原理和步骤:
- 设置内部RC振荡器为系统时钟:
- 首先,需要将需要校准的内部RC振荡器(HSI16或MSIRCx)设置为系统的时钟源。
- 测量内部RC振荡器频率:
- 对于每个微调值(TRIM位),测量内部RC振荡器的频率。由于直接测量振荡器频率可能不可行,通常使用定时器来计数振荡器产生的时钟脉冲个数。
- 通过将定时器设置为与内部RC振荡器同步,并在固定时间内计数脉冲个数,可以间接测量振荡器的频率。
- 计算频率误差:
- 将测量得到的频率与已知的参考频率进行比较,计算出频率误差。参考频率必须是一个非常精确的值,以确保校准的准确性。
- 常用的参考频率源包括外部32.768 kHz晶振或50 Hz/60 Hz的电源频率。
- 设置最优微调值:
- 根据测量的频率误差,确定最优的微调值(TRIM位设置),使得内部RC振荡器的频率最接近目标值或误差最小。
- 将微调位设置为这个最优值,以校准内部RC振荡器。
注意:内部振荡器频率并非直接测量,而是通过定时器计数时钟脉冲个数,并与典型值或参考频率进行比较来间接测量。
图 5. 内部振荡器校准时序图
图5显示了使用定时器来测量参考信号周期的时序图。这个图解释了如何使用定时器来计数参考信号(如外部晶振或电源频率)的周期数,以便与内部RC振荡器产生的周期数进行比较。这种比较可以用于确定内部RC振荡器的频率误差,并进一步确定微调值以校准振荡器。
3.1 内部RC振荡器的校准流程
校准内部RC振荡器(如HSI16、HSI48或MSIRCx)是确保微控制器系统时钟准确性的关键步骤。
3.1.1 初始化与测量
-
启动定时器计数:首先,启动一个定时器(如TIMx),并配置其输入捕获功能以捕捉参考信号的上升沿。
-
捕获并存储计数值:
- 当参考信号(如外部晶振或电源频率)的第一个上升沿到来时,定时器会捕获当前的计数值,并将其存储在
IC1ReadValue1
中。 - 当第二个上升沿出现时,定时器再次捕获计数值,并存储在
IC1ReadValue2
中。
- 当参考信号(如外部晶振或电源频率)的第一个上升沿到来时,定时器会捕获当前的计数值,并将其存储在
-
计算参考信号周期:通过
IC1ReadValue2
和IC1ReadValue1
的差值,我们可以计算出参考信号的整个周期。 -
计算内部RC振荡器频率:由于定时器的时钟源是内部RC振荡器(HSI16或MSIRCx),我们可以利用已知的参考信号周期来计算内部RC振荡器的实际频率。具体的计算公式为:
测量频率 = (IC1ReadValue2 - IC1ReadValue1) 的倒数 × REFERENCE_FREQUENCY
这里,
REFERENCE_FREQUENCY
是参考信号的频率。 -
计算频率误差:频率误差是测量频率与期望的典型值(或目标值)之间的差值,以赫兹为单位。
频率误差(Hz) = |测量频率 - 典型值|
3.1.2 微调与稳定
-
写入微调值:通过调整微调位(TRIM)的值,我们可以对内部RC振荡器的频率进行微调。
-
等待稳定时间:在写入新的微调值后,振荡器的频率需要一段时间(通常为15微秒)来稳定到新的设定值。
-
频率过冲/下冲现象:在稳定期间,振荡器的频率可能会暂时高于或低于最终稳定值,这取决于微调步长的大小。在最坏的情况下,这种过冲/下冲变化可能达到整个微调范围内的2.5%,而在中等情况下约为1.5%。
3.1.3 校准优化
-
实施等待时间:在微调值更改和读取振荡器频率之间,必须实施一段等待时间,以确保频率已经稳定。
-
选择最优微调值:在对每个微调值进行误差计算后,算法会选择一个最优的微调值,该值对应的频率最接近典型值。然后,将这个最优值编程到微调位中。
-
重复校准(如需要):如果初始校准结果不满足要求,可以重复上述过程,尝试不同的微调值以获得更精确的结果。
请注意,具体的校准步骤和参数可能因不同的微控制器型号和内部RC振荡器类型而有所不同。因此,在实际应用中,请参照相关微控制器的数据手册和应用笔记进行校准操作。
3.2 硬件实现
3.2.1 用例 1:LSE 用作参考频率
在微控制器中,LSE(低频外部)时钟源可以直接连接到内部定时器通道,从而作为内部振荡器校准的精确参考频率源。这种设计大大简化了硬件连接,无需额外的外部电路或接口。
LSE连接
LSE晶振或振荡器需要连接到MCU的OSC32_IN
和OSC32_OUT
引脚。这两个引脚是专门为LSE时钟源设计的,提供了稳定的接口和时钟信号。
内部连接
微控制器内部具有灵活的时钟系统,能够将LSE时钟信号直接路由到定时器16的通道1。这种内部连接允许软件轻松地将LSE配置为内部RC振荡器校准的参考源。
图6 硬件连接图
图6显示了使用LSE作为参考频率时的硬件连接。在这个图中,LSE晶振/振荡器通过OSC32_IN
和OSC32_OUT
引脚与微控制器相连。微控制器的内部时钟系统负责将LSE时钟信号路由到定时器16的通道1,以便进行内部RC振荡器的校准。
通过这种方式,用户可以充分利用微控制器的内置功能,实现简单而精确的内部振荡器校准,无需额外的硬件开销。这有助于提高系统的整体性能和稳定性。
3.2.2 用例 2:其他源用作参考频率
除了LSE(低频外部)时钟源之外,微控制器还支持使用其他具有精确频率的信号作为内部振荡器校准的参考频率源。这为用户提供了更多的灵活性,特别是在需要特定频率校准或没有LSE晶振/振荡器可用的情况下。
外部参考频率源
任何能够提供稳定、精确频率的信号源都可以用作参考频率,例如主频率信号(如外部晶振产生的时钟信号)。这些信号源可以通过适当的接口和引脚连接到微控制器。
图 7:使用外部参考频率时的硬件连接
在图7中,展示了使用外部参考频率源进行内部振荡器校准的硬件连接示例。外部参考频率源通过适当的接口和线路连接到微控制器的定时器16通道1的引脚。这允许微控制器的内部时钟系统捕获参考信号的频率,并用于校准内部RC振荡器。
通过这种方式,用户可以灵活地选择适合其应用的参考频率源,并利用微控制器的内部校准功能来提高系统的时钟准确性和稳定性。
3.3 内部振荡器校准固件
本文提供的内部 RC 振荡器校准固件包括下列主要函数(在下载文件中提供):
uint32_t HSI16_CalibrateMinError(void);
ErrorStatus HSI16_CalibrateFixedError(uint32_t MaxAllowedError,uint32_t* Freq);
ErrorStatus HSI16_CalibrateCurve(uint32_t* Freq) • uint32_t MSI_CalibrateMinError(void); ErrorStatus MSI_CalibrateFixedError(uint32_t MaxAllowedError, uint32_t* Freq);
ErrorStatus MSI_CalibrateCurve(uint32_t* Freq)
void HSI16_GetCurve( void );
void MSI_GetCurve(void);
3.3.1 具有最小误差的 HSI16/MSI 校准
HSI16_CalibrateMinError()
和 MSI_CalibrateMinError()
函数是微控制器提供的特定API,它们的目标是将HSI16(High-Speed Internal clock of 16 MHz)或MSI(Multi-Speed Internal clock)振荡器校准至最接近其典型值的频率。这些函数通过测量不同微调值下的频率,并确定导致最小误差的微调值,从而实现对内部振荡器的精确校准。
函数功能
HSI16_CalibrateMinError()
:该函数负责校准HSI16振荡器至最小误差频率。MSI_CalibrateMinError()
:该函数负责校准MSI振荡器至最小误差频率。
函数流程
-
初始化:函数首先初始化定时器、输入捕获通道、以及可能用到的中断或其他必要配置。
-
遍历微调值:函数会遍历所有可能的微调值(TRIM bits),对于每个微调值,都会执行以下步骤:
a. 设置微调值:将当前微调值写入振荡器的TRIM寄存器。
b. 等待稳定:等待一段时间,确保振荡器频率已经稳定在新的微调值下。
c. 测量频率:通过定时器捕获参考信号的周期,并据此计算振荡器的当前频率。
d. 计算误差:将测量得到的频率与典型值进行比较,计算误差。
-
选择最优微调值:在所有微调值中,选择导致最小误差的那个微调值。
-
编程微调位:将选定的最优微调值写入振荡器的TRIM寄存器。
-
返回校准后频率:函数返回校准后振荡器的频率值,类型为无符号32位整数(
uint32_t
)。
流程图描述
- 开始执行
HSI16_CalibrateMinError()
或MSI_CalibrateMinError()
函数。 - 初始化相关硬件和软件配置。
- 进入微调值遍历循环。
- 设置微调值。
- 等待振荡器稳定。
- 测量振荡器频率。
- 计算频率误差。
- 更新最小误差和对应微调值(如果需要)。
- 退出微调值遍历循环。
- 将最优微调值编程于微调位中。
- 返回校准后的振荡器频率值。
注意事项
- 在校准过程中,可能需要禁用或重新配置可能影响振荡器频率的其他功能或中断。
- 校准完成后,可能需要重置或恢复先前被禁用的功能或中断。
- 由于内部振荡器的特性和精度,可能无法达到完全无误差的校准结果,但可以通过优化算法和微调步长来减小误差。
uint32_t InternOscAfterCalib = 0;
{
......
/* 得到校准后的内部振荡器(HSI16)值 */
InternOscAfterCalib = HSI16_CalibrateMinError();
}
图 8. 内部振荡器校准流程图
3.3.2 HSI16振荡器校准
微控制器HSI16(高速内部)和MSI(多速内部)振荡器是两种重要的内部时钟源。HSI16_CalibrateFixedError()
和MSI_CalibrateFixedError()
函数,它们提供了在固定误差范围内快速校准这两种振荡器的功能。
这两个函数的目的是在尽可能短的时间内(而不是扫描所有的微调值)将HSI16和MSI振荡器校准到用户设定的最大允许频率误差之内。允许误差的绝对值由用户自行配置,单位是赫兹。这两个函数使用了一种高效的搜索算法——二进制搜索算法,这是找到精确目标频率的最快方式。
函数工作流程:
- 初始化:函数首先会接收用户设定的最大允许误差值作为输入参数。
- 设置搜索范围:根据内部振荡器的特性和可能的微调值范围,函数会设置一个初始的搜索范围。
- 执行二进制搜索:在搜索范围内,函数会使用二进制搜索算法逐步缩小搜索范围,同时测量和调整振荡器的频率。
- 判断误差:每次调整频率后,函数都会计算当前频率与目标频率之间的误差。如果误差在设定的允许范围内,则停止搜索。
- 设置最优微调值:如果函数在搜索过程中找到了满足误差要求的微调值,它会将该值编程到振荡器的微调位中。
- 返回结果:函数会返回校准后的振荡器频率值以及是否达到了设定的误差要求。
流程图说明:
流程图详细描述了上述工作流程。它开始于初始化步骤,然后逐步展示了二进制搜索算法的执行过程,包括如何根据当前误差调整搜索范围、如何测量和调整振荡器频率等。最终,流程图会展示函数如何根据搜索结果设置最优微调值,并返回校准结果。
需要注意的是,如果设定的最大允许误差值过低,函数可能无法在给定的时间内找到满足要求的微调值。在这种情况下,函数会将HSI16或MSI设置为具有最小误差的频率,并返回相应的校准结果。
图9 HSI16振荡器校准
3.3.3 使用 CRS 进行 HSI48 校准
微控制器为HSI48(High-Speed Internal clock of 48 MHz)提供了独特的校准方法,即利用时钟恢复系统(CRS, Clock Recovery System)进行自动校准。CRS允许HSI48基于与可选同步信号的比较自动调整振荡器的微调值,从而确保振荡器能够输出准确的48MHz频率。
HSI48校准流程
- CRS初始化:首先,需要对CRS进行初始化,包括设置其工作模式、参考信号源、微调步长等参数。
- 同步信号选择:CRS需要一个稳定的同步信号作为参考。这个同步信号可以是外部晶振产生的时钟信号,也可以是内部其他时钟源。在初始化阶段,需要指定CRS使用的同步信号源。
- 微调值调整:CRS内部包含一个16位递增/递减计数器,该计数器会逐步递增或递减HSI48的微调值(TRIM bits)。每次调整微调值后,CRS都会测量HSI48的当前频率,并将其与预期频率进行比较。
- 误差计算与微调:如果当前频率与预期频率之间存在误差,CRS会根据误差的大小和方向调整微调值。这个过程会不断重复,直到HSI48的频率达到或接近预期值。
- 平滑校准:当HSI48的频率达到要求后,CRS可以激活自动校准功能,进行平滑校准。平滑校准可以补偿由于温度变化等因素引起的频率漂移,确保HSI48的频率始终保持准确。
- 校准结果输出:完成校准后,CRS会输出校准结果,包括最终微调值、校准后的频率值等信息。
注意事项
- 由于HSI48的频率较高(48MHz),因此在校准过程中需要确保CRS的参考信号源具有足够的稳定性和准确性。
- 曲线可能不是线性的,因此在校准过程中可能需要重复进行一到两次微调值的调整。
- 激活自动校准功能后,CRS会不断监测HSI48的频率,并根据需要进行微调。这有助于确保HSI48的频率始终保持准确。
使用CRS进行HSI48校准可以大大提高校准的准确性和效率,特别是在需要频繁调整振荡器频率的应用中。
图10 HSI48误差测量
3.3.4 HSI16和MSI频率测量
在微控制器中,HSI16(High-Speed Internal clock of 16 MHz)和MSI(Multi-Speed Internal)振荡器的频率测量通常可以通过一个定时器(如TIM16)的捕获/比较功能来实现。这种方法允许用户测量内部振荡器的频率,并据此进行校准。
以下是使用TIM16捕获中断来执行HSI16或MSI频率测量的基本步骤和概念:
- 初始化TIM16:
- 配置TIM16的输入捕获通道(如TIM16的通道1),以捕获参考信号的上升沿。
- 设置TIM16的预分频器和自动重装载值,以便在一段时间内捕获多个参考信号的上升沿。
- 配置参考信号:
- 可以通过LSE(Low Speed External)时钟或其他稳定的外部或内部时钟源(如50 Hz的源)来作为参考信号。
- 如果使用LSE作为参考信号,需要确保LSE时钟已经配置并连接到TIM16的捕获通道。
- 如果使用其他频率的参考信号,需要在代码中定义该频率(如
#define REFERENCE_FREQUENCY (uint32_t)50
)。
- 定义测量周期数:
- 用户可以定义一个变量(如
HSI16_NUMBER_OF_LOOPS
)来指定要测量的参考信号周期数。这个值越高,测量结果的精度就越高,但测量时间也会相应增加。
- 用户可以定义一个变量(如
- 在TIM16中断服务程序(ISR)中计算频率:
- 当TIM16捕获到参考信号的上升沿时,会触发中断。
- 在ISR中,记录捕获的时间戳,并计算从上次捕获到当前捕获之间的时间差(即参考信号的周期)。
- 通过累积多个这样的周期,可以计算内部振荡器(HSI16或MSI)与参考信号之间的频率比。
- 计算内部振荡器频率:
- 使用累积的周期时间和参考信号的频率,可以计算出内部振荡器的实际频率。
- 例如,如果知道参考信号的频率,并且测量到在N个TIM16计数周期内参考信号有M个周期,那么内部振荡器的频率就是
(参考频率 * N)/ M
。
- 注意事项:
- 测量精度取决于参考信号的稳定性和精度,以及TIM16的时钟源和配置。
- 为了获得更高的测量精度,可以增加测量的周期数,但也要考虑到测量时间的影响。
- 在测量过程中,应避免其他中断或任务对TIM16的干扰,以确保测量的准确性。
请注意,具体的代码实现会依赖于MCU的HAL库(硬件抽象库文件)或LL库,以及具体的硬件配置和参考信号源。上述步骤提供了一个基本的框架和概念,用于指导如何使用TIM16捕获中断来执行HSI16或MSI的频率测量。
图11 HSI16和MSI频率测量流程
4 内部 LSI 振荡器测量
内部 LSI RC 振荡器为低功耗和低成本时钟源。在微控制器中,在内部 RC 振荡器(LSI 或 MSI)和嵌入式 定时器(TIM16)之间提供一个内部连接,以方便测量流程。
测量原理 内部 LSI RC 振荡器测量过程包括使用 HSI16 时钟运行定时器计数器、将定时器配置为输入捕获模式、将(需要测 量的)内部 LSI RC 振荡器连至定时器。
下图显示了执行 LSI 测量所使用的配置。LSI 可内部连至 TIM16 输入 1(TI1)。
图 12. LSI 测量配置
启用定时器计数后,当第一个要测量的内部振荡器信号上升沿发生时,捕捉定时器计数值,储存于 IC1ReadValue1 中。在第二个上升沿,又捕捉到定时器计数,储存于 IC1ReadValue2 中。在时钟的两个连续上升沿之间的时间代 表一个完整周期(参见第 3.1 节 )。
内部振荡器频率值计算为 HSI_Value / 捕获数,其中:
• HSI16_Value 是 HSI16 频率值(典型值为 16 MHz)。
• 捕获数表示内部 LSI RC
振荡器的整个周期:IC1ReadValue2 - IC1ReadValue1。 频率测量精度取决 HSI16 频率精度。因此,若参考信号可用,则可在执行内部 RC 振荡器测量之前,运行 第 3 节 中所述的内部 RC 振荡器校准程序。 可使用输入捕获预分频实现更高的测量精度。之前的公式变为:
LSI_Frequency = InputCapturePrescaler × HSI16_Value / Capture_Value
5 总结
即使内部 RC 振荡器已经有工厂校准,若应用中需要高精度时钟,则用户还可在工作环境对其进行校准:
• 多速和高速内部振荡器校准:怎样将振荡器精调至典型值
• 低速内部振荡器测量:怎样得到“精确”的 LSI/MSI 频率值
可以使用多个频率源校准内部 RC 振荡器(HSI16、HSI48 和 MSI),如 LSE 晶振或 AC 线等等。无论参考频率源 是什么,内部振荡器的校准原理是一样的:必须提供一个参考信号,由定时器来测量。参考信号频率精度越高,内 部振荡器频率测量的精度就越好。 对每个微调值,误差的计算为典型频率值与测量值之差的绝对值。之后,计算校准值,然后将其编程到微调位中。
本文介绍了 LSI 振荡器的测量。在 微控制器中,内部振荡器和嵌入式定时器之间的内部连接即用于此目的。该定时器使用系统时钟源作为时钟,配置为输入捕获模式。用内部振荡器两个连续上升沿之间捕获的 时间来表示一个完整的周期。