1前言
1.1 文章约定
- RTC 为可低功耗下运行的定时器
- 32K晶体 芯片外部RTC时钟源,通常是32.768Khz的晶体
- 32KRC 表示芯片内部的RTC时钟源,可校准到32.000Khz,亦或者32.768Khz
- CLK_OSC32K 为WCH的蓝牙工程中,RTC的时钟源的宏定义
2适用的芯片
- ch579/ch578/ch577
- ch573/ch571/ch58x/ch59x
- ch32v208/ch32f208
3在ch573/ch58x_gen1平台上
CLK_OSC32K |
RTC时钟源 |
RTC时钟频率 |
TMOS时钟源 |
BLE时钟源 |
动态低功耗(注1) |
备注 |
0x00 |
32K晶体 |
32.768KHZ |
RTC |
RTC |
可以 |
|
0x01 |
32KRC(校准到32KHZ) |
32KHZ |
RTC |
RTC |
可以 |
不建议BLE主机使用 |
0x02 |
32KRC(校准到32.768K) |
32.768KHZ |
RTC |
RTC |
可以 |
不建议BLE主机使用 |
0x80 |
32K晶体 |
32.768KHZ |
RTC |
高频时钟(注2) |
不可以 |
|
0x81 |
32KRC(校准到32KHZ) |
32KHZ |
RTC |
高频时钟 |
不可以 |
|
0x82 |
32KRC(校准到32.768K) |
32.768KHZ |
RTC |
高频时钟 |
不可以 |
|
- 注1:所谓动态低功耗,即为在蓝牙运行的同时可以高频次的进行睡眠唤醒自行调度,这依赖低功耗下的高精度定时器
- 注2:当BLE时钟源为高频时钟时,对tmos的时钟没有特别要求情况下,可以禁用内部RC的校准代码来节省一定的flash和ram空间
4在ch32v208/ch32f208/ch59x/ch58x_gen2平台上
4.1 CLK_OSC32K的说明
CLK_OSC32K |
RTC时钟源 |
RTC时钟频率 |
TMOS时钟源 |
BLE时钟源 |
动态低功耗 |
备注 |
0x00 |
32K晶体 |
16.384KHZ |
RTC |
RTC |
可以 |
|
0x01 |
32KRC(校准到32KHZ) |
16KHZ |
RTC |
RTC |
可以 |
不建议BLE主机使用 |
0x02 |
32KRC(校准到32.768K) |
16.384KHZ |
RTC |
RTC |
可以 |
不建议BLE主机使用 |
\ (注1) |
\ |
\ |
高频时钟 |
高频时钟 |
不可以 |
|
- 注1:ch32v208/ch32f208的蓝牙在不开启动态低功耗情况下,可以完全脱离低频时钟运行,RTC可以完全由用户控制,详见4.2
4.2 TMOS和BLE完全不用RTC
1,蓝牙和tmos的时钟可以完全不用rtc:
先把宏改成 CLK_OSC32K = 0
,选0不开启内部低频RC的定时校准
2,然后可以完全注释掉RTC.c 里HAL_TimeInit函数里面的RTC部分的代码
void HAL_TimeInit(void)
{
//此之前的代码可以完全注释掉
//TMOS_TimerInit( RTC_GetCounter );
//传入NULL,使用HSE做BLE和tmos的时钟,不可做动态低功耗
TMOS_TimerInit( NULL );
}
5在ch579/ch578平台上
CLK_OSC32K |
RTC时钟源 |
RTC时钟频率 |
TMOS时钟源 |
BLE时钟源 |
动态低功耗 |
备注 |
0x00 |
外部低频时钟 |
32.768KHZ |
RTC |
RTC |
可以 |
|
0x01 |
内部RC(校准到32KHZ) |
32KHZ |
RTC |
RTC |
可以 |
不建议BLE主机使用 |
0x02 |
内部RC(校准到32.768K) |
32.768KHZ |
RTC |
RTC |
可以 |
不建议BLE主机使用 |
6配合抢占式操作系统运行
- 是能HAL_SLEEP=TRUE, 利用睡眠函数和RTC中断进行上下文切换