发新帖本帖赏金 30.00元(功能说明)我要提问
返回列表
打印
[APM32F4]

【技术分享】什么?APM32F411的MCO还能这样用

[复制链接]
962|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kai迪皮|  楼主 | 2023-12-21 14:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#申请原创# @21小跑堂
1 什么是MCO?

正式开始前先简单说一下啥是MCO(可能大家一头雾水),MCO:Main clock output,即主时钟输出功能。它在APM32F411上可以输出内部时钟、外部时钟、PLL时钟、或者主时钟的时钟信号输出到指定的引脚上。

2 MOC能用来干什么?

既然是输出主时钟,那MCO一般能用来做什么呢?

在我看来MCO一般可以用于以下方面:

1. 时钟监测:通过将系统时钟(SYSCLK)输出到MCO引脚,您可以监测和测量系统时钟的频率。这对于调试和验证系统时钟的正确性和稳定性非常有用。
2. 外部时钟源供应:MCO功能可以用于将时钟源(如PLL时钟或外部高速时钟)输出到MCO引脚,以供外部电路使用。这对于需要外部设备或外部模块的时钟信号的应用非常有用。

2.1 时钟检测

这个功能很好理解。

假设我们现在设置的系统时钟是60MHz,那我们怎么去确定确实是60MHz呢?是的,MCO提供了这个检查窗口,我们可以将系统时钟直接(或分频)输出出来,打上示波器,我们就可以看到是否有所异常啦。

还有另外的一些情况,极端的时候我们使用串口或其他对输入时钟敏感的外设(大部分是通信外设),串口时不时会通信异常,会出现一些杂波?这个时候我们去检查软件,发现并没有什么异常,那我们此时设置MCO输出时钟,可以监控时钟是否在某些时候会有所异常,从而导致串口的通信波形变形。

专业点来描述就是:通过监测系统时钟的频率,可以验证系统时钟是否符合我们预期的要求,并检查任何时钟漂移、抖动或其他问题。如果监测到时钟频率与预期不符,可以进一步评估和调整系统的时钟源和相关配置,以确保系统的时钟稳定性和准确性。

2.2 外部时钟源供应

这个功能也十分简单。

假设我们的板子上需要外接一个传感器或者通信设备,它需要提供一个外部时钟才能正常工作,按正常来说我们是硬件给它一个晶振,但现在我们选项的APM32F411有MCO功能了,诶就可以省掉这个晶振咯(省点成本,量大就是几百万O(∩_∩)O)。

3 APM32F411的MCO

3.1 MCO时钟树

通过查阅APM32F411的手册,我们可以看到其MCO的时钟树:



MCO功能可以输出不同类型的时钟信号,包括:

- 系统时钟(SYSCLK):即微控制器的主时钟,通常来自内部RC振荡器、外部晶体振荡器或外部时钟源。
- HSI时钟:即内部高速RC振荡器的时钟信号。
- HSE时钟:即外部高速晶体振荡器的时钟信号。
- PLL1时钟:即锁相环的输出时钟信号,可以通过配置PLL的输入源和分频系数来获得所需的时钟频率。
- PLL2时钟:即音频接口(I2S)的使用的内部时钟。

3.2 MCO引脚

其用户手册6.3.7章节指明,其MCO引脚有两,一个是MCO1(PA8)、一个是 MCO2(PC9)



3.3 MCO寄存器

控制MCO输出的主要寄存器在RCM_CFG章节,控制这MCO输出的时钟及其相关的分配。



3.4 MCO配置代码

配置APM32F411的MCO输出(使用PA8做输出)可以参考如下步骤:

1. 启用GPIOA时钟,以便可以配置PA8引脚。
2. 配置MCO输出引脚的驱动能力。
3. 配置PA8引脚为复用功能:MCO。
4. 配置MCO时钟源和分频系数。

基本的参考代码如下:
/* Enable GPIOA Periph Clock */
RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);

/* GPIOA initialization */
GPIO_ConfigStructInit(&GPIO_ConfigStruct);
GPIO_ConfigStruct.pin = GPIO_PIN_8;
GPIO_ConfigStruct.mode = GPIO_MODE_AF;
GPIO_ConfigStruct.speed = GPIO_SPEED_100MHz;
GPIO_Config(GPIOA, &GPIO_ConfigStruct);
GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_8, GPIO_AF_MCO);

RCM_ConfigMCO1(RCM_MCO1_SEL_PLLCLK,RCM_MCO1_DIV_5);


4 使用MCO注意事项

1. 由于GPIO的频率受限,我的建议是输出的MCO频率不要过高,以防输出波形变形
2. 在做“外部时钟源供应”这个使用场景需要考虑模块使用的频率范围,若模块使用的频率跟APM32F411的MCO输出频率无法对应上,建议不要使用MCO输出给模块进行时钟源供应。

5 APM32F411 的MCO输出情况

下图分别是APM32F411MCO 输出20MHz、33.33MHz、50MHz、100MHz的情况。


具体代码可参考极海官方提供的:APM32F4xx_SDK_V1.4\Examples\RCM\RCM_ClockConfig


使用特权

评论回复

打赏榜单

21小跑堂 打赏了 30.00 元 2023-12-22
理由:恭喜通过原创审核!期待您更多的原创作品~

评论
kai迪皮 2023-12-27 10:32 回复TA
@21小跑堂 :感谢支持Thanks♪(・ω・)ノ 
forgot 2023-12-27 08:50 回复TA
MCO功能可以用于将时钟源出到MCO引脚 
21小跑堂 2023-12-22 15:34 回复TA
MCO----一个容易被忽视的功能,最大的作用在于时钟的检测,外部时钟源的供应可能受限较多,但是某些时候确实可以节约外设及成本,又一个新技能Get! 
发新帖 本帖赏金 30.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

212

帖子

11

粉丝