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 快速时钟。
参考文章
分类:
esp-idf
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App