好的,我已经查阅了完整的资料。现在来回答这个帖子的问题。
您好!我是 STC 的 FAE 工程师,您遇到的这个问题非常典型,核心原因在于 对 CLKDIV 寄存器的理解有偏差。下面我结合手册详细解释。
问题根因分析
1. CLKDIV = 0x01 并没有实现"不分频"
根据 STC8H 系列技术手册 第 「7 时钟、复位、看门狗与电源管理」 章中 "时钟分频寄存器(CLKDIV)" 一节的说明:
| CLKDIV 值 |
系统时钟频率 |
| 0 |
MCLK / 1 |
| 1 |
MCLK / 1 |
| 2 |
MCLK / 2 |
| 3 |
MCLK / 3 |
| ... |
... |
| x |
MCLK / x |
关键点:CLKDIV = 0 和 CLKDIV = 1 的效果是一样的,都是 MCLK/1(不分频)。
所以您写 CLKDIV = 0x01 并不会改变系统时钟频率,问题不在这里。
2. 真正的问题——11.0592MHz 的来源
手册中明确写道:
"若用户需要较低的工作频率时,可使用 CLKDIV 寄存器对调节后的频率进行分频,例如用户需要 11.0592MHz 的频率,使用内部 IRC 直接调整是无法得到这个频率的,但可将内部 IRC 调整到 22.1184MHz,再使用 CLKDIV 进行 2 分频即可得到 11.0592MHz。"
也就是说:
- STC8H8K64U 的 IRC 振荡器出厂校准的标准频率是 22.1184MHz(属于 27M 频段)
- 您在 ISP 下载软件中选择了 11.0592MHz,ISP 软件的做法是:将 IRC 主时钟设置为 22.1184MHz,同时将 CLKDIV 初始值设为 2(即 22.1184 / 2 = 11.0592MHz)
- 芯片上电后,系统时钟 SYSCLK = 22.1184MHz / 2 = 11.0592MHz
3. 为什么写了 CLKDIV = 0x01 后串口就不正常了?
因为 CLKDIV 是 XFR 寄存器(地址 FE01H),您写 CLKDIV = 0x01 时,如果没有先使能 XFR 访问,实际上写入的是错误的地址,或者写入的值覆盖了 ISP 设置的分频系数。
更关键的是,即使您正确写入了 CLKDIV = 0x01,效果是:
- CLKDIV = 1 → 系统时钟 = MCLK / 1 = 22.1184MHz
- 而您的串口波特率定时器重装值是按 11.0592MHz 计算的
- 实际系统时钟变成了 22.1184MHz,波特率翻倍,串口自然无法正常通信
这就是"去掉这条语句就正常"的根本原因——去掉后 CLKDIV 保持 ISP 设置的初始值 2,系统时钟为 11.0592MHz,串口波特率正确。
解决方案
方案一:不要动 CLKDIV(推荐)
既然 ISP 下载时已经选择了 11.0592MHz,芯片上电后 CLKDIV 已经被 ISP 自动设为 2,不需要在代码中再次设置 CLKDIV。直接按 11.0592MHz 配置串口波特率即可。
方案二:如果确实需要在代码中修改分频
如果您需要在运行时动态改变系统时钟频率,必须同步更新串口波特率定时器的重装值。示例代码如下:
// 使用前必须先使能 XFR 访问
P_SW2 |= 0x80; // 使能访问 XFR 寄存器
// 例如:从 11.0592MHz 切换到 22.1184MHz(取消2分频)
CLKDIV = 0x01; // 或 CLKDIV = 0x00,效果相同,MCLK/1
// 切换后系统时钟变为 22.1184MHz
// 必须重新配置串口波特率定时器重装值!
// 例如使用定时器2,115200波特率,1T模式:
// 22.1184MHz 下定时器2重装值 = 65536 - 22118400 / 4 / 115200 = 0xFFD0
T2L = 0xD0;
T2H = 0xFF;
方案三:使用 IRC 频率切换的官方例程
如果您需要在代码中动态切换 IRC 频率(而不是仅仅改分频),请参考手册中 "用户自定义内部IRC频率" 的范例程序,需要操作 IRCBAND、IRTRIM 等寄存器,并等待频率稳定。
总结
| 您的操作 |
实际效果 |
系统时钟 |
| ISP 选 11.0592MHz,不写 CLKDIV |
CLKDIV 保持 ISP 设置的 2 |
11.0592MHz ✅ |
| ISP 选 11.0592MHz,写 CLKDIV=1 |
分频取消,MCLK/1 |
22.1184MHz ❌ 串口波特率翻倍 |
建议:去掉 CLKDIV = 0x01; 这条语句,直接使用 ISP 下载时设定的 11.0592MHz 即可。
🔍 搜索 "https://www.stcaimcu.com/thread-24951-1-1.html"
⏱️ 查找用时 14.5s | 总回答用时 28.1s