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×2PRS/RCLK-1
其中,RCLK 为参考时钟源,PRS 为预分频系数,TCLK 为计数时钟源 HSIOSC 时钟,这一部分是需要我们去配置的。
例:当参考时钟源 RCLK 为 LSE(时钟频率为 32768Hz),预分频系数 PRS 为 0x1 时,校准 HSIOSC 时钟频率为 48MHz,计算
ARR = 48000000×21 /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×2PRS/RCLK-1
其中,RCLK 为 LSI 时钟,PRS 为预分频系数,TCLK 为计数时钟源。
例:当计数时钟源 TCLK 为 HSE(时钟频率为 16MHz),预分频系数 PRS 为 0x1 时,校准 LSI 时钟频率为 32kHz,计算
ARR = 16000000×21 /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
来源:武汉芯源半导体
审核编辑:汤梓红
-
mcu
+关注
关注
146文章
16977浏览量
350215 -
时钟
+关注
关注
10文章
1720浏览量
131339 -
定时器
+关注
关注
23文章
3237浏览量
114432 -
CW32
+关注
关注
1文章
183浏览量
575
发布评论请先 登录
相关推荐
评论