本程序分别可以通过LED的闪烁频率和PA8引脚的波形检测出来,当使用PA8引脚时要注意适应推挽复用输出(来源于芯片手册)
系统时钟树如下:
代码:
main.c
#include "stm32f10x.h" // Device header
#include "bsp_rccclkconfig.h"
#include "bsp_led.h"
void Delay(uint32_t count)
{
for(;count!=0;count--);
}
int main(void)
{
HSE_SetSysClk(RCC_PLLMul_9);
MCO_GPIO_Config();
LED_GPIO_Config();
RCC_MCOConfig(RCC_MCO_SYSCLK);
while(1)
{
GPIO_SetBits(GPIOB, GPIO_Pin_0);
Delay(0xfffff);
Delay(0xfffff);
GPIO_ResetBits(GPIOB, GPIO_Pin_0);
Delay(0xfffff);
Delay(0xfffff);
}
}
bsp_rccclkconfig.c
#include "bsp_rccclkconfig.h"
void HSE_SetSysClk(uint32_t RCC_PLLMul_x)
{
ErrorStatus HSEStatus;
RCC_DeInit();//复位rcc寄存器
RCC_HSEConfig(RCC_HSE_ON);//使能HSE
HSEStatus=RCC_WaitForHSEStartUp();//等待HSE启动
if(HSEStatus==SUCCESS)//如果启动成功
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能预取值
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_SYSCLK_Div2);
RCC_PCLK2Config(RCC_SYSCLK_Div1);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_x);//配置PLLCLK=HSE*RCC_PLLMul_x
RCC_PLLCmd(ENABLE);//使能PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//等待PLL时钟稳定
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择系统时钟
while(RCC_GetSYSCLKSource()!=0x08);
}
else
{
/*如果启动失败,用户可以在这里添加处理错误的代码*/
}
}
void MCO_GPIO_Config()
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
}
bsp_rccclkconfig.h
#ifndef _BSP_RCCCLKCONFIG_H
#define _BSP_RCCCLKCONFIG_H
#include "stm32f10x.h"
void HSE_SetSysClk(uint32_t RCC_PLLMul_x);
void MCO_GPIO_Config(void);
#endif
bsp_led.c
#include "bsp_led.h"
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
}
bsp_led.h
#ifndef _BSP_LED_H
#define _BSP_LED_H
#include "stm32f10x.h"
void LED_GPIO_Config(void);
#endif