STM32之如何将时钟脉冲映射到IO输出

写在前面

有时为了验证晶振的精度,一种方式就是直接测量晶振的引脚的脉冲频率,这种方式的成本和测试条件都比较高,另一种方式就是经过单片机处理后经普通IO口输出,这种方式只要有普通的频率计或者示波器即可验证。
测试MCU:STM32F030C8T6
原理分析STM32F030C8T6或其他系列的单片机有一个功能叫MCO: Microcontroller clock output,可以将以下时钟输出到特定的GPIOA->Pin8:详见stm32f0xx_rcc.hRCC_MCO_Clock_Source
STM32之如何将时钟脉冲映射到IO输出_第1张图片

源码

void MCO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	// RCC_ClockSecuritySystemCmd(ENABLE);
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_0);
	/* Configure MCO (PA8) */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	RCC_MCOConfig(RCC_MCOSource_HSE, RCC_MCOPrescaler_16);
    while (1)
    {
        ;
    }
}

注意事项

  1. APIvoid RCC_MCOConfig(uint8_t RCC_MCOSource, uint32_t RCC_MCOPrescaler)的形参RCC_MCOPrescalerSTM32F030x8系列中无效。
  2. MCO功能的输出似乎与IO口的配置的GPIO_Speed无关,测试过程,配置RCC_MCOSourceRCC_MCOSource_PLLCLK时,即倍频后的时钟72MHz(板子上的外部晶振12MHz),IO口也可以正常输出72MHz频率的脉冲
  3. 一开始没注意编译器的预编译条件的配置,没选择正确的型号,造成API的调用错误,一直打不出脉冲,需要注意在如下图中配置好该预编译条件,仔细看源码也是可以发现问题的STM32之如何将时钟脉冲映射到IO输出_第2张图片

你可能感兴趣的:(STM32,工具使用,C语言)