tcxo开发指南
概述
TCXO(Temperature Compensated Crystal Oscillator,温度补偿晶体振荡器)是通过附加的温度补偿电路削减周围温度变化产生的振荡频率变化量的有源石英晶体振荡器。
SDK可以外接XO来为系统提供高精度的计数和延时功能。TCXO基于外部32MHz晶体为系统提供高精度计数。
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 环境配置后执行:
使用一站式 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
使用方式
预期结果
实际增量可能受任务调度影响而略大于 20 ms:
需要一次性检查 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_sample、AT_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 开发自己的应用
- 复制 samples/native_samples/tcxo,修改组件名和构建开关,保留
diting_tcxo_demo_run()这类可直接调用的运行函数。 - 从应用任务、系统服务或
app_run启动入口调用运行函数。 - 根据精度选择
uapi_tcxo_get_count()、uapi_tcxo_get_ms()或uapi_tcxo_get_us()。 - 短延时可使用 TCXO 延时接口;任务级等待优先使用 OS 睡眠,避免长时间占用 CPU。
- 测量外设操作耗时时,只包围目标调用,并记录单位和允许误差。
- 在上层 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
获取计数值
获取时间值
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);
延时功能
延时验证示例
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;
}
注意事项
-
时钟源:基于外部32MHz晶体
-
高精度:相比Systick的32kHz时钟,TCXO提供更高精度的延时
-
计数频率: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 |
| 适用场景 | 高精度延时 | 普通延时 |
| 温度补偿 | 支持 | 不支持 |