STM32时钟树与芯片资源结构

1.STM32时钟树

 从图中可以看出来STM32时钟来源于四个时钟信号PLL时钟来自于HSE时钟或HSI时钟也算是五个

2.四个独立时钟源外加一个生出来的时钟

2.1HSE时钟

外部晶体/陶瓷谐振器(HSE晶体)

4~16Mz外部振荡器可为系统提供更为精确的主时钟。我们经常使用8MZ的晶振作为外部晶振,经过倍频就可以得到72MZ。

2.2HSI时钟(不精准):

HSI 时钟信号由内部 8MHz RC 振荡器产生,可直接作为系统时钟或在 2 分频后作为 PLL 输入。
HSI RC 振荡器能够在不需要任何外部器件的条件下提供系统时钟。它的启动时间比 HSE 晶体振
荡器短。然而,即使在校准之后它的时钟频率精度仍较差。

2.3LSI时钟:

LSI RC 担当一个低功耗时钟源的角色,它可以在停机和待机模式下保持运行,为独立看门狗和
自动唤醒单元提供时钟。 LSI 时钟频率大约 40kHz( 30kHz 60kHz 之间 )。
以下作为扩充知识:
LSI RC 可以通过控制 / 状态寄存器 (RCC_CSR) 里的 LSION 位来启动或关闭。
在控制 / 状态寄存器 (RCC_CSR) 里的 LSIRDY 位指示低速内部振荡器是否稳定。在启动阶段,直
到这个位被硬件设置为 ’1’ 后,此时钟才被释放。如果在时钟中断寄存器 (RCC_CIR) 里被允许,
将产生 LSI 中断申请。
注意: 只有大容量和互联型产品可以进行 LSI 校准
LSI 校准:
可以通过校准内部低速振荡器 LSI 来补偿其频率偏移,从而获得精度可接受的 RTC 时间基数,以
及独立看门狗 (IWDG) 的超时时间 ( 当这些外设以 LSI 为时钟源 )
校准可以通过使用 TIM5 的输入时钟 (TIM5_CLK) 测量 LSI 时钟频率实现。测量以 HSE 的精度为保
证,软件可以通过调整 RTC 20 位预分频器来获得精确的 RTC 时钟基数,以及通过计算得到精
确的独立看门狗 (IWDG) 的超时时间。
LSI 校准步骤如下:
1. 打开 TIM5 ,设置通道 4 为输入捕获模式;
2. 设置 AFIO_MAPR TIM5_CH4_IREMAP 位为 ’1’ ,在内部把 LSI 连接到 TIM5 的通道 4
3. 通过 TIM5 的捕获 / 比较 4 事件或者中断来测量 LSI 时钟频率;
4. 根据测量结果和期望的 RTC 时间基数和独立看门狗的超时时间,设置 20 位预分频器。

2.4(生出来的时钟源)PLL:

内部 PLL 可以用来倍频 HSI RC 的输出时钟或 HSE 晶体输出时钟, 它来源于其他时钟
PLL 的设置 ( 选择 HIS 振荡器除 2 HSE 振荡器为 PLL 的输入时钟,和选择倍频因子 ) 必须在其被激
活前完成。一旦 PLL 被激活,这些参数就不能被改动。
如果 PLL 中断在时钟中断寄存器里被允许,当 PLL 准备就绪时,可产生中断申请。
如果需要在应用中使用 USB 接口, PLL 必须被设置为输出 48 72MHZ 时钟,用于提供 48MHz

USBCLK时钟

2.5LSE:

LSE晶体是一个32.768kHz的低速外部晶体或陶瓷谐振器。它为实时时钟或者其他定时功能提供

一个低功耗且精确的时钟源。

3.SYSCLK系统时钟

系统时钟一般都设置为72MZ,因此一般都是HSE(高速外部时钟)通过倍频得到,内部高频时钟作为系统时钟来源最高64MZ。怎么算看图即可。

4.RCC

以下配置内容转自代码里的链接处博客。

RCC(Reset Clock Controller) —— 复位与时钟控制

对RCC寄存器进行配置我们就可以来配置我们的时钟:以F103为例,操作如下

RCC初始化:
这里我们使用HSE(外部时钟),正常使用的时候也都是使用外部时钟

使用HSE时钟,程序设置时钟参数流程:
1、将RCC寄存器重新设置为默认值   RCC_DeInit;
2、打开外部高速时钟晶振HSE       RCC_HSEConfig(RCC_HSE_ON);
3、等待外部高速时钟晶振工作      HSEStartUpStatus = RCC_WaitForHSEStartUp();
4、设置AHB时钟         RCC_HCLKConfig;
5、设置高速AHB时钟     RCC_PCLK2Config;
6、设置低速速AHB时钟   RCC_PCLK1Config;
7、设置PLL              RCC_PLLConfig;
8、打开PLL              RCC_PLLCmd(ENABLE);
9、等待PLL工作          while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
10、设置系统时钟        RCC_SYSCLKConfig;
11、判断是否PLL是系统时钟     while(RCC_GetSYSCLKSource() != 0x08)
12、打开要使用的外设时钟      RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()

void RCC_Configuration(void)
{
	//----------使用外部RC晶振-----------
	RCC_DeInit();			//初始化为缺省值
	RCC_HSEConfig(RCC_HSE_ON);	//使能外部的高速时钟 
	while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);	//等待外部高速时钟使能就绪
	
	FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);	//Enable Prefetch Buffer
	FLASH_SetLatency(FLASH_Latency_2);		//Flash 2 wait state
	
	RCC_HCLKConfig(RCC_SYSCLK_Div1);		//HCLK = SYSCLK
	RCC_PCLK2Config(RCC_HCLK_Div1);			//PCLK2 =  HCLK
	RCC_PCLK1Config(RCC_HCLK_Div2);			//PCLK1 = HCLK/2
	RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);	//PLLCLK = 8MHZ * 9 =72MHZ
	RCC_PLLCmd(ENABLE);			//Enable PLLCLK
 
	while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);	//Wait till PLLCLK is ready
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);	//Select PLL as system clock
	while(RCC_GetSYSCLKSource()!=0x08);		//Wait till PLL is used as system clock source
	
	//---------打开相应外设时钟--------------------
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	//使能APB2外设的GPIOA的时钟		 
}

————————————————

                            博客为博主原创,转载请评论说明并注明出处,谢谢
                        
原文链接:https://blog.csdn.net/as480133937/article/details/98845509

在开发过程中配置时钟首先去看时钟树图,找到系统时钟,结合芯片参考手册,数据手册,固件库函数可以一步步进行配置。

5.芯片资源结构

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值