STM32寄存器操作之PLL
刚刚入手STM32,看到的大多数例程都是用ST的固件库,很是冗余,彻彻底底地在浪费机器周期,根据个
人爱好,用操作寄存器的方法来开发STM32。
请那些固件库的粉丝们手下留情,作为一个驱动开发者,我要彻彻底底的压榨Chip的资源。
//=========================================================================================
//PLL操作步骤
1.选择要开启的时钟 HSI HSE----------RCC->CR
2.等待选择开启的时钟就绪------------RCC->CR
3.设置时钟SYSCLK、PCLK1、PCLK2------RCC->CFGR
4.设置PLL时钟-----------------------RCC->CFGR
5.使能PLL时钟-----------------------RCC->CR
6.等待PLL时钟使能就绪---------------RCC->CR
7.切换系统时钟为PLL时钟-------------RCC->CFGR
8.等待系统时钟切换就绪--------------RCC->CFGR
//=========================================================================================
//参考代码
void PLLSET(void)
{
//PLL初始化,设置系统时钟为72MHz
//开启HSE振荡器
RCC->CR |= RCC_CR_HSEON;
//等待外部高速时钟就绪
while((RCC->CR & RCC_CR_HSERDY) == 0)
{
;
}
//系统时钟不分频
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
//PCLK1不分频
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
//PCLK2 2分频
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
//PLL configuration: PLLCLK = HSE * 6 = 72 MHz HSE为12MHz
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6);
//使能PLL
RCC->CR |= RCC_CR_PLLON;
//等待PLL就绪
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
;
}
//选择PLL时钟为系统时钟
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
//等待系统时钟就绪
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
{
;
}
HCLK = 72000000;
PCLK1 = HCLK;
PCLK2 = (HCLK >> 1);
SYSCLK = HCLK;
} |