STM32 接触时间较短,记录下,以防忘记
-上电第一步需要设置时钟。下面介绍的几个是设置对象。
HSE: 外接晶振频率.如STM32F407涉及电路中使用的是8MHz。
SYSCLK: 系统时钟,通过对HSE时钟进行倍频后得到。倍频方法就是设置寄存器。方法存在于(USER/system_stm32f4xx.c)SetSysClock函数中。
RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
举例子说明:
- 如上硬件晶振时钟频率为8MHz 即HSE 值为8M
- 文件中定义如下:
#define PLL_M 8
#define PLL_N 336
#define PLL_P 2- 公式如下:
PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N
SYSCLK = PLL_VCO / PLL_P- 计算出SYSCLK 值为168MHz
HCLK: AHB总线时钟,由SYSCLK分频得到。如:
RCC->CFGR |= RCC_CFGR_HPRE_DIV1; /* HCLK = SYSCLK / 1*/
PCLK1: APB1总线时钟,由HCLK分频得到。如:
RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;; /* PCLK2 = HCLK / 4*/
PCLK2: APB2总线时钟,由HCLK分频得到。如:
RCC->CFGR |= RCC_CFGR_PPRE2_DIV2; /* PCLK2 = HCLK / 2*/
最终时钟计算结果如下:
HSE | SYSCLK | HCLK | PCLK1 | PCLK2 |
---|---|---|---|---|
8M | 168M | 168M | 42M | 84M |
在上面对应的值设置完成后,使能PLL。
/* Enable the main PLL */
RCC->CR |= RCC_CR_PLLON;
并且选择PLL作为系统时钟。
/* Select the main PLL as system clock source */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= RCC_CFGR_SW_PLL;