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) */

{}

 

 

 

 

 

 

startup_stm32l051xx.s是STMicroelectronics提供的一个启动文件,用于启动STM32L051xx系列微控制器。它是一个汇编语言文件,包含了程序的入口点和初始化代码。 生成startup_stm32l051xx.s的过程如下: 1. 首先,打开STM32L051xx系列的开发环境,例如Keil MDK或者IAR Embedded Workbench。这些环境通常提供了创建或导入项目的功能。 2. 创建一个新的项目或打开一个现有的项目,然后选择所需的STM32L051微控制器型号。这会为你的项目创建相应的默认配置文件和链接脚本。 3. 在项目文件结构中找到startup_stm32l051xx.s文件。这个文件通常位于Startup目录下,用于存放启动文件。 4. 双击打开startup_stm32l051xx.s文件,在其中可以看到一些汇编指令的代码。这些指令用于初始化芯片的寄存器和系统设置,例如设置堆栈指针、设置中断向量表、启用系统时钟等。 5. 根据需要,你可以对startup_stm32l051xx.s文件进行自定义修改。例如,你可以添加或删除特定的初始化代码,以适应你的应用需求。 6. 编译项目,这将把startup_stm32l051xx.s文件与其他源代码一起编译为目标文件。编译器会将汇编指令转换为机器码。 7. 在链接阶段,链接器会将生成的目标文件与其他库文件和链接脚本一起进行连接,生成最终的可执行文件。该文件可用于下载到STM32L051微控制器并在芯片上运行。 总之,生成startup_stm32l051xx.s文件的过程涉及到选择微控制器型号、创建项目、编辑启动文件、编译和链接等步骤。这个文件的目的是在芯片上启动初始化系统,并为应用程序提供运行环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值