STM32的时钟简介和配置方法

发布者:见贤思奇异果最新更新时间:2018-08-13 来源: eefocus关键字:STM32  时钟  配置方法 手机看文章 扫描二维码
随时随地手机看文章

STM32中使用任何一个外设都必须打开相应的时钟。在STM32中有5个时钟源可供用户选择:

1.HSI高速内部时钟,RC震荡器,频率为8MHz。

2.HSE高速外部时钟,右英/陶瓷谐振器,或着外部时钟源,4MHz-16MHz.

3.LSI内部低速时钟,RC震荡器频率为40Hz。

4.LSE外部低速时钟,接频率为32.768KHz的石英晶体。

5.PLL锁相环频输出,时钟源可选为HIS/2、HSE或HSE/2。倍频可选2-16倍,但其输出频率最大不能超过72MHz。

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

1.送给AHB总线、内核、内存、DMA使用的HCLK时钟。

2.通过8分频送给系统定时器的定时时钟(嘀嗒定时器)。

3.直接送给Cortex的空闲时钟PCLK。

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

5.送给APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72M)另一路送给定时器(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口。


涉及的寄存器:
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;         //DMA,SDIO等时钟使能
vu32 APB2ENR;       //APB2线上外设时钟使能
vu32 APB1ENR;      //APB1线上外设时钟使能
vu32 BDCR;           //备份域控制寄存器
vu32 CSR;            
} RCC_TypeDef;


在ST公司的外设固件库的示例里,对于工程项目文件,ST并没有在启动函数main()里初始化PLL,因为其已经在硬件初始化阶段完成对系统时钟的配置。这样也就带了一个问题,ST库里的均使用了外设8MHz的晶振,而我们平时的项目就一定采用的是这个频率,实际配置的低于8MHz,MCU不能全速运行,高于8MHz,外设时钟即配置失败,甚至无法运行。那么如何重新配置时钟就需要我们重新设计了。


以下为使用库函数重新编写了STM32F系统时钟PLL初始化过程:

以下的函数需要添加#include "stm32f10x.h"的头文件来调用ST固件库。
static void SysClockInit(void)
{
RCC_DeInit();/* RCC重置 */
RCC_HSEConfig(RCC_HSE_ON); /*(使能HSE)*/
HSEStartUpStatus = RCC_WaitForHSEStartUp();/*(等待HSE使能结束)*/
if (HSEStartUpStatus == SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1); /* 配置HCLK = SYSCLK */
RCC_PCLK2Config(RCC_HCLK_Div1); /* 配置PCLK2 = HCLK */
RCC_PCLK1Config(RCC_HCLK_Div2); /* 配置PCLK1 = HCLK/2 */
/* 超级重要的、需要配置的地方在这里 */
/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* RCC_PLLSource_HSE_Div1为外置晶振的分频系数;RCC_PLLMul_9为倍频数 */
RCC_PLLCmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* 选定PLL为系统主时钟 */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
else
{ /* 配置失败将程序停留在这里 */
while (1)
{
}
}
}


关键字:STM32  时钟  配置方法 引用地址:STM32的时钟简介和配置方法

上一篇:STM32获取当前系统时钟
下一篇:如何确认STM32时钟配置是否正确

推荐阅读最新更新时间:2024-03-16 16:10

stm32学习之五
按键输入的学习(key_polling): 目标:通过按键的输入,实现LED灯的反转等操作。 要实现按键的输入的读取,必须要实现一个key.c和key.h的文件的编写,这里,利用库函数的编写原则(仿照 库函数的编写方法),获取按键的动作。 首先,编写key.h函数: #ifndef _KEY_H #define _KEY_H #include stm32f10x.h #define KEY_ON 0 #define KEY_OFF 1 void key_Init(void); uint8_t key_Scan( GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin ); void de
[单片机]
U-Boot在FL2440上移植(一)----修改系统时钟
一 U-boot源码结构 图片来自韦东山的《嵌入式linux应用开发完全手册》 U-boot下载地址: ftp://ftp.denx.de/pub/u-boot/ 交叉编译工具链 3.3.2 二 U-boot移植 1.新建一个fl2440开发板目录和文件 ①在board目录下新建fl2440目录,讲smdk2410目录下的文件复制到fl2440目录下,并将board/fl2440/smdk2410.c重命名为fl2440.c ②修改u-boot-1.1.6目录下Makefile文件 smdk2410_config : unconfig @$(MKCONFIG) $(@:_config
[单片机]
U-Boot在FL2440上移植(一)----修改系统<font color='red'>时钟</font>
SST25VF080B SPI接口FLASH STM32驱动
所有的FLASHA 都一样只能从1变0,要想从0变1 只有擦除一个页扇, SST25VF080B 最小可以擦除4KB的页 速度也不错 50MHz 容量1MB 挺够用的 10万次的擦写寿命。最低2.7V 就可正常工作。 Flexible Erase Capability Uniform 4 KByte sectors Uniform 32 KByte overlay blocks Uniform 64 KByte overlay blocks 先记下 这些个7788的命令 SST25VF080B 的各种命令比较繁琐 Status Register这个设置写保护多点 我这里只用它的判忙BUSY 一样先配
[单片机]
SST25VF080B SPI接口FLASH <font color='red'>STM32</font>驱动
STM32独立看门狗:你看狗都独立了
STM32--软看门口--不需要任何硬件支持--它在IC里面已经集成了。(算是独立看门狗的误解吧) 一个倒计数,减减减减减减,减到0就会触发一个系统复位信号也就是单片机重启了。 喂狗呢?就是隔一段时间就给这个倒计数重现装载数据,保持它不要到0. 头文件: #ifndef _WDG_H_ #define _WDG_H_ void watch_dog_init(void); void feed_dog(void); #endif 实现: #include stm32f10x_iwdg.h #include wdg.h void watch_dog_init(void) { IWDG_WriteAc
[单片机]
飞思卡尔单片机PLL时钟总线模块
要设定PWM模块首先要确定片内总线时钟,MC9S12XS系列单片机增加了时钟产生器模块,锁定内部频率更高的压控振荡器VCO频率,作为系统时钟,单片机的内部时钟可达80MHz,片内总线时钟可达40MHz。 先给出一段例程 Code: REFDV=0x07; //REFDIV=7 SYNR=0x53; //SYNDIV=19 while(LOCK!=1); //等待VCO稳定 POSTDIV=0; //POSTDIV=0,VCO时钟=80MHz CLKSEL_PLLSEL=1; //选择由Fpll产生总线时钟,Fbus=Fpll/2=40MHz 注:LOC
[单片机]
基础概念之单片机的时钟周期和机器周期概念
1.什么是51单片机的时钟周期? 科普中国:时钟周期,又称为震荡周期,是为单片机提供定时信号的震荡源的周期,是单片机最基本的时间单位。谈到时钟周期就必须说晶体振荡器即即晶振,晶振可以说是单片机的心脏,它为单片机提供一个时钟频率 fosc(震荡频率)。 而所谓的震荡频率(时钟频率)自然是晶振一秒钟震荡的次数。时钟频率越高,单片机运行速度越快,就如电脑的CPU什么可以加速到多少GHz一样。自然时钟周期Tosc=1/fosc. 例如 震荡频率为12MHz的单片机即 fosc = 12MHz,那么震荡周期 Tosc = 1/fosc= 1/12 us。 chen:说白了晶振的倒数就是时钟周期。 2.什么是51单片机的机器周期?
[单片机]
STM32 ADC 多通道16路电压采集
下面介绍一种利用STM32单片机制作的16路多通道ADC采集电路图和源程序。采用USB接口与电脑连接,实则USB转串口方式,所以上位机可以用串口作为接口。电路图中利用LM324作为电压跟随器,起到保护单片机引脚的作用。直接在电脑USB取点,省去外接电源麻烦,实测耗电电流不到20ma. 1.主控电路图: 2. USB转串口电路图 3.LM324电压跟随器电路图 4. 滤波电路 图 5.16路接口电路图 6.电源电路图 7.16路ADC初始化程序: void Adc_Init(void) { //先初始化IO口 RCC- APB2ENR|=0X7 2; //使能PORTAPORABPORT
[单片机]
<font color='red'>STM32</font> ADC 多通道16路电压采集
带有铁电随机存取存储器的高精度实时时钟的优势
1 概述 随着DS32X35系列产品的发布,Dallas Semi-conductor公司提供了无需电池的非易失存储器。这些器件采用铁电随机存取存储器(FRAM)技术,FRAM是非易失存储器,其读/写操作与RAM类似。该系列器件能够可靠地将数据保持10年之久,与EEPROM和其他非易失存储器不同的是:它不需要考虑系统复杂性、过度开销以及可靠性等问题。从1992年出现第一块FRAM至今,铁电随机存取存储技术已趋于成熟。 2 非易失存储器 目前,非易失存储技术主要有3种:电池备份的SRAM、EEPROM和闪存。FRAM的速度类似于传统SRAM;FRAM的操作类似于串行EEPROM,主要区别是FRAM具有更好的写操作特性和耐用性,
[缓冲存储]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved