打印
[CW32L083系列]

CW32L083如何实现AUTOTRIM时钟校准?

[复制链接]
651|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bestwell|  楼主 | 2022-12-10 22:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

MCU中的HSIOSC和LSI时钟信号是通过内部RC振荡器产生的,该时钟信号可能会受到外界因素比如温度等的影响,使其频率在一定范围内产生误差。CW32L083可以通过AUTOTRIM的时钟校准定时器模式来对LSI和HSIOSC进行自动实时时钟校准,获得精度更高的时钟信号。


HSIOSC时钟校准模式

设置 AUTOTRIM_CR.MD 为 0x00,使定时器工作于 HSIOSC 校准模式。该模式支持自动实时校准HSIOSC的输出频率,使 HSIOSC 输出频率的精度不再受环境变化影响。

HSIOSC 时钟校准,需要向定时器提供一个精准的低频参考时钟,其来源可以是 LSE 或外部 ETR 引脚输入的低速精准时钟信号,通过控制寄存器 AUTOTRIM_CR 的 SRC 位域进行选择。

HSIOSC 校准模式的功能框图如下图所示:

设置 AUTOTRIM_CR.AUTO 为 1 使能自动校准,设置 AUTOTRIM_CR.EN 为1 使能定时器,开始自动校准流程。自动校准开始工作后,计数值寄存器AUTOTRIM_CNT 在每个 GCLK 时钟周期内对 HSIOSC 时钟 TCLK 从重载值 ARR 开始递减计数,计数到 0 后开始递增计数。当计数器已运行 1.5 倍 ARR 周期,计数器停止运行,同时 AUTOTRIM_ISR.MISS 标志位被硬件置 1,表示计数失败。每当 GCLK 时钟上升沿到达时,计数器重新开始从 ARR 递减计数。

如果 GCLK 时钟周期内,计数器的计数值大于误差允许值 AUTOTRIM_FLIM,寄存器TrimCode 会自动调整,直到计数器的计数值小于误差允许值 AUTOTRIM_FLIM,同时 AUTOTRIM_ISR.OK 标志位会被硬件置 1,表示校准精度已达标,此时可读取 TrimCode 寄存器并写入 SYSCTRL_HSI.TRIM,以校准 HSIOSC 时钟频率。

TrimCode 寄存器最大可调整为 0x1FF,故 TrimCode 值写入 SYSCTRL_HSI.TRIM 时,需根据 TRIM 位域的初始校 准值写入最高 2bit。代码示例如下:

CW_SYSCTRL->HSI = (CW_SYSCTRL->HSI & 0xFE00) | CW_AUTOTRIM->TVAL;

误差允许值 FLIM 在设置重载值 ARR 时自动配置,校准精度为 0.4%,用户不可写入。重载寄存器 AUTOTRIM_ARR 设置公式如下:

ARR = TCLK×/RCLK-1

其中,RCLK 为参考时钟源,PRS 为预分频系数,TCLK 为计数时钟源 HSIOSC 时钟,这一部分是需要我们去配置的。

例:当参考时钟源 RCLK 为 LSE(时钟频率为 32768Hz),预分频系数 PRS 为 0x1 时,校准 HSIOSC 时钟频率为 48MHz,计算

ARR = 48000000× /32768-1 = 2928.6875

最接近的整数是:2929(0xB71)

即需要设置 AUTOTRIM_ARR 为 0xB71。


HSIOSC时钟校准编程示例

通过上节的模式设置介绍我们可以根据其配置AUTOTRIM的HSIOSC的实时时钟校准模式,HSIOSC 时钟校准流程如下,当选择参考时钟源为 LSE 时,步骤 1 和步骤 2 不需要执行:

步骤 1:设置外设时钟使能控制寄存器 SYSCTRL_AHBEN 的相关位为 1,使能AUTOTRIM_ETR 对应 GPIO 端口的配置时钟及工作时钟;

步骤 2:设置 GPIO 复用功能寄存器 GPIOx_AFRH 和 GPIOx_AFRL 的相关位,配置对应引脚为 AUTOTRIM 定时器的 AUTOTRIM_ETR 功能;

步骤 3:设置外设时钟使能控制寄存器 SYSCTRL_APBEN2.AUTOTRIM 为 1,打开 AUTOTRIM 模块的配置时钟;

步骤 4:设置 AUTOTRIM_CR.MD 为 0x00,使定时器工作于 HSIOSC 时钟校准模式;

步骤 5:配置控制寄存器 AUTOTRIM_CR.OST,选择实时校准模式或单次校准模式;

步骤 6:配置控制寄存器 AUTOTRIM_CR.SRC,选择 AUTOTRIM 参考时钟源为LSE;

步骤 7:配置控制寄存器 AUTOTRIM_CR.PRS,选择 AUTOTRIM 参考时钟分频系数;

步骤 8:根据上节HSIOSC时钟校准模式ARR 配置公式,设置重载值寄存器 AUTOTRIM_ARR,自动配置 校准精度为 0.4%;

步骤 9:设置 AUTOTRIM_CR.AUTO 为 1,使能自动校准;

步骤 10:设置 AUTOTRIM_CR.EN 为 1,使能定时器,开始自动校准;

步骤 11:查询等待 AUTOTRIM_ISR.END 和 AUTOTRIM_ISR.OK 标志位置 1,自动校准完成且精度达标;

步骤 12:读取 TrimCode 寄存器,并将 TrimCode 值写入 SYSCTRL_HSI.TRIM。


代码示例:

CW_SYSCTRL->HSI = (CW_SYSCTRL->HSI & 0xFE00) | CW_AUTOTRIM->TVAL;

具体的寄存器配置可以参考CW32L083用户手册的时钟校准定时器(AUTOTRIM)章节。在上述的一系列校准步骤配置完之后,我们就可以通过示波器或者万用表来读取开发板的HSIOSC的频率输出,会发现在不同的温度影响下,MCU会自动校准HSIOSC的时钟频率。通过对比会发现,用AUTOTRIM自动校准模式之后的HSIOSC会比没有用AUTOTRIM的HSIOSC的精度更高,误差更小。


LSI时钟校准

设置 AUTOTRIM_CR.MD 为 0x01,使定时器工作于 LSI 校准模式。该模式支持自动实时校准 LSI 的输出频率,使 LSI 输出频率的精度不再受环境变化影响。

LSI 时钟校准,需要向定时器提供一个精准的高频计数时钟,其来源可以是 HSE 或外部 ETR 引脚输入的高速精准时钟信号,通过控制寄存器 AUTOTRIM_CR 的 SRC 位域进行选择。

LSI校准模式的功能框图如下图所示:


设置 AUTOTRIM_CR.AUTO 为 1 使能自动校准,设置 AUTOTRIM_CR.EN 为 1 使能定时器,开始自动校准流程。

自动校准开始工作后,计数值寄存器 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 时钟频率。具体的代码配置可以参考下节的步骤12的代码示例。

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×/RCLK-1

其中,RCLK 为 LSI 时钟,PRS 为预分频系数,TCLK 为计数时钟源。

例:当计数时钟源 TCLK 为 HSE(时钟频率为 16MHz),预分频系数 PRS 为 0x1 时,校准 LSI 时钟频率为 32kHz,计算

ARR = 16000000× /32000-1 = 999

即需要设置 AUTOTRIM_ARR 为 0x3E7。


LSI时钟校准编程示例

通过上节的模式设置介绍我们可以根据其配置AUTOTRIM的LSI的实时时钟校准模式,LSI 时钟校准流程如下,当选择计数时钟源为 HSE 时,步骤 1 和步骤 2 不需要执行:

步骤 1:设置外设时钟使能控制寄存器 SYSCTRL_AHBEN 的相关位为 1,使能 AUTOTRIM_ETR 对应 GPIO 端口的 配置时钟及工作时钟;

步骤 2:设置 GPIO 复用功能寄存器 GPIOx_AFRH 和 GPIOx_AFRL 的相关位,配置对应引脚为 AUTOTRIM 定时器 的 AUTOTRIM_ETR 功能;

步骤 3:设置外设时钟使能控制寄存器 SYSCTRL_APBEN2.AUTOTRIM 为 1,打开 AUTOTRIM 模块的配置时钟;

步骤 4:设置 AUTOTRIM_CR.MD 为 0x01,使定时器工作于 LSI 时钟校准模式;

步骤 5:配置控制寄存器 AUTOTRIM_CR.OST,选择实时校准模式或单次校准模式;

步骤 6:配置控制寄存器 AUTOTRIM_CR.SRC,选择 AUTOTRIM 计数时钟源HSE;

步骤 7:配置控制寄存器 AUTOTRIM_CR.PRS,选择 AUTOTRIM 参考时钟分频系数;

步骤 8:根据 11.3.3 LSI 时钟校准小节 ARR 配置公式,设置重载值寄存器 AUTOTRIM_ARR,自动配置校准精度 为 0.4%;

步骤 9:设置 AUTOTRIM_CR.AUTO 为 1,使能自动校准;

步骤 10:设置 AUTOTRIM_CR.EN 为 1,使能定时器,开始自动校准;

步骤 11:查询等待 AUTOTRIM_ISR.END 和 AUTOTRIM_ISR.OK 标志位置 1,自动校准完成且精度达标;

步骤 12:读取 TrimCode 寄存器,并将 TrimCode 值写入 SYSCTRL_LSI.TRIM。

代码示例:

CW_SYSCTRL->LSI = (CW_SYSCTRL->LSI & 0xFE00) | CW_AUTOTRIM->TVAL

使用特权

评论回复
沙发
1988020566| | 2022-12-15 09:23 | 只看该作者
AUTOTRIM是什么功能?              

使用特权

评论回复
板凳
eefas| | 2022-12-15 10:39 | 只看该作者
时钟的校准应该是授时吧。              

使用特权

评论回复
地板
primojones| | 2022-12-15 11:19 | 只看该作者
AUTOTRIM怎么用呢              

使用特权

评论回复
5
1988020566| | 2022-12-15 12:42 | 只看该作者
这个授时怎么实现的呢              

使用特权

评论回复
6
mikewalpole| | 2022-12-15 13:13 | 只看该作者
这个可以实现多个精度的校准?              

使用特权

评论回复
7
jimmhu| | 2022-12-15 13:52 | 只看该作者
第一次听说这个模块              

使用特权

评论回复
8
Undshing| | 2022-12-26 12:06 | 只看该作者
授时是如何实现的啊

使用特权

评论回复
9
AloneKaven| | 2022-12-26 12:23 | 只看该作者
AUTOTRIM该怎么用?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

1607

帖子

1

粉丝