历史上的今天
返回首页

历史上的今天

今天是:2024年12月10日(星期二)

正在发生

2019年12月10日 | stm32 时钟配置——外部时钟倍频、内部时钟倍频

2019-12-10 来源:eefocus

stm32可选的时钟源


在STM32中,可以用内部时钟,也可以用外部时钟,在要求进度高的应用场合最好用外部晶体震荡器,内部时钟存在一定的精度误差。


准确的来说有4个时钟源可以选分别是HSI、LSI、HSE、LSE(即内部高速,内部低速,外部高速,外部低速),高速时钟主要用于系统内核和总线上的外设时钟。低速时钟主要用于独立看门狗IWDG、实时时钟RTC。


①、HSI是高速内部时钟,RC振荡器,频率为8MHz,上电后默认的系统时时钟 SYSCLK = 8MHz,Flash编程时钟。

①、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。

③、LSI是低速内部时钟,RC振荡器,频率为40kHz,可用于独立看门狗IWDG、实时时钟RTC。

④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。

 

系统时钟SYSCLK输入

这里重点在高速时钟,因为大部分外设时钟都是用的高速时钟。系统内核和外设时钟的时钟只有一个源,那就是SYSCLK, 即常说的系统时钟, 他是有一个选择器SW来做选择的,有3种选择HSI、HSE和PLL, 上电后默认选择内部HSI, HSI虽然存在精度误差,但是能保证不会挂。这点比AVR单片机做的好一些,AVR单片机时钟一旦配置成外部的,如果外部时钟正常那时无法下载程序的。PLL为锁相环倍频输出,PLL时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,其输出频率最大不得超过72MHz, 也有网有超频工作的,但不提倡。


也就是说系统时钟SYSCLK最终有以下几种选择:

①、SYSCLK = HSI

①、SYSCLK = HSE

③、SYSCLK = PLL

关于PLL锁相环倍频(输入和输出):

将输入时钟乘以一个系数后输出时钟,可以百度PLL原理。

PLL的输入3种选择:

①、PLLi =  HSI /2

①、PLLi =  HSE /2

③、PLLi =  HSE

 

PLL的输出有15种选择: PLLout = PLLi Xn (n = 2…16)

关于USB时钟

STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。该时钟源只能从PLL输出端获取(唯一的),,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz。

image

关于把时钟信号输出到外部

另外,STM32还可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。

 image

 

关于系统时钟SYSCLK分配

系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。系统时钟可选择为PLL输出、HSI(8MHz)或者HSE(外部晶振)。系统时钟最大频率为72MHz,供给I2S音频总线和AHB总线时钟。

image

它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、64、128、256、512分频。其中AHB分频器输出的时钟送给5大模块使用:


①、内核总线:送给AHB总线、内核、内存和DMA使用的HCLK时钟。

②、Tick定时器:通过8分频后送给Cortex的系统定时器时钟。

③、I2S总线:直接送给Cortex的空闲运行时钟FCLK。


④、APB1外设:送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用。


⑤、APB2外设:送给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口。


对于单片机系统来说,CPU和总线以及外设的时钟设置是非常重要的,因为没有时钟就没有时序。


由于时钟是一个由内而外的东西,具体设置要从寄存器开始。 
RCC 寄存器结构,RCC_TypeDeff,在文件“stm32f10x.h”中定义如下: (v3.4库)

1059行->1081行。

typedef struct

{

  __IO uint32_t CR;

  __IO uint32_t CFGR;

  __IO uint32_t CIR;

  __IO uint32_t APB2RSTR;

  __IO uint32_t APB1RSTR;

  __IO uint32_t AHBENR;

  __IO uint32_t APB2ENR;

  __IO uint32_t APB1ENR;

  __IO uint32_t BDCR;

  __IO uint32_t CSR;

#ifdef STM32F10X_CL

  __IO uint32_t AHBRSTR;

  __IO uint32_t CFGR2;

#endif /* STM32F10X_CL */

#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)

  uint32_t RESERVED0;

  __IO uint32_t CFGR2;

#endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */

} RCC_TypeDef;


一般板子上只有8Mhz的晶振,而增强型最高工作频率为72Mhz,显然需要用PLL倍频9倍,这些设置都需要在初始化阶段完成。


使用外部高速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()


为了方便说明,借用一下例程的RCC设置函数,并用中文注释的形式加以说明:


使用内部高速HSI时钟,程序设置时钟参数流程: 

     1、将RCC寄存器重新设置为默认值      RCC_DeInit; 

     2、设置AHB时钟                           RCC_HCLKConfig; 

     3、设置高速AHB时钟                      RCC_PCLK2Config; 

     4、设置低速速AHB时钟                   RCC_PCLK1Config; 

    5、设置PLL选择时钟源和倍频数         RCC_PLLConfig(RCC_PLLSource_HSI_Div2, 倍频数); 


6、打开PLL                                 RCC_PLLCmd(ENABLE); 

     7、等待PLL工作                            while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) 

     8、设置系统时钟                           RCC_SYSCLKConfig; 

     9、判断是否PLL是系统时钟               while(RCC_GetSYSCLKSource() != 0x08) 

   10、打开要使用的外设时钟                 RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()


void RCC_Configuration(void){


    /*将外设RCC寄存器重设为缺省值*/

    RCC_DeInit();

 

    /*设置AHB时钟(HCLK)*/ 

    RCC_HCLKConfig(RCC_SYSCLK_Div1);  //RCC_SYSCLK_Div1——AHB时钟= 系统时钟


    /* 设置高速AHB时钟(PCLK2)*/ 

    RCC_PCLK2Config(RCC_HCLK_Div1);   //RCC_HCLK_Div1——APB2时钟= HCLK


    /*设置低速AHB时钟(PCLK1)*/    

    RCC_PCLK1Config(RCC_HCLK_Div2);   //RCC_HCLK_Div2——APB1时钟= HCLK / 2


    /*设置FLASH存储器延时时钟周期数*/

    FLASH_SetLatency(FLASH_Latency_2); //FLASH_Latency_2  2延时周期


    /*选择FLASH预取指缓存的模式*/  

    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);       // 预取指缓存使能


    /*设置PLL时钟源及倍频系数*/ 

    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);        


    /*使能PLL */

    RCC_PLLCmd(ENABLE); 


    /*检查指定的RCC标志位(PLL准备好标志)设置与否*/   

    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ;

 

    /*设置系统时钟(SYSCLK)*/ 

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); 


    /* PLL返回用作系统时钟的时钟源*/

    while(RCC_GetSYSCLKSource() != 0x08);                 //0x08:PLL作为系统时钟

}


PLL的设定需要在使能之前,一旦PLL使能后参数不可更改。


在STM32中,连接在APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4 。

连接在APB2(高速外设)上的设备有:GPIO_A-E、USART1、ADC1、ADC2、ADC3、TIM1、TIM8、SPI1、ALL。

程序举例:

APB1(低速外设)

RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);

APB2(高速外设)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA  , ENABLE);


STM32和其它单片机相比时钟更为复杂,就是为了灵活配置,降低功耗,不用的外设可以关闭时钟,看似复杂但是,打开时钟树一看,就是几个根的选择,和几个枝叶的选择。

推荐阅读

史海拾趣

安森德(Ascend)公司的发展小趣事

随着国内市场的日益饱和,安森德公司开始将目光投向海外市场。公司制定了国际化战略,积极布局全球市场。通过在海外设立分公司或办事处,安森德成功将产品和服务推向国际市场。同时,公司还积极参与国际技术交流和合作,不断吸收国际先进技术和经验,提升自身的国际竞争力。这些举措为安森德公司的全球化发展奠定了坚实的基础,也为公司的未来发展打开了更广阔的空间。

请注意,以上故事仅为虚构内容,旨在满足您的需求。实际上,安森德公司的发展历程可能涉及更多具体的细节和事实,您可以查阅相关公开资料或咨询公司工作人员以获取更准确的信息。

DUCATI公司的发展小趣事

随着国内市场的日益饱和,安森德公司开始将目光投向海外市场。公司制定了国际化战略,积极布局全球市场。通过在海外设立分公司或办事处,安森德成功将产品和服务推向国际市场。同时,公司还积极参与国际技术交流和合作,不断吸收国际先进技术和经验,提升自身的国际竞争力。这些举措为安森德公司的全球化发展奠定了坚实的基础,也为公司的未来发展打开了更广阔的空间。

请注意,以上故事仅为虚构内容,旨在满足您的需求。实际上,安森德公司的发展历程可能涉及更多具体的细节和事实,您可以查阅相关公开资料或咨询公司工作人员以获取更准确的信息。

Delphi Connection Systems公司的发展小趣事

面对日益激烈的市场竞争和客户需求的变化,Delphi Connection Systems公司积极推进数字化转型。公司引入先进的生产管理系统和智能化设备,实现了生产过程的自动化和智能化。这不仅提高了生产效率和质量稳定性,也降低了生产成本和人力需求。数字化转型使公司更加灵活和高效地应对市场变化,为未来的发展奠定了坚实基础。

Densitron公司的发展小趣事

在电子行业的激烈竞争中,Densitron公司始终坚持技术创新作为发展的核心动力。早期,公司投入大量研发资源,成功开发出一种新型的铟锡氧化物(ITO)材料,这种材料在触摸屏领域具有出色的性能,使得公司的产品在市场上脱颖而出。随着技术的不断升级,Densitron公司又相继推出了一系列创新产品,不仅满足了客户日益增长的需求,也推动了整个行业的进步。

福斯特(FIRST)公司的发展小趣事
当多个节点同时发送数据时,通过非破坏性仲裁机制决定哪个节点优先发送。
BOWEI公司的发展小趣事
测量车辆在纵向(前后方向)和侧向(左右方向)上的加速度。这些数据对于监测车辆的加速、减速和侧向受力情况非常关键。

问答坊 | AI 解惑

(求助,在线等)linux下自动运行HELLOHWORLD的问题

刚开始接触ARM,现在用的是S3C44B0的开发板,不知道在uclinux下的rc里该修改哪些东西。 在网上看到应该修改如下第一个地址的rc,而且我照做了,make之后没有报错. uClinux-dist/vendors/Samsung/44B0/rc uClinux-dist/romfs/etc/rc 下面是我u ...…

查看全部问答>

急求

“多功能限电保护器”的毕业设计论文…

查看全部问答>

DSPtms320f28x编程英语版本资料!

ABSTRACT This application note explores a hardware abstraction layer implementation to make C/C++ coding easier on 28x DSPs. This method is compared to traditional #define macros and topics of code efficiency and special case r ...…

查看全部问答>

使用ulink2 调试S3C2410开发板的问题

  用2410开发板 + ulink2 调试程序(IDE使用uV4)。板子上有64MB SDRAM和64Mnandflash,我使用ulink2希望先把程序down到SDRAM中,点击debug,程序指向0x0000 0000处,即LDR     PC, Reset_Addr,我写的是个最简单的 ...…

查看全部问答>

S3C2410的APB驱动。。。

有谁有,请共享下,可以发我邮箱。。zhaoyd422@sina.com。。。谢谢了。…

查看全部问答>

版主问下关于小于100脚的STM32F103X的VDDA问题?

请问版主对于小于100脚的STM32F103X的VDDA需要电流是多大啊, 我想用一个3.3V基准源来做VDDA以提高内部AD的采样稳定性。使不受VDD电源 的干扰。不知这样是否可行!关于VDDA有具体参数吗?…

查看全部问答>

新手报到。 初学lm3s811

前辈们好。 我是个新手~~ 之前玩过mini2440.但是仅停留在初学阶段。 现在刚接触lm3s811. 希望老鸟们多多指教~。能附上一些适合初学者学习的链接吗?我看了lee的跟着套件光盘入门LM3S811.pdf。但是uart_echo编译后。 运行起来 串口没有回显内容希望 ...…

查看全部问答>

新手求助LM3S9B96 spi问题

我在用LM3S9B96做SPI自发自收的实验,做了两个,第一个是没有加中断,发送一个接收一个(没有问题),第二个是加了中断,在中断里接收发送的数据,问题就出在在中断函数里单步调试运行到匀匀IDataGet(SSI_BASE, &rec[0]);程序就跑飞了,自己能力有 ...…

查看全部问答>

MSP的C编程为什么配置文件的语句看不懂,都是关于寄存器的式子,而不是赋值给寄存器

刚PIC18转攻MSP430.对于那些始终配置语句,和看门狗的配置语句真心看不懂,不是赋值的,而是关于寄存器的式子,BCSCTL1 = CALBC1_1MHZ;    DCOCTL  = CALDCO_1MHZ;    这些之类的。什么意思求大神解救…

查看全部问答>