STM32系统时钟配置

发布者:和谐相处最新更新时间:2024-10-09 来源: cnblogs关键字:STM32  系统时钟  配置 手机看文章 扫描二维码
随时随地手机看文章

STM32的SYSCLK(系统时钟)可由三种不同的时钟源来驱动,分别是HSI振荡器时钟、HSE振荡器时钟、PLL时钟。这些设备还拥有2种二级时钟源:

1、低速内部RC(LSI RC)振荡器,频率在30~60KHZ之间变化,为了方便计算我们一般估算为40KHZ,它主要为独立看门狗提供时钟源,或通过相关寄存器配置驱动RTC(RTCCLK),用于从停机/待机模式下自动唤醒系统。

2、使用32.768KHZ的低速外部晶体时钟来驱动RTC(RTCCLK)。 

为减小功耗,STM32的任一时钟源都可以独立地开启或关闭。

注意:1、当HSI(高速内部时钟)作为PLL时钟输入时,SYSCLK得到的最大频率为36MHZ(有些写的是64MHZ)。SDIO接口的时钟频率固定为HCLK/2。

2、AHB、高速APB(APB2)域的最大频率是72MHZ; 低速APB(APB1)域的最大频率是36MHZ,所以在配置由APB1提供时钟的外设时要特别留意。 

3、RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SYSTick)的外部 时钟,当然SYSTICK的时钟也可通过相关寄存器来获得。

4、ADC时钟由高速APB2时钟经2、4、6、8分频后获得。


定时器在STM32中起着举足轻重的地位,学不好定时器就相当于没有学过STM32单片机。所以定时器的频率设置就显得尤为重要,其频率分频由硬件按以下2种情况自动设置:

1、如果相应的APB预分频系数是1,定时器的时钟频率与所在APB总线频率一致。

2、否则,定时器的时钟频率被设为与其相连的APB总线频率的2倍。

例:若AHB的时钟为72MHZ,因为APB1的时钟最大只能为36MHZ,所以APB1的预分频值不能为1,假设为2,则APB1=36MHZ时钟,则定时器2~7的时钟就为72MHZ。
以上介绍时钟主要来自系统时钟SYSCLK,其它请参考STM32官方参考手册。

高速外部时钟(HSE)

时钟来源:HSE外部时钟:它由 外部提供时钟(50%占空比的方波、正弦波、三角波)连接到输入端,同时要保证OSC_OUT端口悬空,输入最高频率50MHZ。

HSE外部晶体/陶瓷谐振器:3~25MHZ外部振荡器为系统提供精确的主时钟,在电路设计时为了减少时钟输出的失真和缩短启动稳定时间,晶振和负载电容必须尽可能的靠近振荡器引脚,连接线路时不要打过孔,最好进行包地处理。负载电容值必须根据所选的振荡器来调整。


晶振的负载电容=[(c1*c2)/(c1+c2)]+(4~6)pf的杂散电容;c1,c2为旁路电容


高速内部时钟(HSI)

HSI时钟信号由内部8MHZ的RC震荡器产生,可直接作为系统时钟或2分频后作为PLL输入。在外部无时钟或HSE失效时,HSI时钟会作为备用时钟源自动切换,但时钟精度稍差。


低速外部时钟(LSE)

由一个外部的32.768khz低速晶体或陶瓷谐振器提供,主要为实时时钟或其他定时器功能提供一个低功耗且精确的时钟源。


低速内部时钟(LSI)

它可以在停机和待机模式下保持运行,为独立看门狗和自动唤醒单元提供时钟,时钟频率在(30KHZ和60KHZ之间)。


时钟初始化过程:

1、设置时钟配置为初始值

2、开启外部时钟,等待外部时钟配置是否成功;

成功:设置PLL输入时钟

失败:开启内部时钟

3、配置AHB、APB2、APB1、HCLK、PCLK2、PCLK1等

4、使能PLL时钟,如果PLL作为了SYSCLK,它将不能被失能

5、等待PLL时钟是否就绪。

6、将PLL作为系统时钟,等待就绪。

7、开启外设时钟

8、设置优先级分组

这里采用V3.5库函数版本,MDK4.7;STM32F103ZET6


  1. s32 STM32_CLOCK_Init(void)

  2. {

  3.     u32 Err=STM_ERR;


  4.     ErrorStatus HSEStartUpStatus;

  5.     u32 i=0;

  6.     /* Deinitialize the RCC registers */

  7.     RCC_DeInit();

  8.     //打开外部时钟,失败则选内部时钟

  9.     /* Enable the HSE */

  10.     RCC_HSEConfig(RCC_HSE_ON);

  11.     /* Wait till HSE is ready and if Time out is reached exit */

  12.     HSEStartUpStatus = RCC_WaitForHSEStartUp();

  13.     if(HSEStartUpStatus == SUCCESS)

  14.     {

  15.         //PLLCLK=16MHZ*2=32MHZ

  16.         RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_2);

  17.         Err=STM_TRUE;

  18.     }

  19.     else

  20.     {

  21.         /* Enable Internal High Speed oscillator */

  22.         RCC_HSICmd(ENABLE);    

  23.         //PLLCLK=8MHZ/2*8=32MHZ

  24.         RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_8);

  25.         Err=0x60000001;    

  26.     }

  27.     /* Configure HCLK such as HCLK = SYSCLK */

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

  29.     /* Configure PCLK2 such as PCLK2 = HCLK */

  30.     RCC_PCLK2Config(RCC_HCLK_Div1);//APB2==HCLK

  31.     /* Configure PCLK1 such as PCLK1 = HCLK/2 */

  32.     RCC_PCLK1Config(RCC_HCLK_Div2);//APB1==HCLK/2


  33.     /* Configure the Latency cycle: Set 2 Latency cycles */

  34.     FLASH_SetLatency(FLASH_Latency_2);//存储器取值延时2个周期

  35.     /* Enable The Prefetch Buffer */

  36.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);


  37.     /* Enable the PLL */

  38.     RCC_PLLCmd(ENABLE);

  39.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)

  40.     {

  41.         i++;

  42.         if(0xffff<=i)

  43.         {

  44.             Err=0x60000002;

  45.             break;

  46.         }

  47.     }

  48.     /* Select the PLL as system clock source */

  49.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  50.     i=0;

  51.     while(RCC_GetSYSCLKSource()!=0x08)

  52.     {

  53.         i++;

  54.         if(0xffff<=i)

  55.         {

  56.             Err=0x60000003;

  57.             break;

  58.         }

  59.     }

  60.     RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

  61.     /* Configure the Priority Grouping with 1 bit */

  62.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

  63.     return Err;

  64. }


在库函数V3.5以后,在不配置系统时钟的情况下,默认为72MHZ。从startup_stm32f10x_hd.s中可以看出:


  1. ; Reset handler

  2. Reset_Handler PROC

  3.                 EXPORT Reset_Handler [WEAK]

  4.                 IMPORT __main

  5.                 IMPORT SystemInit

  6.                 LDR R0, =SystemInit

  7.                 BLX R0

  8.                 LDR R0, =__main

  9.                 BX R0

  10.                 ENDP


在复位产生之后,系统首先运行SystemInit(),然后在执行main函数。而在system_stm32f10x.c中默认外部时钟为8M,设置为72MHZ,但在实际中如果我们使用大于8MHZ的外部时钟时,系统时钟依旧为72MHZ。如果想


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

  2. /* #define SYSCLK_FREQ_HSE HSE_VALUE */

  3.  #define SYSCLK_FREQ_24MHz 24000000

  4. #else

  5. /* #define SYSCLK_FREQ_HSE HSE_VALUE */

  6. /* #define SYSCLK_FREQ_24MHz 24000000 */

  7. /* #define SYSCLK_FREQ_36MHz 36000000 */

  8. /* #define SYSCLK_FREQ_48MHz 48000000 */

  9. /* #define SYSCLK_FREQ_56MHz 56000000 */

  10. #define SYSCLK_FREQ_72MHz 72000000

  11. #endif


关键字:STM32  系统时钟  配置 引用地址:STM32系统时钟配置

上一篇:cJson移植到STM32系统
下一篇:STM32时钟问题(重点)

推荐阅读最新更新时间:2024-11-10 10:28

STM32入门学习笔记之MPU6050传感器解析实验4
(2)创建mpu6050.c文件,输入以下代码。 /********************************************************************************************************* MUP6050 驱 动 程 序 *********************************************************************************************************/ #include mpu6050.h #include delay.h /***********
[单片机]
STM32基于库函数工程模板
#下载stm32官方(标准库/HAL库)下载链接 http://www.openedv.com/thread-295843-1-1.html ##文件夹介绍: Libraries文件夹下面有CMSIS和STM32F4XX_StdPeriph_Driver两个目录,这两个目录包含固件库核心的所有子文件夹和文件。 1.CMSIS文件夹存放的是符合CMSIS规范的一些文件。包括STM32F4核内外设访问层代码。DSP库,RTOS API,以及STM32F4片上外设访问层代码等。 2.STM32F4XX_StdPeriph_Driver放的是标准外设库源码文件和对应的头文件。inc目录存放的是stm32f4xx_ppp.h头文件,无
[单片机]
<font color='red'>STM32</font>基于库函数工程模板
基于Linux的kfifo移植到STM32(支持os的互斥访问)
关于kfifo kfifo是内核里面的一个First In First Out数据结构,它采用环形循环队列的数据结构来实现;它提供一个无边界的字节流服务,最重要的一点是,它使用并行无锁编程技术,即当它用于只有一个入队线程和一个出队线程的场情时,两个线程可以并发操作,而不需要任何加锁行为,就可以保证kfifo的线程安全。 具体什么是环形缓冲区,请看我以前的文章 说明 关于kfifo的相关概念我不会介绍,有兴趣可以看他的相关文档,我只将其实现过程移植重写,移植到适用stm32开发板上,并且按照我个人习惯重新命名,RingBuff- 意为环形缓冲区 RingBuff_t 环形缓冲区的结构体成员变量,具体含义看注释。 buff
[单片机]
STM32里的串口通信
在STM32里,串口通信是USART,STM32可以通过串口和其他设备进行传输并行数据,是全双工,异步时钟控制,设备之间是点对点的传输。 对应的STM32引脚分别是RX和TX端。STM32的串口资源有USART1、USART2、USART3. 串口的几个重要的参数: 波特率,串口通信的速率 空闲,一般为高电平 起始位,标志一个数据帧的开始,固定为低电平。当数据开始发送时,产生一个下降沿。(空闲–》起始位) 数据位,发送数据帧,1为高电平,0为低电平。低位先行。 比如 发送数据帧0x0F 在数据帧里就是低位线性 即 1111 0000 校验位,用于数据验证,根据数据位的计算得来。有奇校验,偶校验和无校验。 停止位,用于数据的间隔
[单片机]
<font color='red'>STM32</font>里的串口通信
点亮STM32、FPGA和Liunx板子的LED灯
摘要:你点亮过多少板子的LED灯呢?有很多小伙伴要求讲一下STM32、FPGA、Liunx三者之间有什么不同。其实不同点很多,口说无凭,今天就来点亮一下STM32、FPGA和Liunx板子的LED灯! 大家大致看一下点灯流程、点灯环境和点灯流程,就能大概的了解一下三者的区别,从而可以有选择的去学习 一、使用STM32点亮LED灯 STM32从字面上来理解ST是意法半导体,M是Microelectronics的缩写,32 表示32位,合起来理解,STM32就是指ST公司开发的32位微控制器。在如今的32 位控制器当中,STM32可以说是最璀璨的新星,它受宠若娇,大受工程师和市场的青睐,无芯能出其右。首先使用STM32电亮一个
[单片机]
点亮<font color='red'>STM32</font>、FPGA和Liunx板子的LED灯
基于STM32中串口通信的实例分析
串口是串行接口(serial port)的简称,也称为串行通信接口或COM接口。串口通信是指采用串行通信协议(serial communication)在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式。串口按电气标准及协议来划分,包括RS-232-C、RS-422、RS485等。 在串行通信中,数据在1位宽的单条线路上进行传输,一个字节的数据要分为8次,由低位到高位按顺序一位一位的进行传送。串行通信的数据是逐位传输的,发送方发送的每一位都具有固定的时间间隔,这就要求接收方也要按照发送方同样的时间间隔来接收每一位。不仅如此,接收方还必须能够确定一个信息组的开始和结束。 常用的两种基本串行通信方式包括同步通信和异步通信
[单片机]
基于<font color='red'>STM32</font>中串口通信的实例分析
STM32F103C8T6最小系统地的构建(3)_时钟源电路-晶振
最小系统板要有处理器这是肯定的,既然我标题都是STM32F103C8T6的最小系统,那处理器就是C8T6了,电路图上,加一块芯片原理图,如此简单的操作就不做过多描述了。 系统是需要有时钟,这样,你的系统跑起来会稳定有序。STM32内部自身就有三个时钟源,这个看过32手册时钟树的都会有一定的了解,在32芯片的时钟树中需要有五个时钟源,我们需要布置的便是外部高速时钟和外部低速时钟。 我们讲硬件电路布置,32时钟树的的时钟讲解你们可以参考其他人的一些讲解性文章。硬件上需要了解的知识有两个,外部时钟源怎么和MCU相连,外部时钟源给多大? 这个都不是什么非常难找的,网上资料还是有很多的,查阅资料: 高速外部时钟,可接石英/陶
[单片机]
STM32F103C8T6最小<font color='red'>系统</font>地的构建(3)_<font color='red'>时钟</font>源电路-晶振
STM32单片机PWM输出测试
环境: 主机:XP 开发环境:MDK4.23 MCU:STM32F103CBT6 说明: 使用内部8M晶振,倍频到64M供给TIM3定时器,PA6(通道1)上产生640K,50%方波 源代码: 初始化时钟: //初始化RCC时钟 void init_rcc(void) { //将外设 RCC寄存器重设为缺省值 RCC_DeInit(); //内部晶振使能 RCC_HSICmd(ENABLE); //等待工作稳定 while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET); //LSI的启动,提供给看门狗时
[单片机]
<font color='red'>STM32</font>单片机PWM输出测试
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved