基于LinkedInSTM32F4时钟系统初始化设置

发布者:PositiveVibes最新更新时间:2024-05-13 来源: elecfans关键字:LinkedIn  STM32F4  时钟系统  初始化设置 手机看文章 扫描二维码
随时随地手机看文章

LinkedInSTM32F4 时钟系统初始化是在system_stm32f4xx.c中的 SystemInit()函数中完成的。 对于系统时钟关键寄存器设置主要是在 SystemInit 函数中调用 SetSysClock()函数来设置的。我们可以先看看 SystemInit ()函数体:
 

基于LinkedInSTM32F4时钟系统初始化设置

void SystemInit(void)

{

#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)

SCB-》CPACR |= ((3UL 《《 10*2)|(3UL 《《 11*2));

#endif

RCC-》CR |= (uint32_t)0x00000001;

RCC-》CFGR = 0x00000000;

RCC-》CR &= (uint32_t)0xFEF6FFFF;

RCC-》PLLCFGR = 0x24003010;

RCC-》CR &= (uint32_t)0xFFFBFFFF;

RCC-》CIR = 0x00000000;

#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)

SystemInit_ExtMemCtl();

#endif

SetSysClock();

#ifdef VECT_TAB_SRAM

SCB-》VTOR = SRAM_BASE | VECT_TAB_OFFSET;

#else

SCB-》VTOR = FLASH_BASE | VECT_TAB_OFFSET;

#endif

}

SystemInit函数开始先进行浮点运算单元设置,然后是复位PLLCFGR,CFGR寄存器,同时通过设置 CR 寄存器的 HSI 时钟使能位来打开 HSI 时钟。默认情况下如果 CFGR 寄存器复位,那么是选择HSI作为系统时钟,这点大家可以查看RCC-》CFGR 寄存器的位描述最低2位可以得知,当低两位配置为 00的时候(复位之后),会选择 HSI振荡器为系统时钟。也就是说,调用 SystemInit 函数之后,首先是选择 HSI 作为系统时钟。

在设置完相关寄存器后,接下来SystemInit函数内部会调用 SetSysClock函数。这个函数比较长,我们就把函数一些关键代码行截取出来给大家讲解一下。这里我们省略一些宏定义标识符值的判断而直接把针对STM32F407 比较重要的内容贴出来:

static void SetSysClock(void)

{

__IO uint32_t StartUpCounter = 0, HSEStatus = 0;

RCC-》CR |= ((uint32_t)RCC_CR_HSEON);

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;

}

if (HSEStatus == (uint32_t)0x01)

{

RCC-》APB1ENR |= RCC_APB1ENR_PWREN;

PWR-》CR |= PWR_CR_VOS;

RCC-》CFGR |= RCC_CFGR_HPRE_DIV1;

RCC-》CFGR |= RCC_CFGR_PPRE2_DIV2;

RCC-》CFGR |= RCC_CFGR_PPRE1_DIV4;

RCC-》CFGR |= RCC_CFGR_PPRE2_DIV1;

RCC-》CFGR |= RCC_CFGR_PPRE1_DIV2;

RCC-》PLLCFGR = PLL_M | (PLL_N 《《 6) | (((PLL_P 》》 1) -1) 《《 16) |

(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q 《《 24);

RCC-》CR |= RCC_CR_PLLON;

while((RCC-》CR & RCC_CR_PLLRDY) == 0)

{

}

FLASH-》ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN

|FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;

RCC-》CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));

RCC-》CFGR |= RCC_CFGR_SW_PLL;

while ((RCC-》CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);

{

}

}

else

{

}

}

这段代码的大致流程是这样的:先使能外部时钟 HSE,等待 HSE 稳定之后,配置AHB,APB1,APB2 时钟相关的分频因子,也就是相关外设的时钟。等待这些都配置完成之后,打开主PLL时钟,然后设置主PLL作为系统时钟 SYSCLK时钟源。如果HSE 不能达到就绪状态(比如外部晶振不能稳定或者没有外部晶振),那么依然会是HSI作为系统时钟。

在这里要特别提出来,在设置主PLL时钟的时候,会要设置一系列的分频系数和倍频系数参数。大家可以从SetSysClock函数的这行代码看出:

RCC-》PLLCFGR = PLL_M | (PLL_N 《《 6) | (((PLL_P 》》 1) -1) 《《 16) |

(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q 《《 24);

这些参数是通过宏定义标识符的值来设置的。默认的配置在 System_stm32f4xx.c 文件开头的地方配置。对于我们开发板,我们的设置参数值如下:

#define PLL_M 8

#define PLL_Q 7

#define PLL_N 336

#define PLL_P 2

所以我们的主PLL时钟为:

PLL=8MHz * N/ (M*P)=8MHz* 336 /(8*2) = 168MHz

在开发过程中,我们可以通过调整这些值来设置我们的系统时钟。

这里还有个特别需要注意的地方,就是我们还要同步修改 stm32f4xx.h 中宏定义标识符HSE_VALUE 的值为我们的外部时钟:

#if !defined (HSE_VALUE)

#define HSE_VALUE ((uint32_t)8000000)

#endif

这里默认固件库配置的是25000000,我们外部时钟为8MHz,所以我们根据我们硬件情况修改为8000000即可。

讲到这里,大家对 SystemInit 函数的流程会有个比较清晰的理解。那么 SystemInit 函数是怎么被系统调用的呢?SystemInit是整个设置系统时钟的入口函数。这个函数对于我们使用ST提供的 STM32F4 固件库的话,会在系统启动之后先执行main函数,然后再接着执行SystemInit函数实现系统相关时钟的设置。这个过程设置是在启动文件 startup_stm32f40_41xxx.s中间设置的,我们接下来看看启动文件中这段启动代码:

; Reset handler

Reset_Handler PROC

EXPORT Reset_Handler [WEAK]

IMPORT SystemInit

IMPORT __main

LDR R0, =SystemInit

BLX R0

LDR R0, =__main

BX R0

ENDP

这段代码的作用是在系统复位之后引导进入main函数,同时在进入main函数之前,首先

要调用 SystemInit系统初始化函数完成系统时钟等相关配置。

最后我们总结一下SystemInit()函数中设置的系统时钟大小:

SYSCLK(系统时钟) =168MHz

AHB总线时钟(HCLK=SYSCLK) =168MHz

APB1总线时钟(PCLK1=SYSCLK/4) =42MHz

APB2总线时钟(PCLK2=SYSCLK/2) =84MHz

PLL主时钟 =168MHz


关键字:LinkedIn  STM32F4  时钟系统  初始化设置 引用地址:基于LinkedInSTM32F4时钟系统初始化设置

上一篇:STM32单片机ADC的模拟看门狗的测试
下一篇:基于STM32四轴飞行器电路设计的详细图解资料概述

推荐阅读最新更新时间:2026-03-25 14:16

STM32的时钟系统学习笔记(基于STM32F407)
RCC(Reset clock Control 复位时钟控制器) 时钟源(时钟生成) 常规:外部晶振、芯片内部振荡器、锁相环(PLL) PS:(Phase Locked Loop): 为锁相回路或锁相环 其他:以太网、USB OTG FS、或其他外设的时钟源 STM32F407时钟树关系图(重点理解经常用到) 时钟总线 RCC通过多个预分频器配置时钟总线 PS:预分频器 (Prescaler-PSC)用来将定时器时钟源进行分频输出 总线类型:AHB、低速APB1、高速APB2 PS: AHB(Advanced High Performance Bus),高级高性能总线 APB(Advanc
[单片机]
STM32的<font color='red'>时钟</font><font color='red'>系统</font>学习笔记(基于<font color='red'>STM32F4</font>07)
STM32F4时钟系统
1:STM32有5个时钟源:HSI,HSE,LSI,LSE,PLL HSI是高速内部时钟,RC振荡器、频率为16MHZ,精度不高。可以直接作为系统时钟或者用作PLL时钟输入 HSE是高速外部时钟,可接石英/陶瓷谐振器,或接外部时钟源,频率范围为4M~26M. LSI是低速内部时钟,RC振荡器,频率为32KHZ,提供低功耗时钟。主要供独立看门狗和自动唤醒单元使用。 LSE是低速外部时钟,接频率为32.768KHZ的石英石钟。RTC PLL为锁相环倍频输出。STM32F4有两个PLL。 主PLL,(PLL)由HSE或者HSI提供时钟信号,并具有两个不同的输出时钟 第一个输出PLLP用于生成高速的系统时钟(最
[单片机]
<font color='red'>STM32F4</font><font color='red'>时钟</font><font color='red'>系统</font>
STM32F4学习笔记2——时钟与复位系统
STM32F4采用了三种不同的时钟用来驱动系统时钟(SYSCLK) ·HSI振荡器时钟(内部时钟) ·HSE振荡器时钟(外部时钟) ·PLL时钟(锁相环时钟) 这些设备有以下两种二级时钟源 ·32kHz低速内部RC,可用于驱动独立看门狗和通过程序选择驱动RTC。RTC用于从停机/待机模式下自动唤醒系统。 ·32.768kHz低速外部晶振也可以用来通过程序选择驱动RTC(RTCCLK)。 AHB总线最高支持168MHz的时钟,通过AHB总线分频APB2最高支持84MHz,APB1最高支持42MHz。 所有外设驱动全部来至于SYSCLK除了下面几个: ·USB OTG FS时钟48MHz,随机信
[单片机]
STM32F4如何设置系统时钟
STM32F4的系统时钟非常重要,涉及到整个系统的运行结果,无论是什么操作,都需要时钟信号,不同型号的微控制器的默认系统时钟配置是不同的,这里,给出两种配置STM32F407系统时钟的方法。 方法一,采用官方库提供的配置(这里外部晶振8MHz,系统配置为168MHz) STM32F4启动与STM32F10X不同,时钟已经默认配置好 启动代码,文件:startup_stm32f4xx.s Reset_Handler PROC EXPORT Reset_Handler IMPORT SystemInit IMPORT __main LDR R0, =Sy
[单片机]
STM32F407ZGT6芯片时钟系统模块介绍
STM32F4时钟系统的知识在《STM32F4中文参考手册》第六章复位和时钟控制章节有非常详细的讲解,网上关于时钟系统的讲解也有很多,讲不出啥特色,时钟模块是芯片非常重要的组成部分,我们必然要提到时钟系统的知识。这些知识也不是什么原创,纯粹根据官方提供的中文参考手册和自己的应用心得来总结的,如有不合理之处望大家谅解。 STM32F4时钟树概述 众所周知,时钟系统是CPU的脉搏,就像人的心跳一样。所以时钟系统的重要性就不言而喻了。STM32F4的时钟系统比较复杂,不像简单的51单片机一个系统时钟就可以解决一切。于是有人要问,采用一个系统时钟不是很简单吗?为什么STM32要有多个时钟源呢?因为首先STM32本身非常复杂,外设非常的
[单片机]
<font color='red'>STM32F4</font>07ZGT6芯片<font color='red'>时钟</font><font color='red'>系统</font>模块介绍
STM32F429HAL库时钟系统学习笔记
F4的系统的时钟和F1基本相同,和F1 不同的就是锁相环倍频系数提高,就是系统时钟PLL的时钟频率高达180M(做完电赛控制组,感觉100M以下的单片机以后都不用再学了,图像处理完全做不了)。 HSI:系统内部告诉时钟16M; HSE:外部高速时钟这里我们一般叫外部晶振正点原子的开发板是25M输入范围是(4-26M) 我们以外部时钟源25M为例外部时钟经过PLL锁仙环(VCO:压控振荡器,这个是电压控制振荡频率的一个元器件没必要深究) 经过*N倍频在/P就得到我们想要的系统时钟频率了 系统时钟=外部晶振/M*N/P; 我们在来看HAL库的配置函数 RCC- CR |= (uint32_t)0x00000
[单片机]
STM32F407ZGT6之时钟系统介绍
时钟系统是CPU的脉搏,就像人的心跳一样。STM32F4 的时钟系统比较复杂,不像简单的51 单片机一个系统时钟就可以解决一切。STM32F4 的框图如下(可以看到相应的时钟): 1. 连至 APB2 的定时器从 TIMxCLK 提供时钟 (最高 168 MHz) ,连至 APB1 的定时器从 TIMxCLK 提供时钟 (取决于 RCC_DCKCFGR 寄存器中 TIMPRE 位的配置,最高 84 MHz 或 168 MHz)。 2. 摄像头接口和网络接口仅适用于 STM32F407xx 设备。 系统时钟图: 在STM32F4中,有5个重要的时钟源,为 HSI、 HSE、 LSI、 LSE、 PLL。 其中 P
[单片机]
<font color='red'>STM32F4</font>07ZGT6之<font color='red'>时钟</font><font color='red'>系统</font>介绍
STM32F4学习笔记2——时钟与复位系统
STM32F4采用了三种不同的时钟用来驱动系统时钟(SYSCLK) ·HSI振荡器时钟(内部时钟) ·HSE振荡器时钟(外部时钟) ·PLL时钟(锁相环时钟) 这些设备有以下两种二级时钟源 ·32kHz低速内部RC,可用于驱动独立看门狗和通过程序选择驱动RTC。RTC用于从停机/待机模式下自动唤醒系统。 ·32.768kHz低速外部晶振也可以用来通过程序选择驱动RTC(RTCCLK)。 AHB总线最高支持168MHz的时钟,通过AHB总线分频APB2最高支持84MHz,APB1最高支持42MHz。 所有外设驱动全部来至于SYSCLK除了下面几个: ·USB OTG FS时钟48MHz,随机信号发生器时
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved