内部HSI实时校准实现思路

发布时间 2023-12-06 20:08:03作者: WCH_CH32

    CH32VF系列微控制器提供了适合运行的内部 RC 振荡器 (典型地,有 8 MHz 的 HSI:高速内部振荡器)。在 25 ℃时, HSI 的典型精度为 ±1%。在 –40 到 105 ℃, RC 频率精度值从-3%-2%。因此,温度对 RC 精度有影响。为补偿应用中的温度影响,用户可使用运行时校准程序,进一步微调 CH32VF系列微控制器的振荡器的输出频率,提高 HSI 的频率精度,这对UART/USB/CAN等异步通信是至关重要的。

    本应用笔记给出了两个校准内部 HSI 的方法:找到具有最小误差的频率或找到最大允许的频率误差。两者都通过提供精确的参考源,如 RTC/64 信号或主动信号实现。
这两个方法都基于相同的原理:计时相同的时间,对比计数器中数值的偏差而微调RCC_CTLR->HSITRIM[4:0]位(内部 HSI RC 振荡器频率的影响。默认值为 16,加上 HSICAL 值,应能将HSI 微调至 8 MHz ±1%,每步HSICAL的变化调整约17KHz)。

校准方法1:使用LSE时钟校准,此例使用32.768K晶振,校准的原理为首先测量 HSI 频率,然后计算频率误差,最后设置 RCC_CTLR寄存器中的HSITRIM位。
HSI 频率并不是直接测量的,而是使用定时器对 HSI 时钟沿计数方式算出,然后与理想值 8 000 000 Hz 比较。为此,必须有一个非常精确的参考频率,比如由外部 32.768KkHz 晶振提供的RTC/64 信号或 50 Hz/60 Hz 主频 。对于 RTC 时钟源的情况,参考频率等于 512 Hz (32768 Hz/64)。

程序中配置RCT使之以512HZ的频率运行,同时配置定时器的计数频率为2048HZ(配置如此,但是时钟源为HSI)。等待RTC计数器的值增加512后同时读出定时器的计数器的增加的数值(不想死等可以开启RCT闹钟中断中处理),将此值与512对比既可计算偏差,从而计算出应该微调进RCC_CTLR寄存器中的HSITRIM的数值。

//系统主频为96M

TIM_PrescalerConfig(TIM1, 46875, TIM_PSCReloadMode_Immediate);//设置TIM1技术频率为2048HZ

TIM_SetCounter(TIM1, 0);//设置TIM1计数器数值为0;

RTC_SetPrescaler(64);// RTC计数器频率512 Hz 

RTC_SetCounter(0);//设置RTC计数器数值为0;

while(RTC_GetCounter()!=512)//等到RTC计时1s

tem=TIM_GetCounter(TIM1);

if(tem/4>512)

{

HSI偏大,将此值((tem/4-512)/512*8M)/17K与 16做差处理后写入RCC_CTLR->HSITRIM[4:0]位

}

 else

{

HSI偏小,将此值((512-tem/4)/512*8M)/17K与 16做和处理后写入RCC_CTLR->HSITRIM[4:0]位

}

校准方法2:与1同理,只是使用定时器输入功能,将外部精准时钟作为定时器的计数时钟与内部时钟做基准时钟的计数值作比较。