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