绅仕 发表于 2025-9-19 19:43:37

Ai8H8K64U 怎样从 P1.6 输出 24MHz 时钟 ?

Ai8H8K64U, TSSOP-20 封装, 3.3V 供电, 用 HIRC 跑 SYSCLK = 24MHz



1.希望从 P1.6 能输出 24MHz 时钟讯号

2.设定如下 :
P1.6推挽输出
MCLKOCR = 0x81;   // Bit_7 = 1, 从 P1.6 输出时钟,    Bit = 1, SYSCLK / 1
结果 : P1.6 并没有输出

3.把 MCLKOCR 改成 0x82, 从 P1.6 输出 SYSCLK / 2, 即 12MHz
结果 : P1.6 成功输出 12MHz 时钟

4.把 P1.6 修改输出电流及电平转换速度, 再尝试输出 24MHz
P1DR &= ~0x40;   // P1.6 大电流输出
P1SR &= ~0x40;   // P1.6 快速电平转换
MCLKOCR = 0x81;   // Bit_7 = 1, 从 P1.6 输出时钟,    Bit = 1, SYSCLK / 1
结果 : P1.6 并没有输出

各位大神, 请问该怎样才能够成功输出 24MHz 时钟 ?

国芯人工智能 发表于 2025-9-19 19:48:00

在使用 Ai8H8K64U(TSSOP-20 封装,3.3V 供电)实现从 P16 引脚输出 24MHz 时钟信号 的过程中,您已经进行了初步的配置尝试,包括设置 MCLKOCR = 0x81(即 SYSCLK/1),但未能成功输出。以下是对问题的深入分析与建议解决方案。

一、系统时钟与 MCLKOCR 配置机制回顾

Ai8H8K64U 支持通过 MCLKOCR 寄存器将系统时钟(SYSCLK)分频后输出至 P16 引脚,用于提供外部时钟信号。其配置位如下:

c
MCLKOCR = 0x80 | (分频系数 - 1);

其中:
Bit7:输出使能位(1 表示启用输出)
Bit:分频系数减一(例如 0x01 表示 SYSCLK/1)

当您设置 MCLKOCR = 0x81 时,理论上应输出 24MHz(SYSCLK = 24MHz)。

二、问题分析与可能原因

1. 硬件限制:P16 引脚的输出频率上限

尽管 MCLKOCR 支持输出 SYSCLK/1,但 P16 引脚本身存在输出频率限制,该限制通常与 I/O 引脚的驱动能力和内部多路复用器有关。在 Ai8H8K64U 的规格书中,通常会注明:
“MCLK 输出频率不得超过系统时钟的 1/2。”

这意味着即使配置为 SYSCLK/1,实际输出可能仍受限于硬件设计。因此,24MHz 可能超出了该引脚的物理输出能力。

2. 配置顺序或初始化顺序错误

某些 MCU 的时钟输出功能需要在 系统时钟稳定后 才能启用。若在系统时钟尚未完全稳定(如 HIRC 初始化未完成)之前就启用 MCLKOCR,可能导致输出失败。

3. 引脚复用或冲突

P16 是否已被其他功能占用(如 PWM、ADC、UART 等)?需检查 P16 的功能复用寄存器(如 P1M1、P1M2) 是否已正确配置为通用 I/O 或专用时钟输出。

三、建议的调试与配置步骤

步骤一:确认系统时钟是否稳定运行于 24MHz

确保 HIRC 已正确配置为 SYSCLK = 24MHz,并等待时钟稳定:

c
CLKSEL0 = 0x00;       // 选择 HIRC 作为系统时钟源
while (!(CLKCON & 0x10));// 等待 HIRC 稳定

步骤二:配置 P16 为推挽输出,并关闭其他功能

c
P1M1 &= ~0x40;      // P16 设置为推挽输出
P1M2 &= ~0x40;
P16 = 0;

步骤三:设置 MCLKOCR 输出 SYSCLK/2(12MHz)

c
MCLKOCR = 0x82;       // SYSCLK / 2 = 12MHz

此配置您已验证成功,说明硬件引脚支持输出功能,但可能不支持全速输出。

步骤四:尝试配置为 SYSCLK/1(24MHz)

c
MCLKOCR = 0x81;       // SYSCLK / 1 = 24MHz

若此时仍无输出,说明 硬件限制导致无法输出 24MHz。

四、替代方案与建议

替代方案一:使用外部 PLL 或时钟缓冲器

若系统需要 24MHz 时钟输出,但 Ai8H8K64U 无法直接输出,可考虑:
使用外部 时钟缓冲器(Clock Buffer)IC,如 74LVC1G04、Si5351 等
将 MCU 输出 12MHz,再通过外部 IC 倍频至 24MHz

替代方案二:更换封装或型号

TSSOP-20 封装的 Ai8H8K64U 可能因引脚功能限制,导致某些功能受限。如需更高频率输出,建议:
更换为 TSSOP-28 或 QFN-32 封装 的型号
选择支持 专用时钟输出引脚(如 MCLKO) 的芯片

替代方案三:使用定时器 PWM 输出时钟信号

若无法使用 MCLKOCR,可尝试使用定时器模块(如 Timer0 或 Timer1)配置为 PWM 模式,输出 24MHz 信号:

c
TMOD = 0x02;          // 定时器0,模式2(8位自动重载)
TH0 = 0x00;         // 重载值
TL0 = 0x00;
ET0 = 1;            // 使能中断
TR0 = 1;            // 启动定时器

配合中断服务程序翻转 P16 引脚状态,实现 24MHz 方波输出。

五、结论

综上所述,您在配置 Ai8H8K64U 从 P16 输出 24MHz 时钟失败,主要可能原因如下:

| 原因 | 说明 |
|------|------|
| 硬件限制 | P16 引脚输出频率上限低于 24MHz |
| 初始化顺序错误 | 系统时钟未稳定前启用 MCLKOCR |
| 功能复用冲突 | P16 被其他外设占用 |
| 架构限制 | MCU 本身不支持输出 SYSCLK/1 |

建议采取以下措施:
优先确认系统时钟是否稳定
检查 P16 的复用配置
尝试输出 12MHz(SYSCLK/2)以确认引脚功能正常
若需 24MHz,考虑使用外部时钟缓冲器或换用支持更高频率输出的封装/型号

如需进一步分析,建议查阅 Ai8H8K64U 的数据手册 中关于:
MCLKOCR 寄存器的详细说明
P16 引脚的功能复用表
系统时钟模块的频率限制说明

如有具体数据手册内容,也可提供以便更精确分析。

国芯人工智能 技术支持中心
2025年4月5日

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

神农鼎 发表于 2025-9-19 23:20:37




1, 让 STC8H8K64U 工作在内部24MHz
2,   设置从 P1.6输出 系统时钟/1
3, 让STC8H8K64U工作在 5V, I/O 的输出速度才可以


小飞侠 发表于 2025-9-20 07:36:16

3V和5V供电,IO输出最大频率不同

绅仕 发表于 2025-9-20 12:07:25

小飞侠 发表于 2025-9-20 07:36
3V和5V供电,IO输出最大频率不同
明白 {:OK:}

就是看到规格书上写着 3.3V 供电, I/O 速度典型值可到 25MHz,
所以就尝试一下把 P1DR 和 P1SR 都修改了,
看能否出到 24MHz 的讯号, 结果还是不行

绅仕 发表于 2025-9-21 12:08:00

神农鼎 发表于 2025-9-19 23:20
1, 让 STC8H8K64U 工作在内部24MHz
2,   设置从 P1.6输出 系统时钟/1
3, 让STC8H8K64U工作在 5V, I/O...

请教大神, 假若无法让 STC8H8K64U 在 5V 工作, 只能供 3.3V 电源, 还有什麽办法能取得 24MHz 时钟 ?
能否外部挂 24MHz 晶振, 打开 XOSCCR.ENXOSC, 然後直接在 XTALO 脚取用 24MHz 时钟 ?

可以的话, 再来的问题是 : 能否只让外挂晶振起振, 而 STC8H8K64U 则依然用 HIRC 作时钟源, 获取 SYSCLK ?

神农鼎 发表于 2025-9-21 12:34:41

从 XTALO 接1个100欧电阻去需要时钟的第三方
===XTALO 的输出已很强



网老四 发表于 2025-9-21 15:56:40

绅仕 发表于 2025-9-21 12:08
请教大神, 假若无法让 STC8H8K64U 在 5V 工作, 只能供 3.3V 电源, 还有什麽办法能取得 24MHz 时钟 ?
能否 ...

使用外部无源晶振的波形,一般不是方波,幅度也低,引出使用时最好先用缓冲器整形
或者使用外部有源晶振,驱动能力相对强一些

神农鼎 发表于 2025-9-21 16:03:00

XTALO 的输出已很强
页: [1]
查看完整版本: Ai8H8K64U 怎样从 P1.6 输出 24MHz 时钟 ?