本篇总结
使用 MCO,从 PA8 输出系统时钟分频信号。
🔑 KEIL MDK、UART调试、MCO
MCO(Microcontroller Clock Output,微控制器时钟输出)功能可将内部时钟信号通过 PA8 引脚输出到外部,便于时钟测量、同步或为其他器件提供时钟源。W55MH32L 的 MCO 支持输出 SYSCLK(系统时钟)、HSI(内部高速时钟)、HSE(外部高速时钟)和 PLLCLK/2(PLL 时钟二分频)。本示例输出 SYSCLK(72MHz)到 PA8,可通过示波器测量验证。
前置工具准备
开始本例程前,请确认以下工具已安装:
- WIZ UartTool V1.0:串口收发测试工具:点击下载
硬件连接
本例程使用 PA8 引脚输出时钟信号(MCO 功能)。用示波器探头连接 PA8 可测量输出时钟的频率和波形。USART1 用于输出调试信息。
| 引脚 | 功能 | 方向 | 模式 |
| PA8 | MCO(时钟输出) | 开发板 → 示波器 | 复用推挽输出 (AF_PP) |
| PA9 | USART1_TX | 开发板 → PC | 复用推挽输出 (AF_PP) |
| PA10 | USART1_RX | PC → 开发板 | 浮空输入 (IN_FLOATING) |
工程结构
工程位于 SDK 内 1.SDK\ModuleDemo\MCO\,核心文件如下:
MCO/
├── USER/
│ ├── main.c ← MCO配置 + 时钟输出
│ ├── w55mh32_conf.h ← 外设头文件集中包含
│ ├── w55mh32_it.c/h ← 中断服务函数
│ ├── system_w55mh32.c/h← 系统初始化(时钟配置)
│ └── startup_w55mh32.s ← 启动文件
└── SYSTEM/
└── delay/
└── delay.c/h ← SysTick 延时函数
步骤1:MCO 配置与时钟输出
文件:USER/main.c — 配置 PA8 为复用推挽输出,通过 RCC_MCOConfig() 选择输出 SYSCLK(系统时钟 72MHz)。
void MCO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* PA8: MCO → 复用推挽输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 选择 MCO 输出时钟源:SYSCLK */
RCC_MCOConfig(RCC_MCO_SYSCLK);
/* 可选时钟源:
RCC_MCO_NoClock - 无时钟输出
RCC_MCO_SYSCLK - 系统时钟 (72MHz)
RCC_MCO_HSI - 内部高速时钟 (8MHz)
RCC_MCO_HSE - 外部高速时钟 (8MHz)
RCC_MCO_PLLCLK_Div2 - PLL 时钟 2 分频 (36MHz)
*/
}
int main(void)
{
RCC_ClocksTypeDef clocks;
delay_init();
UART_Configuration(115200);
RCC_GetClocksFreq(&clocks);
printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, "
"PCLK2: %3.1fMhz, ADCCLK: %3.1fMhz\n",
(float)clocks.SYSCLK_Frequency / 1000000,
(float)clocks.HCLK_Frequency / 1000000,
(float)clocks.PCLK1_Frequency / 1000000,
(float)clocks.PCLK2_Frequency / 1000000,
(float)clocks.ADCCLK_Frequency / 1000000);
printf("MCO Test - SYSCLK output on PA8.\n");
MCO_Configuration();
while (1);
}
MCO 配置只需两步:配置 PA8 为复用推挽输出(GPIO_Mode_AF_PP),调用 RCC_MCOConfig() 选择时钟源。PA8 是 MCO 的固定输出引脚,不可更改。输出时钟频率最高不超过 50MHz(受 GPIO 速度限制),因此输出 SYSCLK(72MHz) 时建议使用 PLLCLK/2(36MHz)。
如果你想自定义
- 换时钟源 → 修改
RCC_MCOConfig() 参数:RCC_MCO_HSI(8MHz)、RCC_MCO_HSE(8MHz)、RCC_MCO_PLLCLK_Div2(36MHz)
- 为外部器件提供时钟 → 将 PA8 连接到外部芯片的时钟输入引脚,MCO 可作为外部器件的时钟源
编译与下载
Keil MDK 中打开 MCO.uvprojx,F7 编译,确认 0 Error(s)。连接 DEBUG USB 口到 PC,F8 下载。
运行验证
下载固件并按 RESET 后,PA8 引脚输出 SYSCLK 时钟信号。使用示波器探头连接 PA8,可观察到方波时钟信号。输出 SYSCLK 时频率为 72MHz(注意 GPIO 速度限制,建议改用 PLLCLK/2 输出 36MHz 以获得更好的波形质量)。串口打印系统时钟信息。
示波器测量 PA8 引脚 MCO 输出波形:时钟信号频率与配置的时钟源一致
常见问题
Q: PA8 无时钟信号输出
确认 PA8 配置为复用推挽输出(GPIO_Mode_AF_PP)。检查 RCC_MCOConfig 参数是否正确。确认 GPIO 速度设置为 GPIO_Speed_50MHz。
Q: 示波器测量频率不正确
检查系统时钟配置,通过 RCC_GetClocksFreq 确认实际 SYSCLK 频率。注意 MCO 输出频率受 GPIO 速度限制,72MHz 可能波形质量不佳,建议使用 PLLCLK/2(36MHz)。
Q: MCO 是否可以输出到其他引脚
MCO 输出固定在 PA8 引脚,不可更改。如果需要其他引脚输出时钟,可使用定时器的 PWM 输出功能生成时钟信号。
总结
本文基于 W55MH32L 的 MCO 功能实现了微控制器时钟输出:
- MCO 输出:PA8 复用推挽输出,通过
RCC_MCOConfig() 选择时钟源
- 支持输出 SYSCLK(72MHz)、HSI(8MHz)、HSE(8MHz)、PLLCLK/2(36MHz) 四种时钟源
- 可用于时钟测量验证、外部器件时钟源提供、系统时钟同步等场景
- PA8 是 MCO 固定输出引脚,输出频率受 GPIO 速度限制(建议不超过 50MHz)