关于MCO,相关介绍如下图:
针对以上8个时钟信号作为MCO时钟输出的配置如下:
1、系统时钟输出
此时MCO引脚(PA8)输出时钟频率即系统主频的大小
GPIO_InitTypeDef GPIO_InitStructure = {0};RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* MCO Output GPIOA 8 */RCC_MCOConfig(RCC_MCO_SYSCLK);
2、HSI时钟输出
此时MCO引脚(PA8)输出时钟频率即内部高速时钟(HSI)的大小,一般为8MHz
GPIO_InitTypeDef GPIO_InitStructure = {0};RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* MCO Output GPIOA 8 */RCC_MCOConfig(RCC_MCO_HSI);
3、HSE时钟输出
此时MCO引脚(PA8)输出时钟频率即外部高速时钟(HSE)的大小
GPIO_InitTypeDef GPIO_InitStructure = {0};RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* MCO Output GPIOA 8 */RCC_MCOConfig(RCC_MCO_HSE);
4、PLL时钟经过2分频输出
关于PLL时钟介绍以及时钟来源参考下图介绍
PLL时钟一般在配置系统主频时进行配置,一般默认使用PLL时钟作为系统时钟
MCO输出配置如下:
GPIO_InitTypeDef GPIO_InitStructure = {0};RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* MCO Output GPIOA 8 */RCC_MCOConfig(RCC_MCO_PLLCLK_Div2);
5、PLL2时钟输出
关于PLL2时钟,其时钟树框图如下:
可通过时钟控制寄存器和时钟配置寄存器2配置开启PLL2时钟,注意关于PLL2倍频因子以及分频因子配置,需要在PLL2关闭才可写入
MCO输出PLL2时钟配置如下:
GPIO_InitTypeDef GPIO_InitStructure = {0};RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// RCC->CFGR2 |= (uint32_t)(RCC_PREDIV2_Div2 | RCC_PLL2Mul_6 ); // RCC->CTLR |= ((uint32_t)RCC_PLL2ON); RCC_PLL2Cmd(DISABLE);RCC_PREDIV2Config(RCC_PREDIV2_Div2);RCC_PLL2Config(RCC_PLL2Mul_6);RCC_PLL2Cmd(ENABLE);/* MCO Output GPIOA 8 */RCC_MCOConfig(RCC_MCO_PLL2CLK);
6、PLL3时钟输出
关于PLL3时钟,其时钟树框图如下:
同PLL2时钟配置一致,PLL3时钟关于PLL2倍频因子以及分频因子配置,需要在PLL3关闭才可写入
MCO输出PLL3时钟配置如下:
GPIO_InitTypeDef GPIO_InitStructure = {0};RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// RCC->CFGR2 |= (uint32_t)(RCC_PREDIV2_Div2 | RCC_PLL3Mul_4 ); // RCC->CTLR |= ((uint32_t)RCC_PLL3ON); RCC_PLL3Cmd(DISABLE);RCC_PREDIV2Config(RCC_PREDIV2_Div2);RCC_PLL3Config(RCC_PLL3Mul_4);RCC_PLL3Cmd(ENABLE);/* MCO Output GPIOA 8 */RCC_MCOConfig(RCC_MCO_PLL3CLK);
7、PLL3时钟经过2分频输出
程序配置如下:
GPIO_InitTypeDef GPIO_InitStructure = {0};RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// RCC->CFGR2 |= (uint32_t)(RCC_PREDIV2_Div2 | RCC_PLL3Mul_4 ); // RCC->CTLR |= ((uint32_t)RCC_PLL3ON); RCC_PLL3Cmd(DISABLE);RCC_PREDIV2Config(RCC_PREDIV2_Div2);RCC_PLL3Config(RCC_PLL3Mul_4);RCC_PLL3Cmd(ENABLE);/* MCO Output GPIOA 8 */RCC_MCOConfig(RCC_MCO_PLL3CLK_Div2);
8、XT1 外部 3-25MHz 振荡器(用于以太网)
程序配置如下:
GPIO_InitTypeDef GPIO_InitStructure = {0};RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* MCO Output GPIOA 8 */RCC_MCOConfig(RCC_MCO_XT1);