最近摸索了一下如何进行RCC时钟配置,有些地方还不是很明白,希望高手指点,我把我的心得写在下边
大体流程是这样的
----》开启 HSIRCC->CR |= (uint32_t)0x00000001;
----》复位相关寄存器(发现这步可以省略,但是因为不知道具体是什么作用还没有删除)
/*!< Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], ADCPRE[1:0] and MCO[2:0] bits */
RCC->CFGR &= (uint32_t)0xF8FF0000;
/*!< Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;
/*!< Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF;
/*!< Reset PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE bits */
RCC->CFGR &= (uint32_t)0xFF80FFFF;
----》关中断 RCC->CIR = 0x00000000;
----》开启HSE RCC->CR |= ((uint32_t)RCC_CR_HSEON);
----》等待HSE稳定
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;//看RCC->CR[17]是否为1
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut));
----》开启flash缓冲和延时
FLASH->ACR |= FLASH_ACR_PRFTBE;/*!< Enable Prefetch Buffer */
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; /*!< Flash 2 wait state */
----》配置AHB总线时钟
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
----》配置APB2总线时钟
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
----》配置APB1总线时钟
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
----》配置PLL时钟
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));//复位
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL9);
----》开启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;
----》检查PLL是不是作为系统时钟
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08){}
如有错误之处,敬请指导
by swei.fu