STM32系统时钟和延迟函数初始化

发布者:Quail最新更新时间:2024-09-13 来源: elecfans关键字:STM32  系统时钟  延迟函数  初始化 手机看文章 扫描二维码
随时随地手机看文章

STM32有三种不同的时钟源可被用来驱动系统时钟(SYSCLK): 

 1:HSI振荡器时钟(内部时钟)

2:HSE振荡器时钟 (外部时钟,即晶振所提供)

 3:PLL时钟(锁相环时钟)

 这些设备有以下2种二级时钟源: 

 (1)40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC。RTC用于从停机/待机模式下自动唤醒系统。 

 (2)32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)。 

 当不被使用时,任一个时钟源都可被独立地启动或关闭,由此优化系统功

下面是以外部晶振8M,系统时钟72M为例。

STM32系统时钟初始化流程如下:
1、复位并配置向量表;
2、使能外部高速中断HSEON,并等待就绪;
3、RCC->CFGR=0X00000400;设置APB1,如先把前面的设置好之后,再来设置APB1就已经来不及了,所以必须先二分频,因为要求APB1不超过36MHz,前面最大为72MHz,故二分频即可;
4、RCC->CFGR|=PLL<<18;设置锁相环放大倍数,及时钟树的PLLMUL;
5、RCC->CFGR|=1<<16;  选择HSE作    为PLL输入;
6、FLASH->ACR|=0x32;   FLASH 2个延迟周期
7、RCC->CR|=0x01000000; 使能PLL,并等待就绪;
8、RCC->CFGR|=0x00000002;设置PLL作为系统时钟,并等待就绪。

时钟树如下:大致流程如时钟树里面的顺序标号




STM32系统时钟初始化代码如下:
void Stm32_Clock_Init(u8 PLL)
{
unsigned char temp=0;   
MYRCC_DeInit();  //复位并配置向量表
  RCC->CR|=0x00010000;  //外部高速时钟使能
while(!(RCC->CR>>17));//等待外部时钟就绪
RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;  //二分频
PLL-=2;//抵消两个单位,具体看STM32中文参考手册
RCC->CFGR|=PLL<<18;   //设置PLL的值,2~16
RCC->CFGR|=1<<16;  //PLLSRC ON 
FLASH->ACR|=0x32;  //FLASH 2个延迟周期


RCC->CR|=0x01000000;  //PLLON
while(!(RCC->CR>>25));//等待PLL锁定
RCC->CFGR|=0x00000002;//PLL作为系统时钟
while(temp!=0x02)     //等待PLL作为系统时钟设置成功
{   
temp=RCC->CFGR>>2;   //不断的查询寄存器看系统时钟是否设置成功
temp&=0x03;
}    
}


在跑裸机程序时,利用芯片提供的滴答定时器SysTick来进行延迟,是一种比较准确的延迟

Systick :系统心跳定时器,提供系统节拍,裸机程序中可作为独立的延时定时器
它有四个寄存器
STK_CSR, 0xE000E010 -- 控制寄存器 
STK_LOAD, 0xE000E014 -- 重载寄存器 
STK_VAL, 0xE000E018 -- 当前值寄存器 
STK_CALRB, 0xE000E01C -- 校准值寄存器


延时编程原理
systick定时器是24位的递减计数器,设定初值并使能它后,它会每个系统时钟周期计数器减1,
计数到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息.

延时编程步骤
1.计算出产生1us 需要多少个时钟周期 fac_us;
2.计算出RELOAD寄存器的值
也就是产生相应延时所需要的时钟周期数
RELOAD=fac_us * nus
3.开启计数
4.循环检测计数到0的标志位;
5.清空计数器,关闭定时器

寄存器版代码注解(可以看上面的时钟树也能够看出来)
使用外部8M时钟,锁相环里出来的频率是72M,AHB预分频后是72M,
systick固定HCLK时钟的1/8,即9M,那么延时1us是9个时钟

代码如下:

  1. void delay_init(u8 SYSCLK)  //系统时钟是72MHz,SYSCLK=72  

  2. {  

  3.     SysTick->CTRL &= 0xfffffffb ; //bit2清0,也就是配置选择外部时钟  

  4.     fac_us=SYSCLK/8; //硬件8分频,fac_us得出的值是要给下面的时钟函数用的  

  5.     fac_ms =(u16)fac_us*1000;  

  6.       

  7. }  

  8.   

  9. void delay_us(u32 nus)  //nus假如为10us  

  10. {  

  11.     u32 temp;  

  12.     SysTick->LOAD = nus*fac_us;  //延时10us的话就是  10*9=90,装到load寄存器中  

  13.     SysTick->VAL=0x00;//计数器清0,因为currrent字段被手动清零时,load将自动重装到VAL中  

  14.     SysTick->CTRL = 0x01;//配置使异常生效,也就是计数器倒数到0时将发出异常通知  

  15.     do  

  16.     {  

  17.        temp = SysTick->CTRL;  //时间到了之后,该位将被硬件置1,但被查询后自动清0  

  18.     }  

  19.     while(temp & 0x01 && !(tmep &(1<<16))); //查询  

  20.     SysTick->CTRL = 0x00;  //关闭计数器  

  21.     SysTick->VAL = 0x00;   //清空val  

  22. }  



还有一个注意点:
LOAD寄存器是24位的 最大值0xffffff
那么延时最大值计算公式为
nms<=0xffffff*8*1000/SYSCLK (SYSCLK单位Hz)
则nms的最大值为1864.135ms ,即1864毫秒


关键字:STM32  系统时钟  延迟函数  初始化 引用地址:STM32系统时钟和延迟函数初始化

上一篇:STM32的icf文件有什么作用
下一篇:基于STM32时钟系统的开发及配置

推荐阅读最新更新时间:2026-03-18 09:05

STM32系统时钟初始化程序设计
正如之前文章所述,在使用外设功能时,都必须提前对其精心初始化才能使用其功能。 以下是系统定时器初始化的程序清单。 #include stm32f10x_lib.h unsigned char sys_nub;//系统定时器中断计数变量 //SysTick 设置 void Systick_Config(void) { //失能SysTick定时器 SysTick_CounterCmd(SysTick_Counter_Disable); //失能SysTick中断 SysTick_ITConfig(DISABLE); //设置SysTick时钟源 SysTick_ClockSourceConfig(SysTick_Source_HC
[单片机]
STM32 SysTick定时器和delay延迟函数
一,什么是Systick定时器   Systick定时器也叫滴答定时器,是内核级别的24位倒计数简单定时器,常用做延迟和系统心跳时钟(如:UCOS)   优点:节省MCU资源,不需要浪费一个定时器,只要不清除Systick使能位,就不会停止,即使在睡眠模式下也能工作   捆绑在NVIC中断优先级管理,能产生Systick异常(中断),可设置中断优先级 二,Systick相关寄存器   CTRL: Systick控制和状态寄存器   LOAD: Systick重装载寄存器   VAL: Systick当前值寄存器   CALIB: Systick校准值寄存器   定时器工作方式:   每经过一个Systick时钟周期,VAL寄存
[单片机]
<font color='red'>STM32</font> SysTick定时器和delay<font color='red'>延迟</font><font color='red'>函数</font>
SysTick定时器和delay延迟函数
一,什么是Systick定时器   Systick定时器也叫滴答定时器,是内核级别的24位倒计数简单定时器,常用做延迟和系统心跳时钟(如:UCOS)   优点:节省MCU资源,不需要浪费一个定时器,只要不清除Systick使能位,就不会停止,即使在睡眠模式下也能工作   捆绑在NVIC中断优先级管理,能产生Systick异常(中断),可设置中断优先级 二,Systick相关寄存器   CTRL: Systick控制和状态寄存器   LOAD: Systick重装载寄存器   VAL: Systick当前值寄存器   CALIB: Systick校准值寄存器   定时器工作方式:   每经过一个Systic
[单片机]
STM32时钟系统及配置方法
什么是时钟 单片机如果要正常运行,时钟信号是必不可少的。作为CPU的脉搏,时钟的快慢决定了CPU的运行速率,执行指令的速度。一般时钟源会被分频器或倍频器分成多种频率的时钟,以满足系统的不同应用。 那么时钟信号是怎么产生的呢? 晶振 在石英晶体上按一定方位切下薄片,将薄片两端抛光并涂上导电的银层,再从银层上接出两个电极并封装起来的元件叫石英晶体谐振器,简称石英晶体。采用石英晶体的振荡器称为晶体振荡器,简称晶振。 晶体本身不能产生振荡信号,必须借助于外部的振荡器电路。另外振荡器件除了是晶振外,还可以是RC振荡电路,或者LC振荡电路。 晶体振荡器分为无源晶振和有源晶振两种类型,无源晶振英文叫做crystal(晶体),而有源晶振则叫做
[单片机]
STM32必学的时钟系统
相较于51单片机,stm32的时钟系统可以说是非常复杂了,我们现在看下面的一张图: 上图说明了时钟的走向,是从左至右的从时钟源一步步的分配给外设时钟。需要注意的是,上图左侧一共有四个时钟源,从上到下依次是: 高速内部时钟(HSI):以内部RC振荡器产生,频率为8Mhz,但相较于外部时钟不稳定。 高速内部时钟(HSE):以外部晶振作为时钟源,晶振频率可取范围为4~16Mhz,一般采用8Mhz的晶振。 低速外部时钟(LSE): 以外部晶振作为时钟源,主要是提供给实时时钟模块,所以一般选用32.768khz,该频率下定时器方便取整。 低速内部时钟(LSI): 从内部RC振荡器产生,频率为40khz,也是主要提供给实时时钟模块。 根据
[单片机]
基于STM32单片机建立系统时钟的设计方案
这里必须阐明系统时钟的简历对于系统运行的重要性。系统所有的运行都是建立在时钟的正常运行上的,没有稳健的系统时钟,就不可能有稳定的系统。 在系统中,复位后首要的任务是建立系统时钟,以下是建立系统时钟的基本步骤: 1. 将所有的RCC外设寄存器重设为默认值; 2.启用外部高速晶振; 3.等待,知道外部高速晶振稳定; 4.设置欲取指缓存使能和代码延时值; 5.设置AHB(HCLK)等于系统时钟; 6.设置高速APB2(PCLK2)为系统时钟; 7.设置低速APB1(PCLK1)为系统时钟的1/2,APB2最高是38MHz; 8.设置PLL时钟源及倍频系数,使能PLL,经过PLL被频后最高时钟只能72MHz; 9.等待PLL初始化;
[单片机]
基于<font color='red'>STM32</font>单片机建立<font color='red'>系统</font><font color='red'>时钟</font>的设计方案
STM32系统中的五个时钟源介绍
时钟信号好比是单片机的脉搏,了解STM32时钟系统很有必要。下图是STM32F1xx用户手册中的时钟系统结构图。 在STM32F1xx中,有五个时钟源,分别为HSI、HSE、LSI、LSE、PLL。 HSI是高速内部时钟,RC振荡器,频率为8MHz HSE是高速外部时钟,可接石英/陶瓷谐振器或者接外部时钟源,频率范围为4MHz~16MHz LSI是低速内部时钟,RC振荡器,频率为40kHz LSE是低速外部时钟,接频率为32.768kHz的石英晶振 PLL为锁相环倍频输出,其输出频率最大不得超过72MHz SYSCLK系统时钟SYSCLK最大频率为72MHz,它是供STM32中绝大部分部件工作的时钟源。系统时钟可由PLL、
[单片机]
<font color='red'>STM32</font><font color='red'>系统</font>中的五个<font color='red'>时钟</font>源介绍
STM32——MDK4与MDK5中设置系统各部分时钟对比
/******************************************************************************* * 函数名 : RCC_Configuration * 函数描述 : 在MDK4中设置系统各部分时钟 * 输入参数 : 无 * 输出结果 : 无 * 返回值 : 无 *******************************************************************************/ void RCC_Configuration(void) { /* 定义枚举类型变量 HSEStartUpStatus */
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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