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
|