写在前面
有时为了验证晶振的精度,一种方式就是直接测量晶振的引脚的脉冲频率,这种方式的成本和测试条件都比较高,另一种方式就是经过单片机处理后经普通IO口输出,这种方式只要有普通的频率计或者示波器即可验证。
测试MCU:STM32F030C8T6
原理分析:STM32F030C8T6
或其他系列的单片机有一个功能叫MCO: Microcontroller clock output
,可以将以下时钟输出到特定的GPIOA->Pin8:详见stm32f0xx_rcc.h
的RCC_MCO_Clock_Source
源码
stm32F0
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)
{
;
}
}
stm32F1
void MCO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// RCC_ClockSecuritySystemCmd(ENABLE);
RCC_AHBPeriphClockCmd(RCC_APB2Periph_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_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_MCOConfig(RCC_MCO_PLLCLK_Div2);
while (1)
{
;
}
}
注意事项
- API
void RCC_MCOConfig(uint8_t RCC_MCOSource, uint32_t RCC_MCOPrescaler)
的形参RCC_MCOPrescaler
在STM32F030x8
系列中无效。 - MCO功能的输出似乎与IO口的配置的
GPIO_Speed
无关,测试过程,配置RCC_MCOSource
为RCC_MCOSource_PLLCLK
时,即倍频后的时钟72MHz(板子上的外部晶振12MHz),IO口也可以正常输出72MHz频率的脉冲 - 一开始没注意编译器的预编译条件的配置,没选择正确的型号,造成API的调用错误,一直打不出脉冲,需要注意在如下图中配置好该预编译条件,仔细看源码也是可以发现问题的