/**
* @brief Setup the microcontroller system
* Initialize the Embedded Flash Interface, the PLL and update the
* SystemCoreClock variable.
* @note This function should be used only after reset.
* @param None
* @retval None
*/void SystemInit (void){/* Reset the RCC clock configuration to the default reset state(for debug purpose) *//* Set HSION bit */
RCC->CR |=(uint32_t)0x00000001;/* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */#ifndef STM32F10X_CL
RCC->CFGR &=(uint32_t)0xF8FF0000;#else
RCC->CFGR &=(uint32_t)0xF0FF0000;#endif/* STM32F10X_CL *//* Reset HSEON, CSSON and PLLON bits */
RCC->CR &=(uint32_t)0xFEF6FFFF;/* Reset HSEBYP bit */
RCC->CR &=(uint32_t)0xFFFBFFFF;/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
RCC->CFGR &=(uint32_t)0xFF80FFFF;#ifdef STM32F10X_CL/* Reset PLL2ON and PLL3ON bits */
RCC->CR &=(uint32_t)0xEBFFFFFF;/* Disable all interrupts and clear pending bits */
RCC->CIR =0x00FF0000;/* Reset CFGR2 register */
RCC->CFGR2 =0x00000000;#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)/* Disable all interrupts and clear pending bits */
RCC->CIR =0x009F0000;/* Reset CFGR2 register */
RCC->CFGR2 =0x00000000;#else/* Disable all interrupts and clear pending bits */
RCC->CIR =0x009F0000;#endif/* STM32F10X_CL */#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)#ifdef DATA_IN_ExtSRAMSystemInit_ExtMemCtl();#endif/* DATA_IN_ExtSRAM */#endif/* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers *//* Configure the Flash Latency cycles and enable prefetch buffer */SetSysClock();#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}
四、SetSysClock ()源码
staticvoidSetSysClock(void){#ifdef SYSCLK_FREQ_HSESetSysClockToHSE();#elif defined SYSCLK_FREQ_24MHzSetSysClockTo24();#elif defined SYSCLK_FREQ_36MHzSetSysClockTo36();#elif defined SYSCLK_FREQ_48MHzSetSysClockTo48();#elif defined SYSCLK_FREQ_56MHzSetSysClockTo56();#elif defined SYSCLK_FREQ_72MHzSetSysClockTo72();#endif/* If none of the define above is enabled, the HSI is used as System clock
source (default after reset) */}
五、SetSysClockTo72()源码
/**
* @brief Sets System clock frequency to 72MHz and configure HCLK, PCLK2
* and PCLK1 prescalers.
* @note This function should be used only after reset.
* @param None
* @retval None
*/staticvoidSetSysClockTo72(void){
__IO uint32_t StartUpCounter =0, HSEStatus =0;/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*//* Enable HSE */
RCC->CR |=((uint32_t)RCC_CR_HSEON);/* Wait till HSE is ready and if Time out is reached exit */do{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;}while((HSEStatus ==0)&&(StartUpCounter != HSE_STARTUP_TIMEOUT));if((RCC->CR & RCC_CR_HSERDY)!= RESET){
HSEStatus =(uint32_t)0x01;}else{
HSEStatus =(uint32_t)0x00;}if(HSEStatus ==(uint32_t)0x01){/* Enable Prefetch Buffer */
FLASH->ACR |= FLASH_ACR_PRFTBE;/* Flash 2 wait state */
FLASH->ACR &=(uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |=(uint32_t)FLASH_ACR_LATENCY_2;/* HCLK = SYSCLK */
RCC->CFGR |=(uint32_t)RCC_CFGR_HPRE_DIV1;/* PCLK2 = HCLK */
RCC->CFGR |=(uint32_t)RCC_CFGR_PPRE2_DIV1;/* PCLK1 = HCLK */
RCC->CFGR |=(uint32_t)RCC_CFGR_PPRE1_DIV2;#ifdef STM32F10X_CL/* Configure PLLs ------------------------------------------------------*//* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz *//* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
RCC->CFGR2 &=(uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
RCC->CFGR2 |=(uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);/* Enable PLL2 */
RCC->CR |= RCC_CR_PLL2ON;/* Wait till PLL2 is ready */while((RCC->CR & RCC_CR_PLL2RDY)==0){}/* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
RCC->CFGR &=(uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
RCC->CFGR |=(uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL9);#else/* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
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_PLLMULL9);//外部晶振HSE=8MHZ, 系统时钟为72MHZ=8MHZ*9
HSE=12MHZ,系统时钟为72MHZ=12MHZ*6#endif/* STM32F10X_CL *//* Enable PLL */
RCC->CR |= RCC_CR_PLLON;/* Wait till PLL is ready */while((RCC->CR & RCC_CR_PLLRDY)==0){}/* Select PLL as system clock source */
RCC->CFGR &=(uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |=(uint32_t)RCC_CFGR_SW_PLL;/* Wait till PLL is used as system clock source */while((RCC->CFGR &(uint32_t)RCC_CFGR_SWS)!=(uint32_t)0x08){}}else{/* If HSE fails to start-up, the application will have wrong clock
configuration. User can add here some code to deal with this error */}}#endif