您的位置 首页 应用

Stm32时钟剖析

该分析材料大部分来自opendev论坛,我所做的只不过是加上一些自己的分析和整理,由于个人能力有限,纰漏之处在所难免,欢迎指正。Stm32时钟

该剖析资料大部分来自opendev论坛,我所做的只不过是加上一些自己的剖析和收拾,因为个人能力有限,疏忽之处在所难免,欢迎纠正。

Stm32时钟结构图如下,(http://www.openedv.com/posts/list/302.htm)

对上图的剖析如下:

重要的时钟:
PLLCLK,SYSCLK,HCKL,PCLK1,PCLK2之间的联系要弄清楚;
1、HSI:高速内部时钟信号stm32单片机内带的时钟(8M频率)精度较差
2、HSE:高速外部时钟信号精度高来历(1)HSE外部晶体/陶瓷谐振器(晶振)(2)HSE用户外部时钟
3、LSE:低速外部晶体32.768kHz首要供给一个准确的时钟源一般作为RTC时钟运用
在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。
  ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。
  ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或许接外部时钟源,频率规模为4MHz~16MHz。
  ③、LSI是低速内部时钟,RC振荡器,频率为40kHz。
  ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。
  ⑤、PLL为锁相环倍频输出,其时钟输入源可挑选为HSI/2、HSE或许HSE/2。倍频可挑选为2~16倍,可是其输出频率最大不得超越72MHz。
  其间40kHz的LSI供独立看门狗IWDG运用,别的它还能够被挑选为实时时钟RTC的时钟源。别的,实时时钟RTC的时钟源还能够挑选LSE,或许是HSE的128分频。RTC的时钟源经过RTCSEL[1:0]来挑选。
  STM32中有一个全速功用的USB模块,其串行接口引擎需求一个频率为48MHz的时钟源。该时钟源只能从PLL输出端获取,能够挑选为1.5分频或许1分频,也便是,当需求运用USB模块时,PLL有必要使能,而且时钟频率装备为48MHz或72MHz。
  别的,STM32还能够挑选一个时钟信号输出到MCO脚(PA8)上,能够挑选为PLL输出的2分频、HSI、HSE、或许体系时钟。
  体系时钟SYSCLK,它是供STM32中绝大部分部件作业的时钟源。体系时钟可挑选为PLL输出、HSI或许HSE。体系时钟最大频率为72MHz,它经过AHB分频器分频后送给各模块运用,AHB分频器可挑选1、2、4、8、16、64、128、256、512分频。其间AHB分频器输出的时钟送给5大模块运用:
  ①、送给AHB总线、内核、内存和DMA运用的HCLK时钟。
  ②、经过8分频后送给Cortex的体系定时器时钟。
  ③、直接送给Cortex的闲暇运转时钟FCLK。
  ④、送给APB1分频器。APB1分频器可挑选1、2、4、8、16分频,其输出一路供APB1外设运用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器运用。该倍频器可挑选1或许2倍频,时钟输出供定时器2、3、4运用。
  ⑤、送给APB2分频器。APB2分频器可挑选1、2、4、8、16分频,其输出一路供APB2外设运用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器运用。该倍频器可挑选1或许2倍频,时钟输出供定时器1运用。别的,APB2分频器还有一路输出供ADC分频器运用,分频后送给ADC模块运用。ADC分频器可挑选为2、4、6、8分频。
  在以上的时钟输出中,有很多是带使能操控的,例如AHB总线时钟、内核时钟、各种APB1外设、APB2外设等等。当需求运用某模块时,记住一定要先使能对应的时钟。
  需求留意的是定时器的倍频器,当APB的分频为1时,它的倍频值为1,不然它的倍频值就为2。
  连接在APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4。留意USB模块尽管需求一个独自的48MHz时钟信号,但它应该不是供USB模块作业的时钟,而仅仅供给给串行接口引擎(SIE)运用的时钟。USB模块作业的时钟应该是由APB1供给的。
  连接在APB2(高速外设)上的设备有:UART1、SPI1、Timer1、ADC1、ADC2、一切一般IO口(PA~PE)、第二功用IO口。
触及的寄存器:
RCC寄存器结构,RCC_TypeDeff,在文件“stm32f10x_map.h”中界说如下:
typedef struct
{
vu32 CR;//HSI,HSE,CSS,PLL等的使能
vu32 CFGR; //PLL等的时钟源挑选以及分频系数设定
vu32 CIR;//铲除/使能时钟安排妥当中止
vu32 APB2RSTR;//APB2线上外设复位寄存器
vu32 APB1RSTR;//APB1线上外设复位寄存器
vu32 AHBENR;//DMA,SDIO等时钟使能
vu32 APB2ENR;//APB2线上外设时钟使能
vu32 APB1ENR;//APB1线上外设时钟使能
vu32 BDCR;//备份域操控寄存器
vu32 CSR;
} RCC_TypeDef;
能够对上上面的时钟框图和RCC寄存器来学习,对STM32的时钟体系有个大约的了解,然后对照咱们的《STM32不完全手册》的体系时钟装备函数void Stm32_Clock_Init(u8 PLL)一同来学习。

详细装备进程:

第一步:

复位并装备向量表。

函数MYRCC_DeInit();

下面临该函数进行剖析:

(1)设置外设复位寄存器:RCC->APB1RSTR = 0x00000000

该寄存器中包括dac,电源复位,定时器等外设复位设置,某位为1表明对相应外设复位。开机发动时将该寄存器数据清空。

(2)设置外设复位寄存器:RCC->APB2RSTR = 0x00000000

同第一步外设复位寄存器的设置。

回答:

RCC->APB1RSTR=0x00000000;//复位完毕
RCC->APB2RSTR=0x00000000;
这儿的“复位完毕”详细是什么意思??我把它注释掉后发现也是能够运转的

1是复位.0当然是不复位了
不复位那便是复位完毕了.

(3)睡觉形式闪存和sram时钟使能,其他封闭。用于运用sram。Sram相当于pc的内存。

STm32有三种发动形式:

1,ISP形式.这种形式便是STM32复位后就履行固化在内部的BOOTLOADER程序(固化的,咱们无法读写.),然后等候串口数据,然后完成串口bootloader功用.
这种形式不会从用户存储区发动(除非用串口操控其从0X08000000发动),所以在更新了代码之后,需求设置为其他形式(FLASH形式).
2,FLASH发动形式.这种形式直接从0X08000000发动,也便是咱们自己编写的代码的发动方法了.正常状况都应该用这种.
3,SRAM发动形式.这种形式我没有用过,是从0X20000000发动的,也便是说在sram形式开端之前,你要保证SRAM里边已经有代码了,不然便是死机.

RCC->AHBENR = 0x00000014

(4)设置外设时钟使能寄存器:

RCC->APB1ENR = 0x00000000;

RCC->APB2ENR = 0x00000000;将一切外设悉数封闭

(5)使能内部高速HSION。

RCC->CR |=0x00000001;

stm32的时钟发动进程。
发动进程是:
1,首要运用内部时钟(这也是为什么你不接晶振也能够下载代码了)。
2,测验敞开外部时钟.
3,假如敞开成功,则运用外部时钟,不然运用内部。
4,做其他工作。
当然以上代码都需求你自己写代码完成,当然内部时钟是默许的时钟,你不敞开也能够.

(6)复位SW,HPRE,PPRE1,PPRE2,ADCPRE,MCO

RCC->CFGR &= 0xF8FF0000;

这步有什么意思呢,我的了解是。Cfgr寄存器首要用于对时钟分频的操控,见下图:

经过该步的装备:

首要装备MCO无输出,MCO是什么呢?是指能够将stm32的内部时钟经过IO口引脚输出出去,如上图就能够看到,对cfgr的装备,能够有四种mco输出,分别是将pllclk两分频后输出,hsi(片内时钟)输出等。

其次:装备ADCPRE便是上图中AHB分频器线面的ADC

再次:装备ppre2也便是高速外部时钟APB2,这儿设成不分频。高速外部时钟首要驱动一些高速外设,这个在APB2ENR时钟操控寄存器中有介绍

再次:装备PPRE1装备低速外部时钟分频APB1这儿也悉数设成不分频。

再次:装备HPRE。这几个位首要用来装备AHB这个寄存器的分频系数这儿也设置成不分频。也便是说上图SYSCLK经AHB没有分频。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/255923.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部