在此记录下正点原子对于STM32F407的底层配置,加深印象。
正点原子并没有使用官方的库函数进行操作,而是采用宏定义+直接寄存器的操作方式。
首先
/* Enable HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
然后等待配置完成,进行电源接口使能和电源复位后默认值设置
/* Select regulator voltage output Scale 1 mode */
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
PWR->CR |= PWR_CR_VOS;
再然后设置HCLK
/* HCLK = SYSCLK / 1*/
RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
再然后设置内部高速时钟和低速时钟
/* PCLK2 = HCLK / 2*/
RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;
/* PCLK1 = HCLK / 4*/
RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;
然后设置PLL
/* Configure the main PLL */
RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);
包括使能USB时钟源、PLL的输入时钟为HSE、然后采取PLLM分频,然后PLLN倍频,再PLLP分频。外部晶振是8M,经过一系列操作,使得系统时钟为168M。
再然后打开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;
截止此处,系统时钟配置完成。