STM32时钟树与启动过程时钟设置分析

github:https://github.com/oraSC

  • 了解启动过程

博主认为,如果你要深入学习STM32,那么你就应该深入研究STM32从启动开始到结束的各个过程,清楚认识整个过程,才会避免在今后的开发中遇到各种玄学问题(虽然博主也经常遇到各种玄学问题),很多情况下玄学问题都是因为自身对问题没有足够深入的认识。

启动过程???许多刚入门STM32的小白可能会一脸懵逼,我可以正常的写流水灯程序呀,我从来就没设置过启动过程。那么说明你对STM32的固件库还没有足够清晰的认识,我们虽然没有足够的能力去写启动程序,但是我们应该学会去阅读、认识这个过程。此处借助原子的Template工程没有资料的从此处下载:启动程序是./CORE/startup_stm32f40_41xxx.s

这是一段汇编代码,主要是一些内存、中断向量、时钟的初始化。本博的汇编基础为零(留下不学无术的眼泪),有兴趣的参考如下博文介绍:

STM32启动过程--启动文件--分析

  • STM32时钟树

1.为什么要有时钟树:

    学过其他的MCU(AVR、51)的同学都知道,哪有什么时钟树,时钟全都是梭哈的统一时钟,但是为什么STM32要煞费心机构造这样一个复杂时钟树呢,当然是为了低功耗,对于时钟频率要求高的挂载在频率高的时钟线。

2.时钟树结构简介

   STM32具有多个时钟源,同时可编程配置时钟选择。首先我们先官方手册分析四种为什么分析STM32时钟树结构:

首先我们记住几个关键的名词:

HSE( High Speed External ):高速外部时钟、LSE(Low Speed External):低速内部时钟、HSI(High Speed Internal):高速内部时钟以及 LSI(Low Speed Internal):低速内部时钟。(建议借助英文理解,方便记忆)

看到看到上面的时钟树构造图各位估计懵了,没关系,我带大家一步一步分析(分析SYSCLK产生过程)

大多数配置方式是选择HSE作为时钟源,过程路径:

HSE    -->   倍频器   --> PLLCLK     -->  SYSCLK

但是,我们就产生一个以为了,我板载 8M外部晶振,在代码中怎么配置选择门和倍频器得到官方标准的 168M SYSCLK呢

下面我们走进代码看看是怎么一回事:

我们来到启动文件的182行:

在keil平台下我们跳进函数看看(编译后才能跳转):

void SystemInit(void)
{
  /* FPU settings ------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif
  /* Reset the RCC clock configuration to the default reset state ------------*/
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;

  /* Reset CFGR register */
  RCC->CFGR = 0x00000000;

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

  /* Reset PLLCFGR register */
  RCC->PLLCFGR = 0x24003010;

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

  /* Disable all interrupts */
  RCC->CIR = 0x00000000;

#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
  SystemInit_ExtMemCtl(); 
#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
         
  /* Configure the System clock source, PLL Multiplier and Divider factors, 
     AHB/APBx prescalers and Flash settings ----------------------------------*/
  SetSysClock();    /*注意*/

  /* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_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
}

根据官方注释,我们可以知道这是在开启各个时钟源。

跳进setSysClock();

跳入PLL_M的宏定义代码段

通过这里我们就可以计算出我们的PLLCLK的数值了

PLLCLK = (HSE / PLL_M )   *  PLL_N    /     PLL_P;

PLLCLK = (8M / 8 )   * 336 / 2 = 168M

但是别忘了,我们还有个选择门没有配置,同样在 SetSysClock 中

但是这样就ok了吗,注意,我们一直没定义HSE的值,并且HSE是可以变化的,当然会留接口给我们设置,在stm32f4xx.h中:

这样就可以获得我们需要的168M SYSCLK了

补充,AHB  和 APB1、APB2的相关配置也在 SetSysClock 中,你可以阅读相应的源代码何修改配置去得到想要的时钟参数

通过  jlink 调试可以获得我们的时钟数值(源代码

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32时钟树配置是指通过配置相关寄存器来设置STM32微控制器的时钟源和时钟分频。时钟树的配置对于STM32设备的正常运行和性能优化非常重要。时钟树配置决定了各个模块的时钟频率和时钟源的选取,包括系统时钟、外设时钟和总线时钟等。 在STM32CubeMX软件中,提供了可视化的方式来配置STM32时钟树,方便开发人员进行定制化的设置。通过STM32CubeMX,我们可以选择不同的时钟源以及设置时钟分频器来满足具体的需求。可以根据具体的应用要求,合理配置时钟树,以获得最佳的性能和功耗平衡。 配置STM32时钟树的步骤包括: 1. 打开STM32CubeMX软件并创建新的工程。 2. 在时钟树配置界面,选择合适的时钟源,例如内部RC振荡器、外部晶体振荡器或者外部时钟源等。 3. 根据实际需求配置各个模块的时钟频率和时钟源,例如CPU、外设、总线等。 4. 设置时钟分频器,根据需求进行精确的时钟分频,以满足系统的性能和功耗要求。 5. 生成代码并导出配置文件,以便在开发环境中使用。 通过合理配置STM32时钟树,可以实现对系统时钟的灵活控制,提高系统的稳定性和性能。同时,时钟树配置也是低功耗和EMC设计的关键,可以有效降低功耗和电磁干扰。 引用提供了详细介绍STM32时钟树配置和原理的文档,引用介绍了时钟树STM32中的重要性,引用推荐了可视化配置STM32时钟树的工具。这些资料可以帮助开发人员更好地理解和配置STM32时钟树

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值