现在的位置: 首页 > 综合 > 正文

STM32 RCC时钟配置

2013年10月08日 ⁄ 综合 ⁄ 共 2326字 ⁄ 字号 评论关闭

最近摸索了一下如何进行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

抱歉!评论已关闭.