check_crystal_oscillator_size_in_the_code
如何在代码里面查看晶振的大小
概述
不同晶振的类型,大小有所不同,它们适合的使用场合也有所不同。主系统时钟一般会使用大一点的晶振,这样通过倍频之后,可以轻松得到想要的主频。RTC 时钟一般使用 32.768 K 晶振。
RTC的晶振频率为什么是32768Hz?
① RTC时间是以振荡频率来计算的。故它不是一个时间器而是一个计数器。而一般的计数器都是16位的。又因为时间的准确性很重要,故震荡次数越低,时间的准确性越低。所以必定是个高次数。215 = 32768 。
② 32768 Hz = 215 即分频15次后为1Hz,周期 = 1s。
③ 经过工程师的经验总结32768 Hz,时钟最准确。
④ 规范和统一。
方案
-
在使用 esp32-s3 的 deep-sleep 时,发现它默认低功耗时使用的是内部 150K 的晶振 ,这个晶振的误差比较大,不满足项目想要的 RTC 精度。于是就想要切换到外部 32.768K 的晶振上面去。
-
在 esp-idf 里面使用 idf.py menuconfig 进行配置。主要配置以下两个选项:
// 定时器时钟配置 - ESP32S3_TIME_SYSCALL_USE_RTC_FRC1 (selected) - ESP32S3_TIME_SYSCALL_USE_RTC - ESP32S3_TIME_SYSCALL_USE_FRC1 - ESP32S3_TIME_SYSCALL_USE_NONE //时钟源配置 - ESP32S3_RTC_CLK_SRC_INT_RC - ESP32S3_RTC_CLK_SRC_EXT_CRYS (selected) - ESP32S3_RTC_CLK_SRC_EXT_OSC - ESP32S3_RTC_CLK_SRC_INT_8MD256
-
代码判断晶振大小,这个主要是判断他在一个周期(1 秒)内会产生多少个 tick :
#include "soc/rtc.h" const uint64_t rtc_this_ticks_1 = rtc_time_get(); vTaskDelay(1000 / portTICK_PERIOD_MS); const uint64_t rtc_this_ticks_2 = rtc_time_get(); uint64_t rtc_this_ticks_3 =rtc_this_ticks_2 -rtc_this_ticks_1; printf(" %d \n", (uint32_t)(rtc_this_ticks_3&0xFFFFFFFF)); // 如果是 32.768K 的话,那么打印出来就应该是 32768
注
- esp32-s3 的 deep-sleep 模式,如果要使用外部 32.768K 晶振, 只能使用 RTC 慢速时钟,不能使用 RTC 快速时钟。