自动校准内部高速IRC时钟,利用外部 32768 RTC 晶振时钟
===STC8H数据手册 内容
7 自动频率校准,自动追频(CRE)
STC8H部分单片机系列内建一个频率自动校准模块(CRE),CRE模块是使用外部的32.768KHz晶振对内部高速IRC(HIRC)的IRTRIM寄存器进行自动调整,以达到自动频率校准的功能。需要使用自动校准时,只需要根据给定的公式设置好目标频率的计数值和误差范围,然启动CRE模块,硬件便会进行自动频率校准,当HIRC的频率达到用户所设置误差范围内时,校准完成标志会被置位。
7.1 相关寄存器
7.1.1 CRE控制寄存器(CRECR)ENCRE:CRE模块控制位 0:关闭CRE模块。 1:使能CRE模块。 MONO:自动校准步幅控制 0:单步模式。每个校准周期,硬件自动将IRTRIM递增或递减1。 1:双步模式。每个校准周期,硬件自动将IRTRIM递增或递减2。 单步模式比双步模式校准后的IRC精度更高,但自动校准的时间比双步模式长。 UPT[1:0]:CRE校准周期选择 CREHF:高频模式选择 0:低频模式(目标频率小于或等于50MHz)。 1:高频模式(目标频率大于50MHz)。 CREINC:CRE校准正处于上调状态。只读位。 CREDEC:CRE校准正处于下调状态。只读位。 CRERDY:CRE校准完成状态。只读位。 0:CRE校准功能未启动或者未校准完成。 1:CRE校准已完成。
7.1.2 CRE校准计数值寄存器(CRECNT)CRECNT[15:0]:16位校准计数值。 目标校准值计算公式: 低频模式(CREHF=0):CRECNT = (16 * 目标频率(Hz)) / 32768 高频模式(CREHF=1):CRECNT = (8 * 目标频率(Hz)) / 32768 (详细设置见范例程序)
7.1.3 CRE校准误差值寄存器(CRERES)CRERES[7:0]:8位校准误差值(解析度控制)。 由于内部高速IRC的解析度远低于外部的32.768K晶振,最终的校准值无法与CRECNT所设置的目标值完全一致,所以必须通过CRERES寄存器设定一个误差范围。 校准误差计算公式: CRERES = 误差范围(%) * 目标校准值 (误差范围一般控制在1%~0.3%即可,不建议超出此范围) (详细设置见范例程序)
7.2 范例程序1.2.1 自动校准内部高速IRC(HIRC)
例如:校准的目标频率为22.1184MHz,校准误差范围为±0.5%
则需要将CREHF设置为0,CRECNT设置为(16*22118400)/32768=10800(2A30H),
即将CRECNTH设置为2AH,CRECNTL设置为30H,CRERES设置为10800 * 0.5%=54(36H)
//测试工作频率为11.0592MHz #include "stc8h.h"//头文件见下载软件 #define CNT22M (16 * 22118400L) / 32768) //校准目标频率为22.1184M #define RES22M (CNT22M *5 / 1000) //设置校准误差为0.5% void main() { P_SW2 |= 0x80;//使能访问XFR P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0x00; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P4M0 = 0x00; P4M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; X32KCR = 0xc0; //启动外部32K晶振 while (!(X32KCR & 1)); //等待时钟稳定 IRCBAND &= ~0x03; IRCBAND |= 0x02; //选择27M频段 CLKSEL = 0x00; //选择内部高速HIRC为系统时钟 CRECNTH = CNT22M >>8; //设置目标校准值 CRECNTL = CNT22M; CRERES = RES22M; //设置校准误差 CRECR = 0x90; //使能CRE功能,并设置校准周期为4ms while (1) { if (CRECR& 0x01) { //频率自动校准完成 } } }
|