STM32使用内部高速振荡器(HSI)通过锁相环PLL倍频到64MHZ之库函数实现方式

获取STM32系统各时钟频率

一、配置系统时钟

/***************************************************************
*函数名: vSystem_Clock_Config
*描  述: 配置系统时钟
*说  明: 将HSI通过PLL倍频到64MHZ
*注  意: HSI通过PLL倍频最大只能倍频到64MHZ
***************************************************************/
void vSystem_Clock_Config(void)
{
	u32 startUpCount = 0, status = 0;


	RCC_DeInit();//Resets RCC default state
	RCC_HSICmd(ENABLE);//Enables HSI
	do
	{
		status = RCC_GetFlagStatus(RCC_FLAG_HSIRDY);//HSI ready or not
		startUpCount++;
	}
	while((status == RESET) || (startUpCount < HSE_STARTUP_TIMEOUT));
	
	if(status == SET)
	{
		FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//Enable Prefetch Buffer
		FLASH_SetLatency(FLASH_Latency_2);//Set code latency value Two Latency cycles
		
		RCC_HCLKConfig(RCC_SYSCLK_Div1);//HCLK=SYSCLK
		RCC_PCLK1Config(RCC_HCLK_Div1);//PCLK1/APB1=HCLK
		RCC_PCLK2Config(RCC_HCLK_Div1);//PCLK2/APB2=HCLK
		RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16);//PLL clock=4M
		RCC_PLLCmd(ENABLE);//Enables PLL
		while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
		
		RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//System clock is PLLCLK
		while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08);
	}
	else
	{

	}
}

注意:
1.STM32系列HSI通过PLL倍频最大只能倍频到64MHZ。
2. 所用到的库有:
#include "stm32f10x_flash.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
#include "misc.h"

二、打印输出系统各时钟频率

RCC_ClocksTypeDef RCC_CLK;

int main(void)
{	
	vSystem_Init();
	
	RCC_GetClocksFreq(&RCC_CLK);//Get chip frequencies
	#if ( USE_SEGGER_RTT_ENABLE > 0 )//Use segger rtt enable
	SEGGER_RTT_printf(0, "System Clock Source : %d\r\n", RCC_GetSYSCLKSource());
	SEGGER_RTT_printf(0, "APB1/PCLK1 : %dHZ\r\n", RCC_CLK.PCLK1_Frequency);
	SEGGER_RTT_printf(0, "APB2/PCLK2 : %dHZ\r\n", RCC_CLK.PCLK2_Frequency);
	SEGGER_RTT_printf(0, "SYSCLK     : %dHZ\r\n", RCC_CLK.SYSCLK_Frequency);
	SEGGER_RTT_printf(0, "HCLK       : %dHZ\r\n", RCC_CLK.HCLK_Frequency);
	#endif

	
	while(1)
	{
		vKeyBoard_Service_Handle();
		PAout(6) = 0;
		vDelay_ms(100);
		PAout(6) = 1;
		vDelay_ms(1000);
	}
}

三、系统初始化vSystem_Init()

static void vSystem_Init(void)
{
	SystemInit();
	vSystem_Clock_Config();
	vSysTick_Init();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	vTIM_Init();
	vLCD1602_Init();
	LED_Init();
	vKEY_GPIO_Config();
	
		
	#if ( USE_SEGGER_RTT_ENABLE > 0 )//Use segger rtt enable
	SEGGER_RTT_Init();
	SEGGER_RTT_printf(0, "Build Times: %s  %s\r\n", __DATE__, __TIME__);
	SEGGER_RTT_printf(0, "STM32F103xx Start Running......\r\n\r\n");
	#endif
	
	#if ( USE_KEIL_MACRO_INFO_ENBALE > 0 )//Use Keil macro information enable 
	vKeil_Macro_Information();
	#endif	
}

四、运行结果

00> Build Times: Mar 14 2020  10:11:21
00> STM32F103xx Start Running......
00> 
00> System Clock Source : 8
00> APB1/PCLK1 : 64000000HZ
00> APB2/PCLK2 : 64000000HZ
00> SYSCLK     : 64000000HZ
00> HCLK       : 64000000HZ

在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值