花了一天的时间,总算是了解了SystemInit()函数实现了哪些功能,初学STM32,,现记录如下(有理解错误的地方还请大侠指出):使用的是3.5的库,用的是STM32F107VC,开发环境RVMDK4.23 
我已经定义了STM32F10X_CL,SYSCLK_FREQ_72MHz 
函数调用顺序: 
startup_stm32f10x_cl.s(启动文件) → SystemInit() →  SetSysClock () → SetSysClockTo72() 
初始化时钟用到的RCC寄存器复位值: 
RCC_CR = 0x0000 xx83; RCC_CFGR = 0x0000 0000;RCC_CIR = 0x0000 0000; RCC_CFGR2 = 0x0000 0000; 
SystemInit() 
在调用 SetSysClock()之前RCC寄存器的值如下(都是一些与运算,或运算,在此就不赘述了): 
RCC->CR = 0x0000 0083;  RCC->CIR = 0x00FF0000; RCC->CFGR2 = 0x00000000;至于这些寄存器都代表着什么意思,详见芯片资料RCC寄存器,该文重点不在此处; 
SetSysClock()函数如下: 
static void SetSysClock(void) 
{ 
#ifdef SYSCLK_FREQ_HSE 
  SetSysClockToHSE(); 
#elif defined SYSCLK_FREQ_24MHz 
  SetSysClockTo24(); 
#elif defined SYSCLK_FREQ_36MHz 
  SetSysClockTo36(); 
#elif defined SYSCLK_FREQ_48MHz 
  SetSysClockTo48(); 
#elif defined SYSCLK_FREQ_56MHz 
  SetSysClockTo56();   
#elif defined SYSCLK_FREQ_72MHz//我的定义的是SYSCLK_FREQ_72MHz,所以调用SetSysClockTo72() 
  SetSysClockTo72(); 
#endif 
} 
 
SetSysClockTo72()函数如下: 
static void SetSysClockTo72(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); 
#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 */ 
  } 
} 
 
 
 
 |   
     
  
 |