STM32L051xx的时钟配置

1、背景

最近,做移植,因此对目标平台做一些了解。

STM32L051C6T6资源为32K Flash; 2K EEPROM;8K RAM;37 GPIOs;1ADC(10 Channels)

2、系统刚起来时的时钟配置

时钟配置是嵌入式程序中比较重要且基础的部分。

有四种不同的时钟源,可用于驱动系统时钟(SYSCLK)。

时钟源:HSI16、HSE、PLL、MSI

AHB、APB1和APB2域的最大时钟为32MHz。

2.1 调用开始

从startup_stm32l051xx.s文件中,调用SystemInit函数

   IMPORT  __main
   IMPORT  SystemInit  
   LDR     R0, =SystemInit
   BLX     R0

2.2 查看SystemInit(void)源码内容

/**
  * @brief  Setup the microcontroller system.
  * @param  None
  * @retval None
  */
void SystemInit (void)
{    
/*!< Set MSION bit 使能MS时钟晶振*/
  RCC->CR |= (uint32_t)0x00000100;

  /*!< Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], MCOSEL[2:0] and MCOPRE[2:0] bits     
   清零*/
  RCC->CFGR &= (uint32_t) 0x88FF400C;
 
  /*!< Reset HSION, HSIDIVEN, HSEON, CSSON and PLLON bits 清零*/
  RCC->CR &= (uint32_t)0xFEF6FFF6;
  
  /*!< Reset HSI48ON  bit  清零*/
  RCC->CRRCR &= (uint32_t)0xFFFFFFFE;
  
  /*!< Reset HSEBYP bit 清零*/
  RCC->CR &= (uint32_t)0xFFFBFFFF;

  /*!< Reset PLLSRC, PLLMUL[3:0] and PLLDIV[1:0] bits 清零*/
  RCC->CFGR &= (uint32_t)0xFF02FFFF;

  /*!< Disable all interrupts 除能所有RCC终端*/
  RCC->CIER = 0x00000000;
  
  /* 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
}

 主要是使能MS晶振,对于其他时钟源进行除能、RCC中断除能、向量表重置。

2.3 起来的系统时钟频率是多少

MSI(内部多速率)振荡器时钟

微处理器以上电复位/System or RTC 域复位和从待机模式复位启动之后,用处于2.1MHz的MSI作为系统时钟。

HSI16(16MHz) 或HSI16的4分频(4MHz)或处于任何频率的MSI作为从停止模式醒来的时钟。

因此

在Main函数中,常看见一下代码来配置TICK中断的间隔

 SysTick_Config(2000); /* 1ms config */

3、常见时钟配置

3.1 内部HSI配置为系统时钟

 

3.2 外部HSE配置为系统时钟

 

3.3 外部HSE,PLL配置为系统时钟

 RCC->APB1ENR |= (RCC_APB1ENR_PWREN); /* (1) */
 PWR->CR = (PWR->CR & ~(PWR_CR_VOS)) | PWR_CR_VOS_0; /* (2) */

RCC->CR |= RCC_CR_HSEON;

while(RCC->CR & (RCC_CR_HSERDY)  !=  RCC_CR_HSERDY)

{}

RCC->CFGR |= RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMUL8 | RCC_CFGR_PLLDIV2;  /* (5) */

RCC->CR |= RCC_CR_PLLON;  /* (6) */

while((RCC->CR & RCC_CR_PLLRDY) == 0)   /* (7) */

{}

 

STM32L051xx的时钟配置_第1张图片

 

 

 

 

 

你可能感兴趣的:(M0,STM32开发)