当前位置:首页 > 单片机 > 单片机
[导读]STM32中在使用任何一个外设都必须打开相应的时钟,所以我从STM32的时钟学起。RCC时钟在STM32中有5个时钟源:①、HSI是高速内部时钟,RC震荡器,频率为 8MHz。②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部

STM32中在使用任何一个外设都必须打开相应的时钟,所以我从STM32的时钟学起。

RCC时钟

在STM32中有5个时钟源:①、HSI是高速内部时钟,RC震荡器,频率为 8MHz。②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。③、LSI是低速内部时钟,RC振荡器,频率为40kHz。④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HIS/2、HSE或HSE/2。倍频可选择为2~16倍,但其输出频率最大不得超过72MHz。

系统时钟SYSCLK,它是供STM32中绝大部分器件工作的时钟源,系统时钟可选择为PLL输出、HSI或者HSE。系统时钟的做大频率为72MHz,它通过AHB分频器分频后送给个模块使用,AHB分频器可选择1、2、4、8、16、32、64、128、256、512分频。AHB分频器输出的时钟送给5大模块使用:

1. 送给AHB总线、内核、内存和DMA使用的HCLK时钟。2. 通过8分频后送给Cortex的系统定时器时钟。3. 直接送给Cortex的空闲运行时钟PCLK。4. 送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用。5.送给APB2分频器。APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器1使用。另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。ADC分频器可选择为2、4、6、8分频。连接在APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4。连接在APB2(高速外设)上的设备有:UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口、第二功能IO口。寄存器描述: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_CR)

31~26

25

24

23~20

19

18

17

16

保留

PLLRDY

PLLON

保留

CSSON

HSEBYP

HSERDY

HSEON

eg:RCC->CR|=0x00010000; //外部高速时钟使能HSEON

RCC->CR|=0x01000000; //使能PLLON

RCC->CR>>25; //等待PLL锁定

时钟配置寄存器(RCC_CFGR)

31:27

26:24

23

22

21:18

17

16

保留

MCO[2:0]

保留

USBPRE

PLLMUL[3:0]

PLLXTPRE

PLLSRC

15:14

13:11

10:8

7:4

3:2

1:0

ADCPRE[1:0]

PPRE2[2:0]

PPRE1[2:0]

HPRE[3:0]

SWS[1:0]

SW[1:0]

位26:24

MCO: 微控制器时钟输出 (Microcontroller clock output)

由软件置’1’或清零。

0xx:没有时钟输出;

100:系统时钟(SYSCLK)输出;

101:内部RC振荡器时钟(HSI)输出;

110:外部振荡器时钟(HSE)输出;

111:PLL时钟2分频后输出。

位22

USBPRE:USB预分频 (USB prescaler)

由软件置’1’或清’0’来产生48MHz的USB时钟。在RCC_APB1ENR寄存器中使能USB时钟之前,必须保证该位已经有效。如果USB时钟被使能,该位不能被清零。

0:PLL时钟1.5倍分频作为USB时钟

1:PLL时钟直接作为USB时钟

位21:18

PLLMUL:PLL倍频系数 (PLL multiplication factor)

由软件设置来确定PLL倍频系数。只有在PLL关闭的情况下才可被写入。

注意:PLL的输出频率不能超过72MHz

0000:PLL 2倍频输出1000:PLL 10倍频输出

0001:PLL 3倍频输出1001:PLL 11倍频输出

0010:PLL 4倍频输出1010:PLL 12倍频输出

0011:PLL 5倍频输出1011:PLL 13倍频输出

0100:PLL 6倍频输出1100:PLL 14倍频输出

0101:PLL 7倍频输出1101:PLL 15倍频输出

0110:PLL 8倍频输出1110:PLL 16倍频输出

0111:PLL 9倍频输出1111:PLL 16倍频输出

位17

PLLXTPRE:HSE分频器作为PLL输入 (HSE divider for PLL entry)

由软件置’1’或清’0’来分频HSE后作为PLL输入时钟。只能在关闭PLL时才能写入此位。

0:HSE不分频

1:HSE 2分频

位16

PLLSRC:PLL输入时钟源 (PLL entry clock source)

由软件置’1’或清’0’来选择PLL输入时钟源。只能在关闭PLL时才能写入此位。

0:HSI振荡器时钟经2分频后作为PLL输入时钟

1:HSE时钟作为PLL输入时钟。

位15:14

ADCPRE[1:0]:ADC预分频 (ADC prescaler)

由软件置’1’或清’0’来确定ADC时钟频率

00:PCLK2 2分频后作为ADC时钟

01:PCLK2 4分频后作为ADC时钟

10:PCLK2 6分频后作为ADC时钟

11:PCLK2 8分频后作为ADC时钟

位13:11

PPRE2[2:0]:高速APB预分频(APB2) (APB high-speed prescaler (APB2))

由软件置’1’或清’0’来控制高速APB2时钟(PCLK2)的预分频系数。

0xx:HCLK不分频

100:HCLK 2分频

101:HCLK 4分频

110:HCLK 8分频

111:HCLK 16分频

位10:8

PPRE1[2:0]:低速APB预分频(APB1) (APB low-speed prescaler (APB1))

由软件置’1’或清’0’来控制低速APB1时钟(PCLK1)的预分频系数。

警告:软件必须保证APB1时钟频率不超过36MHz。

0xx:HCLK不分频

100:HCLK 2分频

101:HCLK 4分频

110:HCLK 8分频

111:HCLK 16分频

位7:4

HPRE[3:0]: AHB预分频 (AHB Prescaler)

由软件置’1’或清’0’来控制AHB时钟的预分频系数。

0xxx:SYSCLK不分频

1000:SYSCLK 2分频1100:SYSCLK 64分频

1001:SYSCLK 4分频1101:SYSCLK 128分频

1010:SYSCLK 8分频1110:SYSCLK 256分频

1011:SYSCLK 16分频1111:SYSCLK 512分频

位3:2

SWS[1:0]:系统时钟切换状态 (System clock switch status)

由硬件置’1’或清’0’来指示哪一个时钟源被作为系统时钟。

00:HSI作为系统时钟;

01:HSE作为系统时钟;

10:PLL输出作为系统时钟;

11:不可用。

位1:0

SW[1:0]:系统时钟切换 (System clock switch)

由软件置’1’或清’0’来选择系统时钟源。

00:HSI作为系统时钟;

01:HSE作为系统时钟;

10:PLL输出作为系统时钟;

11:不可用

eg: RCC->CFGR=0x00000400; //APB1=DIV2;APB2=DIV1(不分频);AHB=DIV1(不分频);

根据STM32库函数设置时钟流程:

RCC_DeInit(); //设置RCC寄存器重新设置为默认值

RCC_HSEConfig(RCC_HSE_ON); //打开外部高速时钟晶振

HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部高速时钟晶振工作

if(HSEStartUpStatus == SUCCESS) //外部就绪

{

//Add here PLL ans system clock config

RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟不分频

RCC_PCLK2Config(RCC_HCLK_Div1); //设置APB2时钟不分频

RCC_PCLK1Config(RCC_HCLK_Div2); //设置APB1时钟二分频

RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC时钟六分频

//设置PLL时钟将8M时钟9倍频到72M

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);

RCC_PLLCmd(ENABLE);//使能PLL

FlagStatus Status;

Status = RCC_GetFlagStatus(RCC_FLAG_PLLRDY);

if(Status == RESET)

{

……

}

RCC_SYSCLKConfig(RCC-SYSCLKSource_PLLCLK); //将PLL输出设置为系统时钟

while(RCC_GetSYSCLKSource()!=0x08) //测试PLL是否被用作系统时钟等待校验完成

{}

}

else

{

//Add here some code to deal with this error

}

//使能外围接口总线时钟

RCC_APB2PeriphClockCmd() / RCC_APB1PeriphClockCmd()


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

香港2022年7月7日 /美通社/ -- 寿康集团有限公司(“寿康集团”或“本公司”及其附属公司,统称“本集团”;股份代号:0575.HK)旗下全资附属公司、并以香港为基地的人工智能创新公司及衰老与长寿深层生物...

关键字: 时钟 VI GE EV

文章转自知乎[MIPI自学笔记],作者IEEE1364https://zhuanlan.zhihu.com/p/926820471 MIPI概述MIPI是MobileIndustryProcessorInterface的...

关键字: MIPI LAN 数据流 时钟

1、为设计执行综合时使用的各种设计约束是什么?1.1、创建时钟(频率、占空比)。1.2、定义输入端口的transition-time要求1.3、指定输出端口的负载值1.4、对于输入和输出,指定延迟值(输入延迟和输出延迟)...

关键字: 数字芯片 时钟 WIRE CK

如今,SoCs正变得越来越复杂,数据经常从一个时钟域传输到另一个时钟域。上图信号A由C1时钟域触发,被C2时钟域采样。根据这两个时钟之间的关系,在将数据从源时钟传输到目标时钟时,可能会出现不同类型的问题,并且这些问题的解...

关键字: 时钟 触发器 同步器 SETUP

本文主要介绍各种类型的跨时钟域问题。同步时钟是指具有已知相位和频率关系的时钟。这些时钟本质上是来自同一时钟源。根据相位和频率关系,可分为以下几类:具有相同频率和零相位差的时钟具有相同频率和固定相位差的时钟具有不同频率和可...

关键字: 异步 时钟 相位差 SETUP

跨时钟域验证可分为结构验证和功能验证两类。结构验证确保在需要的地方添加了适当的同步逻辑。功能验证确保已添加的逻辑实现了预期的功能。仅通过执行结构验证,就可以检测到许多CDC问题。这些检查比功能验证更简单、更快。因此,验证...

关键字: 时钟 数据传输 信号 TE

来源:射频百花谭规范很重要工作过的朋友肯定知道,公司里是很强调规范的,特别是对于大的设计(无论软件还是硬件),不按照规范走几乎是不可实现的。逻辑设计也是这样:如果不按规范做的话,过一个月后调试时发现有错,回头再看自己写的...

关键字: VERILOG 时钟 计数器 仿真验证

中断服务程序

关键字: 时钟 中断程序

首先通过按“校时、校分、校星期”等按键,校对好时间。 先检查时钟显示是否当前时间一致,如需重新校准,在按住“时钟”键的同时,分别按住“校星期”、“校时”、“校分”键,将时钟调到当前准确时间。

关键字: 自动开关定时器 时钟

出品21ic论坛qbwww网站:bbs.21ic.com做一个桌面时钟大家好,我是qbwww,今天我们来做一个桌面时钟。淘宝买的套件。首先呢,我们先看一下原理图,简单的了解一下连线方式。简单的了解了一下连线的方式呢,我们...

关键字: 时钟
关闭
关闭