check_crystal_oscillator_size_in_the_code

发布时间 2023-04-23 21:52:09作者: SpinJump

如何在代码里面查看晶振的大小

[toc]

概述

不同晶振的类型,大小有所不同,它们适合的使用场合也有所不同。主系统时钟一般会使用大一点的晶振,这样通过倍频之后,可以轻松得到想要的主频。RTC 时钟一般使用 32.768 K 晶振。

RTC的晶振频率为什么是32768Hz? ① RTC时间是以振荡频率来计算的。故它不是一个时间器而是一个计数器。而一般的计数器都是16位的。又因为时间的准确性很重要,故震荡次数越低,时间的准确性越低。所以必定是个高次数。215 = 32768 。 ② 32768 Hz = 215 即分频15次后为1Hz,周期 = 1s。 ③ 经过工程师的经验总结32768 Hz,时钟最准确。 ④ 规范和统一。

方案

  1. 在使用 esp32-s3deep-sleep 时,发现它默认低功耗时使用的是内部 150K 的晶振 ,这个晶振的误差比较大,不满足项目想要的 RTC 精度。于是就想要切换到外部 32.768K 的晶振上面去。

  2. 在 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
    

  3. 代码判断晶振大小,这个主要是判断他在一个周期(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
    

  1. esp32-s3deep-sleep 模式,如果要使用外部 32.768K 晶振, 只能使用 RTC 慢速时钟,不能使用 RTC 快速时钟。

参考文章

  1. SOC RTC时钟——为什么实时时钟的晶振都是32.768KHZ呢?