本帖最后由 1455555 于 2023-11-3 09:26 编辑
对LSI了解比较少,今儿个来学习一下。LSICLK作为低速时钟可以不需要外部硬件,从而降低硬件成本;同时,比起使用外部振荡器,LSICLK具有更短的启动时间和更低的功耗。但由于LSICLK由RC振荡电路产生,易受温度等外界环境影响,因此会产生较大的偏频,易产生精度相对较低问题。考虑到这一问题,原本想找出一种利用TIMER捕获LSICLK进行校准的方法,但查阅相关资料后,未发现校准相关寄存器的位定义,于是只测出了实际时钟值。在实际应用过程中,可以根据测得的实际值再实现定时等功能。
这次使用手边的APM32F411开发板编写例程~
查阅用户手册得到相关信息:LSICLK 由 RC 振荡器产生,范围是 32kHz(17kHz和47kHz)之间,如表1所示。不同芯片的 RC 振荡器频率不同,且同一颗芯片随着温度、电压的变化也会存在差异。可以在停机和待机模式下保持运行,为独立看门狗和自动唤醒单元提供时钟,如图所示(截取了时钟树的一部分)。LSICLK 可以通过 RCM_CSTS寄存器的 LSIEN 位来启动或关闭。RCM_CSTS 里的 LSIRDY** 位指示低速内部振荡器是否稳定。在启动阶段,直到这个位被硬件设置为“1”后,时钟才被释放。
表1 LSICLK 振荡器特性
Symbol | | | | | | | Frequency (VDD=2-3.6V, TA =-40~105℃) | | | | | | Power consumption of LSICLK oscillator | | | | | | Startup time of LSICLK oscillator, (VDD=3.3V, TA=- 40~105℃) | | | | |
TMR测量LSI频率原理
LSICLK是内部低速时钟,受温度和主频影响大。通常会使用LSICLK作为独立看门狗和自动唤醒单元时钟来源,以32KHz的固定数值设置预分频系数,进行计算,但这样会产生较大的误差。 算了一下,若以32KHz为固定数值,要获得1s的时间基准,设置预分频系数为31999。但当LSICLK实际数值比32KHz大,假设为34KHz时,实际的时间基准为1.065s(1.065s = 34KHz / ( 31999 +1) )。也就是说以固定数值32KHz每计时1s,会使得计时效果偏慢0.065s。 TIMER使用HSE外部高速时钟,精确度高。可以使用TMR的输入捕获模式,捕捉相邻两次的上升沿或者下降沿,记录时间差值,通过计算得出LSICLK实际频率。 (下段文字及公式角标发出后会失去角标格式,给一张截图方便查看) 下图中,Time_Capture1为TIMER第一次捕获到LSICLK上升沿的时间,记作t1;Time_Capture2为TIMER第二次捕获到LSICLK上升沿的时间,记作t2;二者相减的时间差记作tperiod。LSICLK频率记作fLSI,周期记作TLSI。TIMER周期计数值记作CNT,频率记作fTMR(已知),周期记作TTMR。 利用TIMER捕获相邻两次的上升沿,其时间差tperiod即为LSICLK周期TLSI。TIMER时钟来自于高精度外部高速时钟HSE,利用其周期数CNT 除上已知的TMR时钟频率fTMR得到LSICLK周期TLSI;取LSICLK周期倒数即为LSICLK实际频率fTMR。 TLSI =tperiod = t2 - t1 = CNT * TTMR = CNT/ fTMR
fLSI = 1 / TLSI = fTMR /CNT
利用TMR5定时器,捕获LSICLK相邻两次上升沿,通过计算获得LSICLK实际频率。将测得的频率打印至串口助手。主要为两个部分:设置TMR5 CH4为输入捕获模式和打开LSICLK使能,将其映射到TMR5 CH4。通过中断来测量计算LSICLK频率。画了一个流程图进行大概的说明。 部分代码如下:1、串口配置
2、TMR5配置及LSI REMAP
3、中断服务函数
4、while(1)
实验现象测量出来为37K左右,属于17kHz和47kHz正常范围内。
|