STM32时钟体系

一、时钟体系

        给单片机提供一个时钟信号(一个非常稳定的频率信号),使单片机各内部组件同步工作,并且在和外部设备通信时是也能达到同步。

        动态调整运行频率,就可以控制性能与功耗!

1、参考手册 STM32F4xx 中文参考手册.pdf 第 106 页

2、时钟源

a.可以使用三种不同的时钟源来驱动系统时钟 (SYSCLK),CPU 运行的频率为 168MHz:

● HSI 振荡器时钟(16MHz),也就是高速内部时钟,一般来说很少用,因为精度没有外部高速时钟那么高。

● HSE 振荡器时钟,也就是高速外部时钟,GECM4 开发板 8MHz。

● 主 PLL (PLL) 时钟

b.器件具有以下两个次级时钟源:

● 32 kHz 低速内部 RC (LSI RC),该 RC 用于驱动独立看门狗,也可选择提供给 RTC 用于停机/待机模式下的自动唤醒。

● 32.768 kHz 低速外部晶振(LSE 晶振),用于驱动 RTC 时钟 (RTCCLK)对于每个时钟源来说,在未使用时都可单独打开或者关闭,以降低功耗。

3、时钟树

时钟树就是关注时钟源和时钟的流向,嵌入式系统中的模块和外设工作都以时钟为基准。有了时钟树,就有了时钟域。嵌入式中除了内核,还有各个单元,每个单元工作在不同的时钟频率下,给每个单元提供不同的时钟。

实际应用中根据需要配置外设的时钟控制开关,选择需要的时钟频率,并可关闭不用外设时钟。

二、PLL

2.1 概述       

PLL(Phase Locked Loop): 为锁相回路或锁相环,用来统一整合时钟信号,使高频器件正常工作,如内存的存取资料等。

PLL基于振荡器中的反馈技术,许多电子设备要正常工作,通常需要外部的输入信号与内部的振荡信号同步。

一般的晶振由于工艺与成本原因,做不到很高的频率,而在需要高频应用时,由相应的器件VCO,实现转成高频,但并不稳定,故利用锁相环路就可以实现稳定且高频的时钟信号。

2.2 基本组成

锁相环路是一种反馈控制电路,简称锁相环(PLL,Phase-Locked Loop)。锁相环的特点是:利用外部输入的参考信号控制环路内部振荡信号的频率和相位。因锁相环可以实现输出信号频率对输入信号频率的自动跟踪,所以锁相环通常用于闭环跟踪电路。

锁相环在工作的过程中,当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出电压与输入电压的相位被锁住,这就是锁相环名称的由来。锁相环通常由鉴相器(PD,Phase Detector)、环路滤波器(LF,Loop Filter)和压控振荡器(VCO,Voltage Controlled Oscillator)三部分组成。

锁相环的工作原理是检测输入信号和输出信号的相位差,并将检测出的相位差信号通过鉴相器转换成电压信号输出,经低通滤波器滤波后形成压控振荡器的控制电压,对振荡器输出信号的频率实施控制,再通过反馈通路把振荡器输出信号的频率、相位反馈到鉴相器。

锁相环在工作过程中,当输出信号的频率成比例地反映输入信号的频率时,输出电压与输入电压保持固定的相位差值,这样输出电压与输入电压的相位就被锁住了。

https://note.youdao.com/yws/public/resource/b994246549f84052c3cad3ea416ccf64/xmlnote/D45D8926DBE747F58DEFE1F7420DCEF1/BE26E23DB06D4754B959545B10104E25/49541

2.3 类比说明

我们刚开始学车的时候,在道路上开车,眼睛就好像一个鉴相器,负责发现车行驶的方向(反馈)和前方的路(输入)是否有差别,把差别输入大脑进行判断,然后指挥双手旋转方向盘,旋转方向盘的动作转换成车的行驶方向,如下图所示。

 

https://note.youdao.com/yws/public/resource/b994246549f84052c3cad3ea416ccf64/xmlnote/D45D8926DBE747F58DEFE1F7420DCEF1/05289626ABE64F1196279E682105D7C1/49551

我们通过这么一个闭环过程不断地调节方向盘,保证车行驶在正道上。

2.3 相位差[拓展]

两个频率相同的交流电相位的差叫做相位差,或者叫做相差,又称“相角差”、“相差”、“周相差”或“位相差”。两个作周期变化的物理量的相之间的差值。它为正值时称前者超前于后者,为负值时则滞后于后者。它为零或π的偶数倍时,两物理量同相;为π的奇数倍时则称反相。

这两个频率相同的交流电,可以是两个交流电流,可以是两个交流电压,可以是两个交流电动势,也可以是这三种量中的任何两个。两个同频率正弦量的相位差就等于初相之差。是一个不随时间变化的常数。也可以是一个元件上的电流与电压的相位变化。任意一个正弦量y = Asin(wt+ j0)的相位为(wt+ j0),两个同频率正弦量的相位差(与时间t无关)。设第一个正弦量的初相为 j01,第二个正弦量的初相为 j02,则这两个正弦量的相位差为j12 = j01 - j02。

https://note.youdao.com/yws/public/resource/b994246549f84052c3cad3ea416ccf64/xmlnote/D45D8926DBE747F58DEFE1F7420DCEF1/8C63520B56DB43D98E42C6DDB6187B62/49561

2.4 PLL配置参数

https://note.youdao.com/yws/public/resource/b994246549f84052c3cad3ea416ccf64/xmlnote/D45D8926DBE747F58DEFE1F7420DCEF1/FDABDB2359084BD5BDDE920A3B150E29/43357

不同的芯片,倍频(频率翻倍)公式是不一样的,需要查询芯片手册!

三、SystemInit系统初始化函数

1.其实第一个执行的文件是汇编文件

  • 栈的初始化,提供函数调用的时候进行现场保护和现场恢复
  • 堆的初始化,为申请内存提供空间,调用malloc
  • 执行Reset_Handler,意思说上电复位后执行的动作
  • 执行SystemInit函数
  • 跳转到main函数

2.初始化Flash接口,更新PLL系统频率

/**   

* @brief  Setup the microcontroller system   

*         Initialize the Embedded Flash Interface, the PLL and update the   

*         SystemFrequency variable.  

* @param  None   

* @retval None   

*/

void SystemInit(void)

{  

 ................   

/* Configure the System clock source, PLL Multiplier and Divider factors,      

        AHB/APBx prescalers and Flash settings ----------------------------------*/   

SetSysClock();    

 ................  

}

3.调用SetSysClock函数设置PLL时钟,然后进行分频

/**   

* @brief  Configures the System clock source, PLL Multiplier and Divider factors,   

*         AHB/APBx prescalers and Flash settings   

* @Note   This function should be called only once the RCC clock configuration     

*         is reset to the default reset state (done in SystemInit() function).      

* @param  None   

* @retval None   

*/

static void SetSysClock(void)

{      

         .....................    

         /* Configure the main PLL */

         RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |

                (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);

        .....................

}

system_stm32f4xx.c文件有以下倍频(PLL_N)与分频(PLL_M、PLL_P)因子:

/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */

#define PLL_M      8 //(记得修改为8)

/* USB OTG FS, SDIO and RNG Clock =  PLL_VCO / PLLQ */

#define PLL_Q      7  

#if defined (STM32F40_41xxx)

#define PLL_N      336 /* SYSCLK = PLL_VCO / PLL_P */

#define PLL_P      2

#endif /* STM32F40_41xxx */

由于官方的代码是使用外部高速晶振25MHz,GEC-M4开发板是使用外部高速晶振8MHz,所以PLL的倍频因子要进行修改,只修改PLL_M为8。

 

去掉stm32f4xx.h的只读属性

https://note.youdao.com/yws/public/resource/b994246549f84052c3cad3ea416ccf64/xmlnote/D45D8926DBE747F58DEFE1F7420DCEF1/4A62726F485949EE93CA2A62CC546309/43355

接着修改stm32f4xx.h以下内容,行127将外部晶振频率值修改为8MHz。

#if !defined  (HSE_VALUE)   

·        #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz*/

#endif /* HSE_VALUE */

最后按照PLL的运算公式,最终得到输出频率为168MHz。

https://note.youdao.com/yws/public/resource/b994246549f84052c3cad3ea416ccf64/xmlnote/D45D8926DBE747F58DEFE1F7420DCEF1/501928D373E54E5DA333664CD246761F/43361

#注意事项

1.在《STM32F4xx中文参考手册》 P117页,PLL_M、PLL_N、PLL_P,这三个参数都有一定的范围限制,详细如下:

2≤ PLL_M ≤63

192≤ PLL_N ≤432

PLL_P:2、4、6、8

四、时钟源

        在特殊的应用场景,为了达到最高的能效比,没有必要使用到PLL,可将HSE、HSI作为系统时钟源。例如,在智能手表锁屏的情况下,如果使用PLL配置过后输出的频率会造成过多的功耗,降低自身的续航能力;同时要维持计步与测量心率功能。因此,PLL在锁屏下的应用场景并不合适,在保证功能实现的前提下,尽可能降低功耗,可以切换频率更低的时钟源提供给系统时钟。

https://note.youdao.com/yws/public/resource/b994246549f84052c3cad3ea416ccf64/xmlnote/D45D8926DBE747F58DEFE1F7420DCEF1/2F5535E948894145A64F4F9D95B42DA1/43353

 1.选择PLL作为系统时钟源

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

RCC->CFGR |= RCC_CFGR_SW_PLL;

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

2.选择HSI作为系统时钟源

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

RCC->CFGR |= RCC_CFGR_SW_HSI;

RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);

3.选择HSE作为系统时钟源

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

RCC->CFGR |= RCC_CFGR_SW_HSE;

RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);

五、应用场景

调节 CPU 的运行频率,来控制系统的性能与功耗。比较典型的例子就是说手机/笔记本电脑都有高性能模式、平衡模式、低性能模式。

https://note.youdao.com/yws/public/resource/b994246549f84052c3cad3ea416ccf64/xmlnote/D45D8926DBE747F58DEFE1F7420DCEF1/36DE1F9CB6054A23B8BA4BD7E8F92520/43354

 

https://note.youdao.com/yws/public/resource/b994246549f84052c3cad3ea416ccf64/xmlnote/D45D8926DBE747F58DEFE1F7420DCEF1/FF77DD2109D2456BAD032458C48067E4/43359

 

六、寄存器边界地址

详见《STM32F4xx中文参考手册》的P52 ~ P54页,部分展示如下:

 

https://note.youdao.com/yws/public/resource/b994246549f84052c3cad3ea416ccf64/xmlnote/D45D8926DBE747F58DEFE1F7420DCEF1/WEBRESOURCE7a03e2f5b056cd3c67d4c03a14a73f4a/48329

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿文的储物间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值