0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32时钟详解

Dp1040 来源:嵌入式微处理器 2023-04-28 11:32 次阅读

STM32时钟源介绍

1. STM32的时钟源主要有:

内部时钟

外部时钟

锁相环倍频输出时钟

fad4b542-e572-11ed-ab56-dac502259ad0.png

1.1 详细介绍

HSI(内部高速时钟)

它是RC振荡器,频率可以达到8MHZ,可作为系统时钟和PLL锁相环的输入

HSE(外部高速时钟)

接入晶振范围是4-16MHZ,可作为系统时钟和PLL锁相环的输入,还可以经过128分频之后输入给RTC。

LSI(内部低速时钟)

它是RC振荡器,频率大概为40KHZ,供给独立看门狗或者RTC,并且独立看门口只能依靠LSI作为时钟源

LSE(外部低速时钟)

通常外接32.768MHZ晶振提供给RTC

PLL(锁相环)

用来倍频输出。因为开发板外部晶振只有8MHZ,而STM32最大工作频率是72MHZ。他可以通过HSI输入,HSE输入或两分频输入,通过PLL倍频(2-16),倍频之后输入给系统时钟。

MCO(时钟输出管脚)

通常对应STM32 PA8,它可以选择一个时钟信号输出,给外部的系统提供时钟源

2. 标准库的时钟配置

2.1 stm32启动文件

首先打开startup_stm32f10x_hd.s,该文件为stm32的启动文件,在该文件内会发现有这么一块用汇编写的代码。

Reset_HandlerPROC
EXPORTReset_Handler[WEAK]
IMPORT__main
IMPORTSystemInit
LDRR0,=SystemInit
BLXR0
LDRR0,=__main
BXR0
ENDP

通过这段汇编代码可以看出,程序在执行main函数之前,会先执行SystemInit函数。

2.2 SystemInit函数详解

voidSystemInit(void)
{
/*Reset the RCC clock configuration to the default reset state(for debug purpose)*/
/*Set HSION bit*/
RCC->CR|=(uint32_t)0x00000001;

/*Reset SW,HPRE,PPRE1,PPRE2,ADCPRE and MCO bits*/
#ifndefSTM32F10X_CL
RCC->CFGR&=(uint32_t)0xF8FF0000;
#else
RCC->CFGR&=(uint32_t)0xF0FF0000;
#endif/*STM32F10X_CL*/

/*Reset HSEON,CSSON and PLLON bits*/
RCC->CR&=(uint32_t)0xFEF6FFFF;

/*Reset HSEBYP bit*/
RCC->CR&=(uint32_t)0xFFFBFFFF;

/*Reset PLLSRC,PLLXTPRE,PLLMUL and USBPRE/OTGFSPRE bits*/
RCC->CFGR&=(uint32_t)0xFF80FFFF;

#ifdefSTM32F10X_CL
/*Reset PLL2ON and PLL3ON bits*/
RCC->CR&=(uint32_t)0xEBFFFFFF;

/*Disable all interrupts and clear pending bits*/
RCC->CIR=0x00FF0000;

/*Reset CFGR2 register*/
RCC->CFGR2=0x00000000;
#elifdefined(STM32F10X_LD_VL)||defined(STM32F10X_MD_VL)||(defined STM32F10X_HD_VL)
/*Disable all interrupts and clear pending bits*/
RCC->CIR=0x009F0000;

/*Reset CFGR2 register*/
RCC->CFGR2=0x00000000;
#else
/*Disable all interrupts and clear pending bits*/
RCC->CIR=0x009F0000;
#endif/*STM32F10X_CL*/

#ifdefined(STM32F10X_HD)||(defined STM32F10X_XL)||(defined STM32F10X_HD_VL)
#ifdefDATA_IN_ExtSRAM
SystemInit_ExtMemCtl();
#endif/*DATA_IN_ExtSRAM*/
#endif

/*Configure the System clock frequency,HCLK,PCLK2 and PCLK1 prescalers*/
/*Configure the Flash Latency cycles and enable prefetch buffer*/
SetSysClock();

#ifdefVECT_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
}

打开内部8M时钟

RCC->CR|=(uint32_t)0x00000001

通过查看寄存器手册可知,这段代码为打开内部8M时钟。

fae00b54-e572-11ed-ab56-dac502259ad0.png

设置时钟配置寄存器

#ifndefSTM32F10X_CL
RCC->CFGR&=(uint32_t)0xF8FF0000;
#else
RCC->CFGR&=(uint32_t)0xF0FF0000;
#endif/*STM32F10X_CL*/

对应寄存器说明可查看《STM32中文参考手册_V10》的6.3.2 时钟配置寄存器(RCC_CFGR)章节。

后续代码,有兴趣可根据《STM32中文参考手册_V10》手册,查看代码具体作用。

2.3 SetSysClock()函数详解

staticvoidSetSysClock(void)
{
#ifdefSYSCLK_FREQ_HSE
SetSysClockToHSE();
#elifdefined SYSCLK_FREQ_24MHz
SetSysClockTo24();
#elifdefined SYSCLK_FREQ_36MHz
SetSysClockTo36();
#elifdefined SYSCLK_FREQ_48MHz
SetSysClockTo48();
#elifdefined SYSCLK_FREQ_56MHz
SetSysClockTo56();
#elifdefined SYSCLK_FREQ_72MHz
SetSysClockTo72();
#endif
}

system_stm32f10x.c文件中会根据芯片的型号定义对应的宏

#ifdefined(STM32F10X_LD_VL)||(defined STM32F10X_MD_VL)||(defined STM32F10X_HD_VL)
/*#define SYSCLK_FREQ_HSEHSE_VALUE*/
#defineSYSCLK_FREQ_24MHz24000000
#else
/*#define SYSCLK_FREQ_HSEHSE_VALUE*/
/*#define SYSCLK_FREQ_24MHz24000000*/
/*#define SYSCLK_FREQ_36MHz36000000*/
/*#define SYSCLK_FREQ_48MHz48000000*/
/*#define SYSCLK_FREQ_56MHz56000000*/
#defineSYSCLK_FREQ_72MHz72000000
#endif

3. 时钟配置函数

3.1 时钟初始化配置函数

voidSystemInit(void);
SYSCLK(系统时钟)=72MHZ;
AHB总线时钟(HCLK=SYSCLK)=72MHZ;
APB1总线时钟(PCLK1=SYSCLK/2)=36MHZ;
APB2总线时钟(PCLK1=SYSCLK/1)=72MHZ;
PLL主时钟=72MHZ;

3.2 外设时钟使能配置函数

voidRCC_AHBPeriphClockCmd(uint32_tRCC_AHBPeriph,FunctionalState NewState);
voidRCC_APB2PeriphClockCmd(uint32_tRCC_APB2Periph,FunctionalState NewState);
voidRCC_APB1PeriphClockCmd(uint32_tRCC_APB1Periph,FunctionalState NewState);

3.3 时钟源使能函数

voidRCC_HSICmd(FunctionalState NewState);
voidRCC_LSICmd(FunctionalState NewState);
voidRCC_PLLCmd(FunctionalState NewState);
voidRCC_RTCCLKCmd(FunctionalState NewState);

3.4 时钟源和倍频因子配置函数

voidRCC_HSEConfig(uint32_tRCC_HSE);
voidRCC_SYSCLKConfig(uint32_tRCC_SYSCLKSource);
voidRCC_HCLKConfig(uint32_tRCC_SYSCLK);
voidRCC_PCLK1Config(uint32_tRCC_HCLK);
voidRCC_PCLK2Config(uint32_tRCC_HCLK);

3.5 外设时钟复位函数

voidRCC_APB2PeriphResetCmd(uint32_tRCC_APB2Periph,FunctionalState NewState);
voidRCC_APB1PeriphResetCmd(uint32_tRCC_APB1Periph,FunctionalState NewState);

3.6 自定义系统时钟

voidRCC_HSE_Config(u32 div,u32 pllm)
{
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
if(RCC_WaitForHSEStartUp()==SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PLLConfig(div,pllm);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK)
while(RCC_GetSCLKSource()!=0x08);

}
}

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 振荡器
    +关注

    关注

    28

    文章

    3832

    浏览量

    139106
  • STM32
    +关注

    关注

    2270

    文章

    10900

    浏览量

    356152
  • pll
    pll
    +关注

    关注

    6

    文章

    776

    浏览量

    135179
  • 时钟
    +关注

    关注

    11

    文章

    1734

    浏览量

    131496
  • 时钟源
    +关注

    关注

    0

    文章

    93

    浏览量

    15973

原文标题:STM32时钟详解

文章出处:【微信号:玩点嵌入式,微信公众号:玩点嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32时钟详解

    STM32中在使用任何一个外设都必须打开相应的时钟,所以我从STM32时钟学起。 在STM32中有5个
    发表于 07-19 03:40

    STM32时钟详解 精选资料推荐

    STM32陆陆续续把基础的部分学完了,但对于时钟一直一知半解。今天开始陆陆续续补充关于时钟部分的知识。一、时钟STM32为了实现低功耗,而
    发表于 08-12 07:20

    系统时钟RCC详解

    STM32】系统时钟RCC详解(超详细,超全面)1什么是时钟时钟是单片机运行的基础,时钟信号推
    发表于 08-12 06:40

    详解STM32时钟时钟信号

    详解STM32时钟系统STM32时钟时钟信号推动单片机内各个部分执行相应的指令,
    发表于 08-19 06:33

    STM32时钟树案例详解

    STM32时钟树案例详解时钟树直接使用HSI作为时钟源使用配置相应的结构体,最后调用HAL_RCC_OscConfig(), 和HAL_RC
    发表于 08-20 06:11

    STM32时钟详解

    原文地址:STM32时钟树深入详解作者:蔡志威在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理:1)对于
    发表于 08-23 07:38

    STM32时钟

    STM32时钟配置的总结
    发表于 01-14 11:05 3次下载

    基于STM32 USB详解

    基于STM32 USB详解
    发表于 10-15 10:54 82次下载
    基于<b class='flag-5'>STM32</b> USB<b class='flag-5'>详解</b>

    STM32最小系统和时钟详解

    最小系统1,、供电电路2、复位电路3、时钟:外部晶振(2个)4、Boot启动模式选择5、下载电路(JTAG)6、后背电池时钟详解:在STM32中,有五个
    发表于 11-17 15:36 12次下载
    <b class='flag-5'>STM32</b>最小系统和<b class='flag-5'>时钟</b><b class='flag-5'>详解</b>

    STM32系统时钟RCC详解

    STM32】系统时钟RCC详解(超详细,超全面) 原创
    发表于 11-30 12:21 14次下载
    <b class='flag-5'>STM32</b>系统<b class='flag-5'>时钟</b>RCC<b class='flag-5'>详解</b>

    【自学笔记】STM32时钟系统详解

    ,ADC),时钟的重要性不言而喻。为什么STM32要有多个时钟源呢?​ STM32本身十分复杂,外设非常多 但我们实际使用的时候只会用到有限的几个外设,使用任何外设都需要
    发表于 12-09 13:21 11次下载
    【自学笔记】<b class='flag-5'>STM32</b><b class='flag-5'>时钟</b>系统<b class='flag-5'>详解</b>

    2.STM32的存储器、电源和时钟体系

    3.2.6.复位与时钟概述3.2.7.STM32时钟框图详解13.2.8.STM32时钟框图
    发表于 01-07 15:32 1次下载
    2.<b class='flag-5'>STM32</b>的存储器、电源和<b class='flag-5'>时钟</b>体系

    STM32时钟系统与时钟启动顺序详解

    STM32时钟系统基本一致,不同系列之间有细微差别。此文档主要针对STM32F446的时钟系统进行介绍。
    发表于 02-09 10:31 6次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>时钟</b>系统与<b class='flag-5'>时钟</b>启动顺序<b class='flag-5'>详解</b>

    单片机STM32时钟详解

    众所周知STM32有5个时钟源HSI、HSE、LSI、LSE、PLL,其实他只有四个,因为从上图中可以看到PLL都是由HSI或HSE提供的。 其中,高速时钟(HSE和HSI)提供给芯片主体的主
    的头像 发表于 05-22 10:09 4741次阅读
    单片机<b class='flag-5'>STM32</b><b class='flag-5'>时钟</b><b class='flag-5'>详解</b>

    STM32库函数SystemInit()详解

    STM32库函数SystemInit()详解
    的头像 发表于 09-18 15:45 4074次阅读
    <b class='flag-5'>STM32</b>库函数SystemInit()<b class='flag-5'>详解</b>