pmsptgje 发表于 3 天前

8H掉电唤醒专用定时器时钟频率误差这么大吗?

我用以下代码,读取F8H(存频率的高字节)和F9H(存频率的低字节)里的内容,即出厂记录的掉电唤醒专用定时器时钟频率。2个单片机,读取出来的频率值分别为45061、8197。和32K的频率相差甚远。这么为什么?
#include <stc8h.h>

// 使用sfr定义F8H和F9H寄存器
sfr RAM_F8H = 0xF8;
sfr RAM_F9H = 0xF9;

unsigned int get_wakeup_timer_frequency() {
    return (RAM_F8H << 8) | RAM_F9H;
}

int main() {
    unsigned int freq = get_wakeup_timer_frequency();
    while (1);
}

国芯人工智能 发表于 3 天前

在STC8H系列单片机中,掉电唤醒专用定时器的时钟频率通常由内部32KHz的低速振荡器提供。然而,您提到的读取到的频率值与预期的32KHz相差甚远,这可能是由于以下几个原因导致的:

1. 寄存器读取方式不正确
您使用的代码中,直接通过sfr定义并读取了F8H和F9H寄存器的值。然而,STC8H系列单片机的掉电唤醒专用定时器频率值可能并不是直接存储在这两个寄存器中,或者需要特定的读取方式。建议您查阅STC8H系列单片机的用户手册,确认F8H和F9H寄存器的具体用途以及读取方式。

2. 寄存器值未正确初始化
在某些情况下,F8H和F9H寄存器中的值可能未正确初始化,或者在上电复位后未正确加载。这可能导致读取到的频率值与实际频率不符。建议您在读取之前,先确认这些寄存器是否已经正确初始化。

3. 时钟源不稳定
掉电唤醒专用定时器的时钟源是内部32KHz的低速振荡器,该振荡器在低功耗模式下可能会受到温度、电压等因素的影响,导致频率不稳定。如果时钟源不稳定,读取到的频率值也会出现偏差。

4. 代码逻辑问题
您的代码中,getwakeuptimerfrequency()函数返回的是RAMF8H的值,但未对RAMF9H进行处理。如果频率值是由F8H和F9H两个寄存器共同存储的,那么您需要将这两个寄存器的值进行组合,才能得到完整的频率值。例如:

```c
unsigned int getwakeuptimerfrequency() {
    return (RAMF8H

[本文内容由国芯人工智能辅助生成,仅供参考]

神农鼎 发表于 3 天前

掉电唤醒定时器的时钟,追求低功耗,所以误差+温漂大,但只有 1.5uA的电流

DebugLab 发表于 3 天前

读出的值比较离谱先检查读的对不对,有CHIPID的型号,要到只读SFR中读取CHIPID

https://www.stcaimcu.com/forum.php?mod=viewthread&tid=16535

各种时钟问题:
内部低频时钟(约32K)作为掉电唤醒定时器,出于低功耗考虑,无抗温飘压飘电路,精度较低,不能作为RTC时钟使用,RTC使用内部低频时钟仅供测试(看秒在走就是RTC正常工作),不要在实际运行时使用
外接晶振必须要先设置接晶振的IO口为高阻,然后打开晶振并等待频率稳定,否则用死循环等待时钟稳定会在这里卡死
内部高频时钟精度足够高,可以满足绝大多数应用场合,外部高频晶振易受干扰且对外电磁辐射大,无特殊要求没有理由使用外部高频晶振,支持追频的型号可外接32768晶振实时校准内部高频时钟

页: [1]
查看完整版本: 8H掉电唤醒专用定时器时钟频率误差这么大吗?