全部例程

MCO - PA8从主频分频输出

W55MH32

更新于 2026年8月13日

本篇总结

使用 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 用于输出调试信息。

引脚功能方向模式
PA8MCO(时钟输出)开发板 → 示波器复用推挽输出 (AF_PP)
PA9USART1_TX开发板 → PC复用推挽输出 (AF_PP)
PA10USART1_RXPC → 开发板浮空输入 (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.uvprojxF7 编译,确认 0 Error(s)。连接 DEBUG USB 口到 PC,F8 下载。

运行验证

下载固件并按 RESET 后,PA8 引脚输出 SYSCLK 时钟信号。使用示波器探头连接 PA8,可观察到方波时钟信号。输出 SYSCLK 时频率为 72MHz(注意 GPIO 速度限制,建议改用 PLLCLK/2 输出 36MHz 以获得更好的波形质量)。串口打印系统时钟信息。

MCO时钟输出示波器波形
示波器测量 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)

下载本章例程

我们提供完整的工程文件以及配套开发板,方便你随时测试,快速完成产品开发:

开发环境: Keil MDK5 配套开发板

Andy

W5500 技术支持专家