学习STM32(3)-电源、时钟、复位电路

本文详细介绍了STM32的电源、时钟和复位电路的配置,包括内部RC振荡器与外部晶振的连接、不同时钟源的选择和分频设置,以及复位寄存器和时钟使能寄存器的配置。通过分析RCC寄存器的各个字段,阐述了如何实现从HSI到HSE、PLL的切换,并最终设定系统时钟为72MHz的过程。文中还提及了相关的中断清除和时钟就绪状态检查,以及外设时钟的开启和关闭。此外,讨论了初始化函数中的关键步骤及其背后的原理,帮助读者理解STM32时钟配置的复杂性和规律。
摘要由CSDN通过智能技术生成
Stm32时钟分析

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

一、硬件上的连接问题

[转载]STM32时钟理解


如果使用内部RC振荡器而不使用外部晶振,请按照如下方法处理:

1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。
2)对于少于100脚的产品,有2种接法:
<wbr><wbr> i)OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能。<br><wbr><wbr> ii)分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出'0'。此方法可以减小功耗并(相对上面i)节省2个外部电阻。</wbr></wbr></wbr></wbr>

https://img-my.csdn.net/uploads/201204/15/1334498245_5047.JPG

对上图的分析如下:

重要的时钟:
PLLCLK,SYSCLK,HCKL,PCLK1,PCLK2 之间的关系要弄清楚;
1
HSI:高速内部时钟信号 stm32单片机内带的时钟 (8M频率)精度较差
2HSE:高速外部时钟信号精度高来源(1)HSE外部晶体/陶瓷谐振器(晶振) (2)HSE用户外部时钟
3
LSE:低速外部晶体 32.768kHz主要提供一个精确的时钟源一般作为RTC时钟使用
STM32中,有五个时钟源,为HSIHSELSILSEPLL
  ①、HSI是高速内部时钟,RC振荡器,频率为8MHz
  ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz
  ③、LSI是低速内部时钟,RC振荡器,频率为40kHz
  ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。
  ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz
  其中40kHzLSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE128分频。RTC的时钟源通过RTCSEL[1:0]来选择。
  STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。该时钟源只能从PLL输出端获取,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz72MHz
  另外,STM32还可以选择一个时钟信号输出到MCO(PA8)上,可以选择为PLL输出的2分频、HSIHSE、或者系统时钟。
  系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。系统时钟可选择为PLL输出、HSI或者HSE。系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各模块使用,AHB分频器可选择12481664128256512分频。其中AHB分频器输出的时钟送给5大模块使用:
  ①、送给AHB总线、内核、内存和DMA使用的HCLK时钟
  ②、通过8分频后送给Cortex的系统定时器时钟。
  ③、直接送给Cortex的空闲运行时钟FCLK
  ④、送给APB1分频器。APB1分频器可选择124816分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)234倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器234使用。
  ⑤、送给APB2分频器。APB2分频器可选择124816分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器1使用。另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。ADC分频器可选择为2468分频。
  在以上的时钟输出中,有很多是带使能控制的,例如AHB总线时钟、内核时钟、各种APB1外设、APB2外设等等。当需要使用某模块时,记得一定要先使能对应的时钟。
  需要注意的是定时器的倍频器,当APB的分频为1时,它的倍频值为1,否则它的倍频值就为2
  连接在APB1(低速外设)上的设备有:电源接口、备份接口、CANUSBI2C1I2C2UART2UART3SPI2、窗口看门狗、Timer2Timer3Timer4。注意USB模块虽然需要一个单独的48MHz时钟信号,但它应该不是供USB模块工作的时钟,而只是提供给串行接口引擎(SIE)使用的时钟。USB模块工作的时钟应该是由APB1提供的。
  连接在APB2(高速外设)上的设备有:UART1SPI1Timer1ADC1ADC2、所有普通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; //DMASDIO等时钟使能
vu32 APB2ENR; //APB2线上外设时钟使能
vu32 APB1ENR; //APB1线上外设时钟使能
vu32 BDCR; //备份域控制寄存器
vu32 CSR;
} RCC_TypeDef;
<wbr> 这些寄存器的具体定义和使用方式参见芯片手册,因为C语言的开发可以不和他们直接打交道,当然如果能够加以理解和记忆,无疑是百利而无一害。<br><wbr><wbr><wbr> 如果外接晶振为8Mhz,最高工作频率为72Mhz,显然需要用PLL倍频9倍,这些设置都需要在初始化阶段完成。为了方便说明,以例程的RCC设置函数,并用中文注释的形式加以说明:</wbr></wbr></wbr></wbr>


static void RCC_Config(void)
{

<wbr><wbr><wbr><br><wbr><wbr><wbr> RCC_DeInit();</wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><br><wbr><wbr><wbr> RCC_HSEConfig(RCC_HSE_ON);</wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><br><wbr><wbr><wbr> HSEStartUpStatus = RCC_WaitForHSEStartUp();</wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr> if (HSEStartUpStatus == SUCCESS)<br><wbr><wbr><wbr> {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr>FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> FLASH_SetLatency(FLASH_Latency_2);</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>&l

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值