- HSE时钟(高速外部时钟)
- 野火指南者使用的是8M
- 来源:有源晶振(4~26M)
- 控制:RCC_CR时钟控制寄存器的位16(HSEON),位17(HSERDY)
- HSI时钟(高速内部时钟)
- 来源:芯片内部,8M,当HSE故障时,系统时钟会自动切换到HSI,直到HSE启动
- 控制:RCC_CR时钟控制寄存器的位0(HSEON),位1(HSERDY)
- PLLCLK锁相环时钟
- 来源:(HSI/2、HSE)经过倍频得到
- 控制:
- CFGR寄存器
- XTPRE:PLL输入时钟源
- PLLSRC:HSE分频作为PLL输入
- PLLMUL:PLL输入时钟的倍频数
- CFGR寄存器
- 系统时钟
- 来源:HSE、HSI、PLLCLK
- 控制:CFGR寄存器的SW控制位
- 注意:通常的配置是:SYSCLK = PLLCLK = 72M
- HCLK时钟
- AHB高速总线时钟,速度最高为72M,为AHB总线外设提供时钟,为Cortex系统定时器提供时钟SysTick,为内核提供时钟(FCLK)
- 来源:系统时钟分频得到,一般设置HCLK = SYSCLK = 72M
- 控制:CFGR寄存器的HPRE位
- PCLK1时钟(APB1低速总线时钟)
- 最高为36M,为APB1总线上的外设提供时钟,2倍频后则为APB1总线上的定时器2-7提供时钟,最大为72M。
- 来源:HCLK分频得到,一般配置PCLK1= HCLK/2=36M
- 控制:RCC_CFGR寄存器的PPRE1位
- RTC时钟
- 为芯片内部的RTC外设提供时钟
- 来源:HSE_RST(HSE分频得到)、LSE(外部32.768kKHz的晶振提供)、LSI(32KHz)
- 控制:RCC备份域控制寄存器RCC_BDCR的RTCSEL位控制
- IWDGCLK独立看门狗时钟
- 来源:LSI提供
- 配置时钟代码分析
/时钟配置函数 static void SetSysClockTo72(void) { __IO uint32_t StartUpCounter = 0, HSEStatus = 0; //配置SYSCLK, HCLK, PCLK2 and PCLK1 //使能HSE RCC->CR |= ((uint32_t)RCC_CR_HSEON); //等待HSE就绪,并做超时处理 do { HSEStatus = RCC->CR & RCC_CR_HSERDY; StartUpCounter++; } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); if ((RCC->CR & RCC_CR_HSERDY) != RESET) { HSEStatus = (uint32_t)0x01; } else { HSEStatus = (uint32_t)0x00; } //如果HSE启动成功,程序继续往下执行 if (HSEStatus == (uint32_t)0x01) { //使能预取指 FLASH->ACR |= FLASH_ACR_PRFTBE;//在stm32f10xxx闪存编程参考手册中有该寄存器的描述 //等待时间 FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; /* HCLK = SYSCLK = 72M */ RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; /* PCLK2 = HCLK = 72M*/ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; /* PCLK1 = HCLK/2 = 36M*/ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; /* 配置PLL锁相环: PLLCLK = HSE * 9 = 72 MHz */ RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);//超频在这设置 /* 使能 PLL */ RCC->CR |= RCC_CR_PLLON; /* 等待PLL启动就绪 */ while((RCC->CR & RCC_CR_PLLRDY) == 0) { } /* 选择PLLCLK作为系统时钟 */ RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; /* 等待PLLCLK作为系统时钟 */ while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) { } } else { //入锅HSE启动失败,用户可以在这里添加处理代码 } }
-
时钟配置完毕,建议对比参考手册中的时钟树图进行配置,并参考寄存器的具体含义及配置位。
STM32--时钟树(1)
最新推荐文章于 2024-07-17 17:29:57 发布