STM32复习笔记(二) 时钟系统

发布者:HarmoniousSoul最新更新时间:2019-06-27 来源: eefocus关键字:STM32  时钟系统 手机看文章 扫描二维码
随时随地手机看文章

一、时钟系统框图:


二、时钟系统知识总结:

1. STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL。


     ①、HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。

   ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时


                钟源,频率范围为4MHz~16MHz。

   ③、LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。WDG

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

   ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。


                倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

2. 系统时钟SYSCLK可来源于三个时钟源:

        ①、HSI振荡器时钟


        ②、HSE振荡器时钟


        ③、PLL时钟


3.STM32可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL


  输出的2分频、HSI、HSE、或者系统时钟。


4.任何一个外设在使用之前,必须首先使能其相应的时钟。


三、几个重要的时钟:

lSYSCLK(系统时钟) :


l AHB总线时钟


l APB1总线时钟(低速): 速度最高36MHz


l APB2总线时钟(高速): 速度最高72MHz


l PLL时钟


四、RCC相关配置寄存器:

typedef struct


{


  __IO uint32_t CR;                //HSI,HSE,CSS,PLL等的使能和就绪标志位


  __IO uint32_t CFGR;           //PLL等的时钟源选择,分频系数设定


  __IO uint32_t CIR;               // 清除/使能 时钟就绪中断


  __IO uint32_t APB2RSTR;  //APB2线上外设复位寄存器


  __IO uint32_t APB1RSTR;   //APB1线上外设复位寄存器


  __IO uint32_t AHBENR;    //DMA,SDIO等时钟使能


  __IO uint32_t APB2ENR;   //APB2线上外设时钟使能


  __IO uint32_t APB1ENR;   //APB1线上外设时钟使能


  __IO uint32_t BDCR;        //备份域控制寄存器


  __IO uint32_t CSR;           //控制状态寄存器


} RCC_TypeDef;


五、RCC相关头文件和固件库源文件

1.时钟使能配置:


      RCC_LSEConfig() 、RCC_HSEConfig()、


      RCC_HSICmd() 、 RCC_LSICmd() 、 RCC_PLLCmd() ……


2.时钟源相关配置:


      RCC_PLLConfig ()、 RCC_SYSCLKConfig() 、


     RCC_RTCCLKConfig() …


3.分频系数选择配置:


      RCC_HCLKConfig() 、 RCC_PCLK1Config() 、 RCC_PCLK2Config()…


4.外设时钟使能:


      RCC_APB1PeriphClockCmd():  //APB1线上外设时钟使能


     RCC_APB2PeriphClockCmd();  //APB2线上外设时钟使能


     RCC_AHBPeriphClockCmd();   //AHB线上外设时钟使能


5.  其他外设时钟配置:


     RCC_ADCCLKConfig ();  RCC_RTCCLKConfig();


6.状态参数获取参数:


     RCC_GetClocksFreq();


     RCC_GetSYSCLKSource();


     RCC_GetFlagStatus()


7.RCC中断相关函数 :


     RCC_ITConfig() 、 RCC_GetITStatus() 、 RCC_ClearITPendingBit()…


 


六、SystemInit函数解读

u系统时钟初始化函数:


    SystemInit();


  使用V3.5版本的库函数,该函数在系统启动之后会自动调用:


    startup_stm32f10x_xx.s文件中:


            ; Reset handler


                Reset_Handler   PROC


                 EXPORT  Reset_Handler             [WEAK]


                 IMPORT  __main


                 IMPORT  SystemInit


                 LDR     R0, =SystemInit


                 BLX     R0              


                 LDR     R0, =__main


                 BX      R0


                 ENDP


初始化之前首先通过宏定义定义系统时钟频率:


     #define SYSCLK_FREQ_72MHz  72000000


初始化之后的状态:


     SYSCLK         72MHz


     AHB                72MHz


     PCLK1           36MHz


     PCLK2           72MHz


     PLL                72MHz


初始化之后可以通过变量SystemCoreClock获取系统变量。如果SYSCLK=72MHz,那么变量SystemCoreClock=72000000。


七、Systick定时器是什么?

Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器。


Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。


Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。


SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。


Systick中断的优先级也可以设置。


八、Systick相关寄存器

4个Systick寄存器

    CTRL             SysTick 控制和状态寄存器  LOAD            


    SysTick 自动重装载除值寄存器 

    VAL                SysTick 当前值寄存器  CALIB           


    SysTick 校准值寄存器


SysTick 控制和状态寄存器- CTRL


对于STM32,外部时钟源是 HCLK(AHB总线时钟)的1/8


                           内核时钟是 HCLK时钟


     配置函数:SysTick_CLKSourceConfig();


SysTick 重装载数值寄存器- LOAD

SysTick 当前值寄存器- VAL


固件库中的Systick相关函数:

    SysTick_CLKSourceConfig()    //Systick时钟源选择  misc.c文件中


    SysTick_Config(uint32_t ticks) //初始化systick,时钟为HCLK,并开启中断


                                                    //core_cm3.h/core_cm4.h文件中


Systick中断服务函数:

   void SysTick_Handler(void);


九、Systick库函数

             SysTick_CLKSourceConfig函数:


void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)


{


  /* Check the parameters */


  assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));


  if (SysTick_CLKSource == SysTick_CLKSource_HCLK)


  SysTick->CTRL |= SysTick_CLKSource_HCLK; 


  else   SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;


}


static __INLINE uint32_t SysTick_Config(uint32_t ticks)


{


  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);         /* Reload value impossible */


  


 /* set reload register */                                                           


  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;


/* set Priority for Cortex-M0 System Interrupts */


  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);


  SysTick->VAL   = 0;                                        /* Load the SysTick Counter Value */


  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |


                   SysTick_CTRL_TICKINT_Msk   |


                   SysTick_CTRL_ENABLE_Msk;     /* Enable SysTick IRQ and SysTick Timer */


  return (0);                                                  /* Function successful */


}

十、Systick库函数用中断的方式实现delay延时

static __IO uint32_t TimingDelay;

void Delay(__IO uint32_t nTime)

   TimingDelay = nTime;

   while(TimingDelay != 0);

}

void SysTick_Handler(void)

{

    if (TimingDelay != 0x00) 

     { 

       TimingDelay--;

     }

}

 int main(void)

 {  …

    if (SysTick_Config(SystemCoreClock / 1000)) //systick时钟为HCLK,中断时间间隔1ms

     {

     while (1);

     }

    while(1)

     { Delay(200);//2ms

     … 

     }

}

Cortex-M系统中,Systick代码可以通用。如果使用中发现延时不一致,问题一般都是因为不同内核时钟不一样而已。修改ticks值即可。


关键字:STM32  时钟系统 引用地址:STM32复习笔记(二) 时钟系统

上一篇:STM32串口收数据的几种不同方式
下一篇:STM32复习笔记(一) GPIO的输入与输出

推荐阅读最新更新时间:2024-11-13 09:14

STM32单片机学习(8) 程序加密
STM32程序加密有两种方式 1、禁止读出Flash存储器内容 2、用ID加密程序 u8 Sys_ID ,i; for(i=0;i 12;i++) { Sys_ID =*(u8*)(0x1FFFF7E8+i); //产品唯一身份标识寄存器(96位) printf( %0.2X ,Sys_ID ); //参考另外两篇文章串口中断通信 串口通信printf重定向 } if(Sys_ID ==0x36 && Sys_ID ==0xFF && Sys_ID ==0xD7 && Sys_ID ==0x05 && Sys_ID ==0x34 && Sys_ID ==0x52 && Sys_ID ==0x32
[单片机]
stm32按键单击,双击,长按
给arm初学者一个比较实用的多功能按键,实现单击,双击,长按。声明一下:这是我修改的例程。如果写到TIM3时间中断里不太消耗CPU资源。 key.h #define key_5 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) key.c //在函数之外定义全局变量,这个几个标志位可以被外部程序引用。 u8 key_short; u8 key_long; u8 key_double; void key_set(void) { static u16 time=0; //申请一个按键计时器 u8 i=0; if(key_5==0)
[单片机]
STM32 USB转串口驱动移植到SylixOS中遇到的问题总结
简介 由于客户项目需求,需要在STM32的硬件平台上实现USB转串口的功能,由于ST公司基于STM32硬件平台实现了相应的USB库以方便开发者进行开发,因此,在SylixOS下实现USB转串口功能时对该USB库进行了移植。由于该USB库的实现是基于STM32的裸机代码实现,因此在移植的过程中,不需要做过多的修改。 下面章节主要介绍在移植STM32的USB转串口驱动到SylixOS下遇到的问题以及对应的解决方法。对于其中的有些解决方法在移植STM32其他外设驱动的过程中也依然适用。 2. 移植遇到的问题及解决方法 2.1 非对齐内存访问错误 在移植完USB转串口驱动后,烧写SylixOS到STM32后,在运行过
[单片机]
stm32学习1跑马灯程序之寄存器版本
1使能IO口时钟,配置相关寄存器RCC- AHB1ENR 2初始化IO口模式。配置四个寄存器GPIOX_MODER/GPIOX_OTYPER/OSPEEDER/PUPDR 3操作IO口,输出高低电平。配之寄存器GPIOX_ODR或BSRRL/BSRRH 1:RCC是一个结构体指针RCC- AHB1ENR使能寄存器AHB1,使能外部时钟第六位,位5,及设置这一位为1 ,c语言中利用或运算A|=B相当于A=A|B,32位及寄存器两种写法:1)RCC- AHB1ENR|=0x0020 2)RCC- AHB1ENR|=1 5;1左移5位比较直观 2:GPIOF- MODER= 32位寄存器,一组寄存器对应16个IO口,所以要配置9和10I
[单片机]
STM32 F7如何满足嵌入式系统更高处理性能需求
  意法半导体(ST)日前宣布推出业界首款基于ARM最新Cortex-M7内核的STM32 F7系列微控制器,其性能远超ST之前的32位STM32F4微控制器,通过无缝升级路径可将处理性能和DSP性能提高一倍。   “作为STM32微控制器产品家族的高端产品,STM32 F7使内存和外存的性能达到一个新的水平,给开发人员带来新的创新机会,保证他们不需要再根据存储器性能调整代码。”ST微控制器市场总监Daniel Colonna表示,“而之所以能够在业内率先推出基于Cortex-M7的产品,首先得益于ST与ARM密切的合作关系。其次,ST也与第三方客户保持着广泛的合作,确保他们能够及时得到ARM最新的技术支持并推出新产品。强大的
[电源管理]
<font color='red'>STM32</font> F7如何满足嵌入式<font color='red'>系统</font>更高处理性能需求
STM32hal库串口中断接收任意字符
cubeMCX设置: 生成工程文件 usart.c /** ****************************************************************************** * @file usart.c * @brief This file provides code for the configuration * of the USART instances. ****************************************************************************** * @attenti
[单片机]
STM32hal库串口中断接收任意字符
STM32定时器进入中断后无法退出的解决方法
STM32在使用定时器的时候,遇到了进入中断后无法退出的问题,其实算不上是问题 ,应该是粗心。后来总结了这类问题的共性,即:程序进入中断服务函数之后必须清除中断标志位,中断标志位的清除方式各不相同,串口中断中,通过读取数据寄存器就可以清除标志位,定时器中断需要调用清除中断标志的函数来清除,如下所示: void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除中断标志位 //add your code here //en
[单片机]
STM32的FSMC驱动TFT笔记
1、FSMC初初了解: FSMC 包括4个模块: (1)AHB接口(包括FSMC配置寄存器) (2)NOR闪存和PSRAM控制器(驱动LCD的时候LCD就好像一个PSRAM的里面只有2个16位的存储空间,一个是DATA RAM 一个是CMD RAM) (3)NAND闪存和PC卡控制器 (4)外部设备接口 我们驱动TFT很明显用的是第二个模块:NOR闪存。 2、FSMC的外设地址选择 FSMC _Bank 用来选择外接存储器的地址,FSMC所控制的外存储器所映射的地址是0x6000 0000 ~ 0x9fff ffff 其中属于NOR FLASH 的是0x6000 0000 ~ 0x6fff ff
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多往期活动
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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