本帖最后由 1308365377 于 2022-9-23 09:57 编辑
查阅最新版CW32L083的手册,发现更新了AUTOTRIM的实时时钟校准模式,等这个功能很久了,因为有些特定情况对时钟的频率精度要求严格,所以说这个功能在需要精确时钟的情况下还是很有用的。
测试了LSI的时钟校准结果,手册上提到AUTOTRIM还可以校准HSIOSC,如果以后有机会的话在测试分析。
好了,以上就是一些背景介绍,接下里就是本次测试的原理和结果数据分析,如果有懂原理的朋友可以直接跳过原理部分,后面会有代码和数据结果。
根据手册上描述的LSI时钟模式进行了配置,具体的代码我等下会贴在后面,这里主要是原理描述,首先我们需要设置AUTOTRIM_CR.MD为0x01,这个是为了让AUTOTRIM工作与LSI校准模式,而LSI时钟校准,需要向定时器提供一个精准的高频技术时钟,在这里本次测试是采用的HSE来提供的。
在配置AUTOTRIM校准模式之后,需要设置AUTOTRIM_CR.AUTO为1使能自动校准,设置AUTOTRIM_CR.EN为1使能定时器,在配置完这些之后AUTOTRIM就会开始自动校准流程,接下来就是配置AUTOTRIM让LSI输出的频率在我们需要的范围。
自动校准开始工作后,计数值寄存器 AUTOTRIM_CNT 在每个 GCLK 时钟周期内对计数时钟 TCLK 从重载值 ARR 开始递减计数,计数到0后开始递增计数。当计数器已运行1.5倍ARR 周期,计数器停止运行,同时 AUTOTRIM_ISR.MISS 标志位被硬件置1,表示计数失败。每当 GCLK 时钟上升沿到达时,计数器重新开始从 ARR 递减计数。如果在GCLK时钟周期内,计数器的计数值大于误差允许值AUTOTRIM_FLIM,芯片的寄存器Trimcode会自动调整,直到计数器的计数值小于误差允许值AUTOTRIM_FLIM,与此同时 AUTOTRIM_ISR.OK 标志位会被硬件置 1,表示校准精度已达标,此时可读取TrimCode寄存器并写入 SYSCTRL_LSI.TRIM,以校准 LSI 时钟频率。
TrimCode寄存器最大可调整为0x1FF,故TrimCode值写入 SYSCTRL_LSI.TRIM 时,需根据 TRIM 位域的初始校准值写入最高 1bit。可以像下面这样配置代码:
CW_SYSCTRL->LSI = (CW_SYSCTRL->LSI & 0xFE00) | CW_AUTOTRIM->TVAL;
误差允许值 FLIM 在设置重载值 ARR 时自动配置,校准精度为 0.4%,这个允许值我们是不能写入的。重载寄存器 AUTOTRIM_ARR 设置公式是:
ARR= TCLK×(2^PRS)/RCLK-1
在这里RCLK是LSI时钟,PRS为预分频系数,TCLK是计数时钟源,这里我们选用的是HSE.
这里举个例子:当计数时钟源TCLK为HSE(设置为16MHz)时,预分频系数为PRS为0x1时,校准LSI时钟频率为32.8kHz,计算
ARR=16000000×(2^1)/32800-1=974.60975
在这里本次实验就取了ARR为974来进行校准
接下来就是代码部分了
#include "main.h"
AUTOTRIM_TimeCntInitTypeDefAUTOTRIM_TimeCntInitStruct;
int32_t main(void)
{
RCC_APBPeriphClk_Enable2(RCC_APB2_PERIPH_AUTOTRIM, ENABLE);
RCC_LSI_Enable();
RCC_LSI_OUT();
InitTick(8000000);
SysTickDelay(3000);
AUTOTRIM_TimeCntStructInit( &AUTOTRIM_TimeCntInitStruct );
AUTOTRIM_TimeCntInitStruct.AUTOTRIM_ClkSource = AUTOTRIM_CLKSOURCE_HSE;
AUTOTRIM_TimeCntInitStruct.AUTOTRIM_Prescaler = AUTOTRIM_PRS_DIV2;
AUTOTRIM_TimeCntInitStruct.AUTOTRIM_Mode = AUTOTRIM_MODE_TIMECNT;
AUTOTRIM_TimeCntInitStruct.AUTOTRIM_Period = 974;
AUTOTRIM_TimeCntInit(&AUTOTRIM_TimeCntInitStruct);
RCC_HSE_Enable( RCC_HSE_MODE_OSC, 16000000, RCC_HSE_DRIVER_NORMAL, RCC_HSE_FLT_CLOSE);
CW_AUTOTRIM->CR_f.MD = 1;
CW_AUTOTRIM->CR_f.OST = 0;
CW_AUTOTRIM->IER_f.OK = 1;//中断
CW_AUTOTRIM->CR_f.AUTO = 1;
AUTOTRIM_Cmd(ENABLE);
while(1)
{
}
}
voidAUTOTRIM_IRQHandlerCallBack(void)
{
if((CW_AUTOTRIM->ISR & 0x3) == 0x3)
{
CW_AUTOTRIM->ICR &= (~0x3);
// TrimCode = CW_AUTOTRIM->TVAL;
// _TrimCode = CW_SYSCTRL->HSI_f.TRIM;
CW_SYSCTRL->LSI = (CW_SYSCTRL->LSI & 0xFE00) | CW_AUTOTRIM->TVAL;
}
}
本次设置就LSI未使用和使用之后的LSI偏移量做出了分析
表1.为进行校准的偏移量值
温度℃
| 结果1
| 结果2
| 结果3
| 结果4
| 结果5
| 平均值
| 平均误差
| 平均误差率
| -40
| 33.120
| 33.110
| 33.090
| 33.014
| 33.080
| 33.083
| 0.283
| 0.862%
| -35
| 33.120
| 33.110
| 33.090
| 33.080
| 33.080
| 33.096
| 0.296
| 0.902%
| -30
| 33.100
| 33.090
| 33.100
| 33.080
| 33.090
| 33.092
| 0.292
| 0.890%
| -25
| 33.070
| 33.040
| 33.040
| 33.040
| 33.060
| 33.050
| 0.250
| 0.762%
| -20
| 33.070
| 33.060
| 33.040
| 33.040
| 33.030
| 33.048
| 0.248
| 0.756%
| -15
| 33.060
| 33.200
| 33.040
| 33.040
| 33.030
| 33.074
| 0.274
| 0.835%
| -10
| 33.050
| 33.040
| 33.030
| 33.027
| 33.052
| 33.040
| 0.240
| 0.731%
| -5
| 33.006
| 32.998
| 33.027
| 33.024
| 33.010
| 33.013
| 0.213
| 0.649%
| 0
| 33.010
| 32.989
| 32.997
| 32.998
| 33.002
| 32.999
| 0.199
| 0.607%
| 5
| 32.994
| 33.001
| 32.980
| 32.970
| 32.990
| 32.987
| 0.187
| 0.570%
| 10
| 32.960
| 32.972
| 32.960
| 32.960
| 32.983
| 32.967
| 0.167
| 0.509%
| 15
| 32.950
| 32.932
| 32.940
| 32.960
| 32.940
| 32.944
| 0.144
| 0.440%
| 20
| 32.920
| 32.900
| 32.920
| 32.901
| 32.930
| 32.914
| 0.114
| 0.348%
| 25
| 32.916
| 32.890
| 32.924
| 32.912
| 32.900
| 32.908
| 0.108
| 0.330%
| 30
| 32.880
| 32.860
| 32.890
| 32.867
| 32.880
| 32.875
| 0.075
| 0.230%
| 35
| 32.860
| 32.889
| 32.867
| 32.890
| 32.872
| 32.876
| 0.076
| 0.230%
| 40
| 32.880
| 32.880
| 32.870
| 32.892
| 32.856
| 32.876
| 0.076
| 0.230%
| 45
| 32.842
| 32.870
| 32.836
| 32.839
| 32.850
| 32.847
| 0.047
| 0.145%
| 50
| 32.812
| 32.820
| 32.826
| 32.830
| 32.824
| 32.822
| 0.022
| 0.068%
| 55
| 32.810
| 32.807
| 32.810
| 32.800
| 32.790
| 32.803
| 0.003
| 0.010%
| 60
| 32.760
| 32.770
| 32.770
| 32.760
| 32.778
| 32.768
| -0.032
| -0.099%
| 65
| 32.758
| 32.749
| 32.750
| 32.730
| 32.740
| 32.745
| -0.055
| -0.166%
| 70
| 32.679
| 32.701
| 32.717
| 32.707
| 32.710
| 32.703
| -0.097
| -0.296%
| 75
| 32.684
| 32.687
| 32.692
| 32.688
| 32.679
| 32.686
| -0.114
| -0.348%
| 80
| 32.667
| 32.669
| 32.655
| 32.652
| 32.664
| 32.661
| -0.139
| -0.423%
| 85
| 32.641
| 32.649
| 32.652
| 32.642
| 32.640
| 32.645
| -0.155
| -0.473%
| 表2. 经过AUTOTRIM校准之后的LSI时钟频率在进行了AUTOTRIM校准之后LSI时钟的输出频率
温度℃
| 结果1
| 结果2
| 结果3
| 结果4
| 结果5
| 平均结果
| 平均误差
| 平均误差率
| -40
| 32.840
| 32.830
| 32.820
| 32.820
| 32.840
| 32.830
| 0.030
| 0.091%
| -35
| 32.823
| 32.830
| 32.825
| 32.840
| 32.823
| 32.828
| 0.028
| 0.086%
| -30
| 32.845
| 32.835
| 32.856
| 32.843
| 32.830
| 32.842
| 0.042
| 0.127%
| -25
| 32.850
| 32.847
| 32.842
| 32.847
| 32.850
| 32.847
| 0.047
| 0.144%
| -20
| 32.843
| 32.840
| 32.851
| 32.851
| 32.846
| 32.846
| 0.046
| 0.141%
| -15
| 32.833
| 32.841
| 32.838
| 32.846
| 32.840
| 32.840
| 0.040
| 0.121%
| -10
| 32.820
| 32.820
| 32.820
| 32.836
| 32.838
| 32.827
| 0.027
| 0.082%
| -5
| 32.830
| 32.820
| 32.825
| 32.810
| 32.830
| 32.823
| 0.023
| 0.070%
| 0
| 32.820
| 32.818
| 32.810
| 32.820
| 32.818
| 32.817
| 0.017
| 0.052%
| 5
| 32.835
| 32.833
| 32.823
| 32.831
| 32.812
| 32.827
| 0.027
| 0.082%
| 10
| 32.842
| 32.847
| 32.830
| 32.845
| 32.839
| 32.841
| 0.041
| 0.124%
| 15
| 32.840
| 32.840
| 32.830
| 32.837
| 32.840
| 32.837
| 0.037
| 0.114%
| 20
| 32.835
| 32.840
| 32.822
| 32.828
| 32.839
| 32.833
| 0.033
| 0.100%
| 25
| 32.824
| 32.829
| 32.830
| 32.828
| 32.836
| 32.829
| 0.029
| 0.090%
| 30
| 32.830
| 32.824
| 32.824
| 32.813
| 32.824
| 32.823
| 0.023
| 0.070%
| 35
| 32.833
| 32.830
| 32.814
| 32.829
| 32.829
| 32.827
| 0.027
| 0.082%
| 40
| 32.831
| 32.814
| 32.846
| 32.850
| 32.841
| 32.836
| 0.036
| 0.111%
| 45
| 32.856
| 32.850
| 32.847
| 32.851
| 32.850
| 32.851
| 0.051
| 0.155%
| 50
| 32.856
| 32.852
| 32.821
| 32.823
| 32.843
| 32.839
| 0.039
| 0.119%
| 55
| 32.817
| 32.826
| 32.822
| 32.818
| 32.827
| 32.822
| 0.022
| 0.067%
| 60
| 32.811
| 32.826
| 32.816
| 32.809
| 32.819
| 32.816
| 0.016
| 0.049%
| 65
| 32.851
| 32.837
| 32.840
| 32.827
| 32.827
| 32.836
| 0.036
| 0.111%
| 70
| 32.855
| 32.856
| 32.854
| 32.848
| 32.859
| 32.854
| 0.054
| 0.166%
| 75
| 32.836
| 32.844
| 32.840
| 32.846
| 32.851
| 32.843
| 0.043
| 0.132%
| 80
| 32.829
| 32.809
| 32.822
| 32.824
| 32.827
| 32.822
| 0.022
| 0.068%
| 85
| 32.836
| 32.817
| 32.822
| 32.827
| 32.831
| 32.827
| 0.027
| 0.081%
|
测试的样品为CW32L083VCT6,工作区间为-40℃-85℃,通过图表可以很明显的看出,未经过校准的LSI输出的最大误差值为0.296kHz,误差率大概为0.9%,而经过AUTOTRIM校准之后的LSI输出的频率最大误差为0.054kHz,误差率为0.166%,或许看值不是很明显,但是未校准之前的最大误差率是校准之后的最大误差率的5.4倍。
通过对比上面两个表格的数据可以看到在各个温度下,经过AUTOTRIM校准之后的LSI的时钟频率会比没有校准的LSI更稳定,一直保持在32.8kHz-32.850kHz附件,经过AUTOTRIM校准之后的LSI频率受外界因素的影响被大大的降低,使得开发板和芯片工作的更加稳定。而没有校准的LSI在某些情况下比如说高温和低温,输出的频率会产生较大的出入,可能会对芯片在实际使用的场景下性能有些微影响。
|