跳转至

tcxo开发指南

概述

TCXO(Temperature Compensated Crystal Oscillator,温度补偿晶体振荡器)是通过附加的温度补偿电路削减周围温度变化产生的振荡频率变化量的有源石英晶体振荡器。

SDK可以外接XO来为系统提供高精度的计数和延时功能。TCXO基于外部32MHz晶体为系统提供高精度计数。

TCXO系统架构

**TCXO系统架构**

快速跑通 TCXO Demo

功能说明

TCXO 计时示例 在 20 ms 等待前后读取 TCXO 毫秒计数并校验计数向前推进。开发板时钟资源已满足该测试,不需要额外器件。

Demo 代码归档路径

samples/native_samples/tcxo/
├── CMakeLists.txt    # 独立组件构建配置
├── README.md         # 项目级运行说明
├── tcxo_demo.c       # TCXO 计数增量验证和 AT 指令
└── tcxo_demo.h       # 对外运行接口和 AT 注册函数声明

编译与烧录

完成一站式 CLI 环境配置后执行:

fbb set-target pack_diting_community
fbb build

使用一站式 CLI 烧写固件并打开 UART2 串口监视器。以下为 Windows USB DFU 示例;将 COM3 替换为实际日志串口,其他参数参见一站式 CLI 开发环境使用指南

fbb flash -f "$env:FBB_SDK_DIR\output\3322\fwpkg\diting-community.fwpkg" --chip 3322 -d --timeout 180
fbb monitor --port COM3 --baud 750000

使用方式

AT+TCXOTEST

预期结果

实际增量可能受任务调度影响而略大于 20 ms:

[DRV][TCXO] delta=20ms
[DRV][TCXO] PASS
OK

需要一次性检查 Systick、Systime、TCXO 等板载能力时,也可以执行 AT+DRIVERSELFTEST

文件结构与代码走读

文件职责

文件 职责 关键内容
tcxo_demo.c 读取 TCXO 毫秒计数、等待并校验增量 diting_tcxo_demo_run()
tcxo_demo.h 公开运行和 AT 注册接口 at_diting_tcxo_example_cmd_register()
CMakeLists.txt 定义独立组件和注册宏 diting_tcxo_sampleAT_DITING_EXAMPLE_TCXO_TEST
README.md 说明运行方法和预期结果 AT+TCXOTEST

核心流程

bool diting_tcxo_demo_run(void)
{
    uint64_t before = uapi_tcxo_get_ms();
    (void)osal_msleep(TCXO_DEMO_DELAY_MS);
    uint64_t delta = uapi_tcxo_get_ms() - before;
    printf("[DRV][TCXO] delta=%llums\n", (unsigned long long)delta);
    return delta >= TCXO_DEMO_DELAY_MS;
}

示例用 TCXO 计数测量 OS 睡眠前后的真实时间增量。判断条件使用“不小于 20 ms”,允许任务调度带来少量额外延迟。聚合自测调用同一公开接口,不维护另一份计时代码。

基于 TCXO Demo 开发自己的应用

  1. 复制 samples/native_samples/tcxo,修改组件名和构建开关,保留 diting_tcxo_demo_run() 这类可直接调用的运行函数。
  2. 从应用任务、系统服务或 app_run 启动入口调用运行函数。
  3. 根据精度选择 uapi_tcxo_get_count()uapi_tcxo_get_ms()uapi_tcxo_get_us()
  4. 短延时可使用 TCXO 延时接口;任务级等待优先使用 OS 睡眠,避免长时间占用 CPU。
  5. 测量外设操作耗时时,只包围目标调用,并记录单位和允许误差。
  6. 在上层 CMake 和目标配置中增加新组件入口。

如需串口触发板端回归,可选配 AT 命令和 AT 适配层注册;产品计时与延时逻辑应直接调用 TCXO 接口。

功能描述

TCXO模块提供的接口:

接口名称 功能简述 API文档
uapi_tcxo_init 初始化TCXO模块 tcxo.md
uapi_tcxo_get_count 获取TCXO当前计数值 tcxo.md
uapi_tcxo_get_ms 获取TCXO当前计数毫秒值 tcxo.md
uapi_tcxo_get_us 获取TCXO当前计数微秒值 tcxo.md
uapi_tcxo_delay_ms 设置延迟毫秒数 tcxo.md
uapi_tcxo_delay_us 设置延迟微秒数 tcxo.md

开发指引

操作流程

操作流程

初始化TCXO

errcode_t ret;
ret = uapi_tcxo_init();
if (ret != ERRCODE_SUCC) {
    return ret;
}

获取计数值

uint64_t count;
count = uapi_tcxo_get_count();
PRINT("TCXO count: %llu\r\n", count);

获取时间值

uint64_t milliseconds;
uint64_t microseconds;

milliseconds = uapi_tcxo_get_ms();
microseconds = uapi_tcxo_get_us();

PRINT("Time: %llu ms, %llu us\r\n", milliseconds, microseconds);

延时功能

// 延时100毫秒
uapi_tcxo_delay_ms(100);

// 延时1000微秒
uapi_tcxo_delay_us(1000);

延时验证示例

void test_tcxo_dealyms(void)
{
    uint64_t count_before_delay_count;
    uint64_t count_after_delay_count;

    /* TCXO模块初始化 */
    uapi_tcxo_init();

    /* 通过count差值验证延迟时间 */
    count_before_delay_count = uapi_tcxo_get_count();
    uapi_tcxo_delay_ms(1000);  // 延时1秒
    count_after_delay_count = uapi_tcxo_get_count();

    printf("test case delay count %lu.\r\n",
           count_before_delay_count - count_after_delay_count);

    return;
}

注意事项

  1. 时钟源:基于外部32MHz晶体

  2. 高精度:相比Systick的32kHz时钟,TCXO提供更高精度的延时

  3. 计数频率:32MHz时,每计数一次约31.25ns

**计数频率**:32MHz时,每计数一次约31.25ns

延时时间计算(基于32MHz):

  • 延时1秒 = 32000000 count
  • 延时1ms = 32000 count
  • 延时1μs = 32 count

TCXO vs Systick:

特性 TCXO Systick
时钟频率 32MHz 32.768kHz
计数精度 ~31.25ns ~30.5μs
适用场景 高精度延时 普通延时
温度补偿 支持 不支持