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 文件中的宏定义