微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

HGP:STM32的用标准库函数自己编写的关于设置系统时钟72Mhz的函数

/其实在system_stm32f10x.c文件中有设置72MHz的函数,本文是我在学习STM32最底层用寄存器与固件库开发时写的一个例子,当做笔记发在博客上,希望对同样从STM32基层学起的读者有帮助。有很多地方寄存器的操作得看数据手册,这是很重要的。/
#include"stm32f10x.h"
#include"clock.h"
#define PLL_TimeOut ((uint32_t) 0x050000)
//最大计数函数函数如果计数到0x0500000,PLL还未准备好,那就放弃。
ErrorStatus My_WaitPLLStartUp(void);
//由于标准库没有等待PLL稳定的函数,所以可以自己编写一个
void Set_SysClock72Mhz(void)
{
uint32_t PLL_SYS = 0,FaultTime = 0;//一个关于PLL与SYSCLK转换状态的判断变量。
RCC_HSEConfig(RCC_HSE_ON);//打开外部时钟开关;
if(RCC_WaitForHSEStartUp() == SUCCESS)//这里用到的是判断HSE是否准备好的库函数。为啥要判断?
//因为HSE和PLL一样,打开开关后需要一定时间才能稳定。
{
FLASH->ACR |= 0x10;
FLASH ->ACR &= (~0X03);
FLASH->ACR |=(0x02);//内存区的操作,可以不用理解,有兴趣的话可以去ST官网查看关于FLASH的手册

    RCC_HCLKConfig(RCC_SYSCLK_Div1);//将AHB的时钟设为系统时钟的1分频;
	RCC_PCLK1Config(RCC_HCLK_Div2);//将APB2的时钟设为AHB的2分频;
	RCC_PCLK2Config(RCC_HCLK_Div2);//将APB1的时钟设为AHB的2分频;
	RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//将SYSCLK设置为PLL9倍频,并设置HSE为PLL时钟源;
	
	RCC_PLLCmd(ENABLE);//打开PLL开关;
	
	if(My_WaitPLLStartUp() ==SUCCESS)//这里判断PLL是否稳定
	{
		RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//PLL稳定后选择PLLCLK为SYSCLK的时钟源。
		
		do{
			PLL_SYS = RCC->CFGR & (0x03<<2);//等待PLL转换为SYS是否成功
			FaultTime ++;
			
		}while((FaultTime <=0x50000)&&(PLL_SYS !=0x02));
		
	}
	else{
		//如果PLL不稳定,这里自己写代码解决。	
	}			
}	
else {
	//如果程序运行到这里就证明HSE未能正常工作,可以自己写代码解决
}

}

ErrorStatus My_WaitPLLStartUp(void)//自定义的PLL等待函数
{
__IO uint32_t StartUpCounter = 0;//延时计数变量
ErrorStatus status = ERROR;
FlagStatus PLLStatus = RESET; //检测PLL是否准备好的标志变量
do
{
PLLStatus = RCC_GetFlagStatus(RCC_FLAG_PLLRDY);//获取PLLRDY的状态
StartUpCounter++;
} while((StartUpCounter != PLL_TimeOut) && (PLLStatus == RESET));

if (RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET)
{
status = SUCCESS;
}
else
{
status = ERROR;
}
return (status); //PLL如果准备好的话会由硬件电路将PLLRDY置一,由此判断如果准备好的话就返回SUCCESS,否的话返回ERROR

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐