第二章:SystemInit系统初始化函数详解

void SystemInit(void)
{
  /* FPU settings ------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif

  /* Reset the RCC clock configuration to the default reset state ------------*/


//1、PRRCC控制寄存器RCC_CR 主要是PLL和PLLI2S的使能和状态、外部时钟的使能、内部时钟的校准、修正、状态、使能等
//2、PLL配置寄存器RCC_PLLCFGR 是关于PLL输出时钟的计算公司参数的设定,PLLQ/PLLP/PLLN/PLLM等
//3、RCC时钟配置寄存器RCC_CFGR 是设置输出时钟MCO12、RTC时钟分频、I2C时钟选择、AHB/APB1/APB2等时钟的分频、系统时钟的切换等。
//4、RCC时钟中断寄存器RCC_CIR 主要是各种时钟稳定后触发中断的使能以及相关的标志清零
//5、RCC_AHB1、AHB2、AHB3、APB1、APB2总线相关的寄存器主要是SET和RESET各种外设的时钟源

/* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;//使能HSI内部振荡器

  /* Reset CFGR register */
  RCC->CFGR = 0x00000000;//清零

  /* Reset HSEON(16), CSSON(19) and PLLON(24) bits */ 
  RCC->CR &= (uint32_t)0xFEF6FFFF;//zhanghl,20150108修改,把0xFEF7FFFF修改为0xFEF6FFFF,原因是如果0xFEF7FFFF没有关闭HSE振荡器,与该句注释不符合

  //PLLCFGR:高4位保留,bit24~27将PLLQ=4,USB OTG FS时钟频率(最大48MHz)=VCO频率/PLLQ(2~15);
//bit22将PLL和PLLI2S的时钟源设置为HSI;
//bit16~17将PLLP=2即系统时钟为主PLL输出时钟的2分频,PLL输出时钟频率(最大168MHz)=VCO频率/PLLP(2、4、6或8);
//bit6~14将PLLN=192,VCO输出频率(192~432MHz)=VCO输入频率*PLLN(192~432);
//bit0~5设置PLLM=16,VCO输入频率(1~2MHz:2MHz)=PLL输入时钟频率/PLLM(2~63)
  /* Reset PLLCFGR register */

#if (SYS_CORE_CLK_168M1_84M0_USER)
  RCC->PLLCFGR = 0x24003010;//168MHz,PLLP=2
#else
  RCC->PLLCFGR = 0x24013010; //84MHz,PLLP=4     PLLQ = 4   PLLP = 4   PLLN = 192   PLLM = 16
#endif /* SYS_CORE_CLK_168M1_84M0_USER */       
//f(VCO 时钟) = f(16 × (192 / 16)       
//f(PLL 48 = f(VCO 时钟) / PLLP
//f(USB OTG FS, SDIO, RNG 时钟输出) = f(VCO 时钟) / PLLQ

// CR:bit18,HSEBYP置0,即不旁路HSE振荡器
  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;

//CIR:失效所有中断
  /* Disable all interrupts */
  RCC->CIR = 0x00000000;

#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
  SystemInit_ExtMemCtl(); 
#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
         
  /* Configure the System clock source, PLL Multiplier and Divider factors, 
     AHB/APBx prescalers and Flash settings ----------------------------------*/
  SetSysClock();

  /* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif

}

有关带FPU的ARM Cortex-M4内核的信息,请参考STM32F3XX/F4XXX Cortex-M4编程手册。

FPU:浮点运算的设置  STM32F4xxx.h 文件中的宏定义

你可能感兴趣的:(第二章:SystemInit系统初始化函数详解)