第三十一章 MCO——PA8从主频分频输出

发布于:2025-06-28 ⋅ 阅读:(21) ⋅ 点赞:(0)

第三十一章 MCO——PA8从主频分频输出

目录

第三十一章 MCO——PA8从主频分频输出

1 MCO功能概述

1.1 简介

1.2 基本概念

1.3 分频原理

2 应用场景

2.1 为外部设备提供时钟源

2.2 多芯片同步(主从模式)

2.3 调试与测量

2.4 通信协议的时钟同步

2.5 低功耗系统的时钟管理

3 注意事项

4 程序设计

4.1 使能时钟源

4.2 配置GPIO为MCO复用功能

4.3 选择时钟源并设置分频系数

4.4 主程序

5 下载验证

6 总结


W55MH32MCOMicrocontroller Clock Output)是一个重要的时钟输出功能,允许将内部时钟信号通过特定引脚输出到外部,供其他设备或系统同步使用。以下是关于MCO功能概述、应用场景及配置步骤的详细说明:

1 MCO功能概述

1.1 简介

W55MH32MCOMicrocontroller Clock Output)是微控制器的时钟输出引脚,允许将内部时钟源(如HSIHSEPLL或系统时钟)输出到外部,主要用于系统调试、外部设备同步或时钟测量。

1.2 基本概念

  • MCO引脚:通常为特定的GPIO(如W55MH32系列的PA8),需配置为复用功能(AF模式。
  • 时钟源MCO的时钟源可来自W55MH32内部的多种时钟信号,例如:
    • HSI(内部高速时钟):默认8MHz(不同型号可能不同)。
    • HSE(外部高速时钟):外接晶振或时钟源(如8MHz)。
    • PLL输出:经过锁相环倍频后的系统时钟(SYSCLK)。
    • LSI/LSE(低速时钟):通常用于低功耗场景(如RTC),但较少用于MCO输出。

1.3 分频原理

通过RCC时钟控制寄存器(如RCC_CFGR中的MCO预分频器(MCO Prescaler,可对时钟源进行分频,输出频率公式为:

(时钟源分频系数分频系数可选:124816

例如:若系统时钟(SYSCLK)为72MHz,分频系数设为4,则MCO输出频率为18MHz

2 应用场景

MCO的核心价值在于精准时钟输出和系统调试便利性,以下是其典型应用场景:

2.1 为外部设备提供时钟源

场景:当外部传感器、ADCDAC、通信模块(如WiFi/蓝牙芯片)需要精准时钟时,可直接使用MCO输出的时钟信号,避免额外时钟电路设计。

示例:为外部ADC芯片提供同步时钟,确保采样频率与W55MH32系统时钟同步。

2.2 多芯片同步(主从模式)

场景:多个W55MH32或其他MCU协同工作时,通过MCO输出主芯片的时钟,使从芯片以相同频率运行,避免异步通信带来的时序问题。

示例:工业控制中多处理器同步执行任务,或分布式系统中的时钟同步。

2.3 调试与测量

场景:开发阶段通过示波器测量MCO引脚,验证内部时钟配置是否正确(如PLL倍频、分频系数是否生效)。

用途:快速定位时钟配置错误(如系统时钟未按预期分频)。

2.4 通信协议的时钟同步

场景:在需要精确时钟的通信协议中(如SPII2SCAN),MCO可作为从设备的时钟参考,确保数据传输的稳定性。

示例W55MH32作为SPI主机时,MCO输出时钟供从机(如Flash芯片)同步,避免因时钟偏差导致的数据错误。

2.5 低功耗系统的时钟管理

场景:在电池供电系统中,通过MCO输出低频时钟(如将HSI分频至1MHz),供外部外设进入低功耗模式,同时保持系统部分功能运行。

3 注意事项

引脚驱动能力MCO输出频率不宜过高(需低于GPIO的最大可靠频率,通常建议不超过50MHz),高频时需考虑信号完整性(如阻抗匹配)。

时钟源使能顺序:配置MCO前需确保时钟源已稳定(如HSE起振完成),避免输出无效信号。

4 程序设计

配置MCO需依次完成时钟源使能、GPIO功能设置、寄存器分频配置等步骤,具体如下:

4.1 使能时钟源

若时钟源为PLLHSE,需先通过RCC寄存器使能对应的时钟(如RCC_HSEConfig(RCC_HSE_ON))。

若选择SYSCLK(系统时钟)作为源,需确保系统时钟已正确配置(如PLL倍频完成)。

4.2 配置GPIOMCO复用功能

MCO引脚(如PA8)设置为复用推挽输出,确保信号稳定输出:

void MCO_GpioConfig(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
 
    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);
}

选择引脚:确定使用PA8GPIO_Pin_8)。

设置速度:因外设需要高频信号(如MCO输出几十MHz的时钟),所以选择50MHz高速模式。

配置模式:复用推挽输出模式使引脚可输出外设的专用信号(而非普通GPIO电平)。

寄存器写入:通过GPIO_Init()函数将配置写入硬件寄存器,使引脚按设定模式工作。

4.3 选择时钟源并设置分频系数

通过RCC_CFGR寄存器的MCO位段选择时钟源,MCOPRE位段设置分频系数:

void RCC_MCOConfig(uint8_t RCC_MCO)
{
	/* Check the parameters */
	assert_param(IS_RCC_MCO(RCC_MCO));
 
	if(RCC_MCO <= RCC_MCO_PLLCLK_Div2)
	{
		/* Perform Byte access to MCO bits to select the MCO source */
		*(__IO uint8_t *) CFGR_BYTE4_ADDRESS = RCC_MCO;
	}
	else
	{
		*(__IO uint8_t *) CFGR_BYTE4_ADDRESS = RCC_MCO_PLLCLK_Div2;
	}
	RCC->RCC_MCO_VAL = RCC_MCO - 6;
}

该函数主要实现的功能为:

  • 参数校验:确保输入的 MCO 配置是W55MH32支持的合法选项。
  • 寄存器写入:通过字节访问 RCC_CFGR 寄存器的特定位段,设置 MCO 的时钟源和分频系数。
  • 异常保护:若输入非法参数,强制使用安全的默认配置(RCC_MCO_PLLCLK_Div2)。

4.4 主程序

主程序main()实现整体功能,验证时钟配置并提供时钟输出测试:

int main(void)
{
    RCC_ClocksTypeDef clocks;
 
    delay_init();
 
    RCC_ClkConfiguration();
 
    UART_Configuration(115200);
    printf("MCO Out Pll Div Test.\n");
    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);
 
    MCO_GpioConfig();
    RCC_MCOConfig(RCC_MCO_PLLCLK_Div16);
 
    while (1);
}

程序首先初始化延时函数和系统时钟,配置UART115200波特率输出调试信息,然后获取并打印系统时钟、AHB总线、APB1/APB2总线及ADC时钟的频率。接着配置MCO引脚(PA8)并将PLL时钟除以16后通过该引脚输出。最后程序进入无限循环保持运行状态,

5 下载验证

程序下载运行后,首先打印了示例名称和各系统时钟频率,然后PA8引脚持续输出波形:

6 总结

MCO功能通过灵活配置时钟源和分频系数,为W55MH32提供了对外输出时钟的能力,简化了系统设计中的时钟同步问题。先理解其应用场景(如多芯片同步、调试测量),再掌握配置步骤(时钟源选择、GPIO设置、分频配置),可更高效地应用于实际项目中。


网站公告

今日签到

点亮在社区的每一天
去签到