分析stm32的系统时钟函数,对于我们实现自定义时钟配置非常重要,以下是标准库函数中的时钟配置函数。
static void SetSysClockTo72(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/
/* Enable HSE */
// 使能HSE
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
// 等待HSE就绪并做超时处理
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
/* 分析:当不超过超时时间时,后面这部分一直为1;因此,只要HSERDY了,立马跳出循环
如果HSE故障,则会一直等到设定的超时时间,然后跳出 */
// 上面只是跳出循环,这里判断HSE是否真正启动成功
if ((RCC->CR & RCC_CR_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
// HSE启动成功,程序继续往下执行
if (HSEStatus == (uint32_t)0x01)
{
/* Enable Prefetch Buffer */
// 使能预取指,CPU运行过程:取指令-执行指令-取指令-执行指令
// 预取指类似于8086的指令队列,会取出当前和接下来要执行的多条指令,送入指令队列缓冲
FLASH->ACR |= FLASH_ACR_PRFTBE;
/* Flash 2 wait state */
/* CPU从Flash取指令的时间间隔,72MHz时要等待两个时钟周期
等待的原因时,flash运行速度慢,CPU如果一直等待flash就绪,则会浪费很多时间效率低下
因此等待两个时钟周期,待flash就绪然后读取指令到预取指缓存 */
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
// 配置AHB APB1 APB2总线的分频因子
/* HCLK = SYSCLK = 72M*/
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/* PCLK2 = HCLK = 72M */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
/* PCLK1 = HCLK = 36M */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
/* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
// 配置锁相环输入为HSE不分频
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
// 配置PLL倍频因子为9
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
/* Enable PLL */
// 使能PLL锁相环
RCC->CR |= RCC_CR_PLLON;
/* Wait till PLL is ready */
// 等待锁相环准备就绪
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}
/* Select PLL as system clock source */
// 选择PLLCLK作为系统时钟
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
/* Wait till PLL is used as system clock source */
// 等待PLLCLK切换成功
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
{
}
}
// 如果HSE启动失败,在这里填入错误处理代码
else
{ /* If HSE fails to start-up, the application will have wrong clock
configuration. User can add here some code to deal with this error */
}
}
上一篇:STM32时钟树解析
下一篇:STM32系统时钟树分析
推荐阅读最新更新时间:2024-11-10 11:45
设计资源 培训 开发板 精华推荐
- 最丐数字键盘PRO(原CH552G机械键盘)
- STEVAL-POE001V1,以太网供电 (PoE) - 符合 IEEE 802.3bt 的接口参考设计
- ProGeigerHV
- 适用于汽车照明和 ADAS 系统的高电流 SEPIC 参考设计
- EVAL-AD7665CB,用于 AD7665、16 位、571Ksps PulSAR 模数转换器的评估板
- AD9576/PCBZ,用于评估 AD9576 时钟乘法器异步时钟发生器的评估板
- ADL5310-EVAL,基于 ADL5310 120 dB 范围(3 nA 至 3 mA)双对数转换器的评估板
- MCU和D类音频放大器的连接器板
- LTC3206EUF 演示板,I2C 多显示 LED 控制器,Vin = 2.7V - 4.5V
- LTC3672BEDC-2 演示板、单片固定输出 400mA 降压稳压器,具有双 150mA LDO,采用 2mm X 2mm DFN
- ST AMG SensorTile开发大赛驾到,重磅大奖与知识兼得,速来~
- 【有奖直播】 聚焦语音识别核心技术,走进Microchip Timberwolf™音频处理器研讨会
- 泰克MDO3000系列示波器结合MDO3PWR功率分析模块 立即询价享春季好礼!
- 已结束|Maxim IO-Link通信协议设计方案详解,5大优势助你轻松联网!
- 上演你的“ADI实验室电路”DIY,赢取E金币 !
- 有奖直播:联咏安防监控方案及未来技术方向 报名开始啦!
- TI圣诞狂欢:上千套CC3200开发套件免费申请(仅限在校大学生)
- 【社区大讲堂】揭秘ADI实验室电路!
- 一起分享,共同成长!EEWORLD月月有奖优秀主题/回复第29期
- 我为TI M4开发板Hanker试用狂!