STM学习- -时钟系统讲解

STM学习- -时钟系统讲解

Jan 24 03:00 06:00 09:00 12:00 03:00 06:00 09:00 Mon 25 已完成 时间安排

主要内容:

  • 几个重要的时钟:

  • SYSCLK(系统时钟) :

  • AHB总线时钟

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

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

  • PLL时钟
    在这里插入图片描述

  • 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。

  • 系统时钟SYSCLK可来源于三个时钟源:
    ①、HSI振荡器时钟
    ②、HSE振荡器时钟
    ③、PLL时钟

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

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

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

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA, ENABLE);	 //使能PB,PE端口时钟

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
{
 /* Check the parameters */
 assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));//PERIPH大区
 assert_param(IS_FUNCTIONAL_STATE(NewState));
 if (NewState != DISABLE)
 {
   RCC->APB2ENR |= RCC_APB2Periph;
 }
 else
 {
   RCC->APB2ENR &= ~RCC_APB2Periph;
 }
}
--------------------------------------------------------------------------------------------------------/** @defgroup APB2_peripheral 
/** @defgroup APB2_peripheral 
 * @{
 */

#define RCC_APB2Periph_AFIO              ((uint32_t)0x00000001)
#define RCC_APB2Periph_GPIOA             ((uint32_t)0x00000004)
#define RCC_APB2Periph_GPIOB             ((uint32_t)0x00000008)
#define RCC_APB2Periph_GPIOC             ((uint32_t)0x00000010)
#define RCC_APB2Periph_GPIOD             ((uint32_t)0x00000020)
#define RCC_APB2Periph_GPIOE             ((uint32_t)0x00000040)
#define RCC_APB2Periph_GPIOF             ((uint32_t)0x00000080)
#define RCC_APB2Periph_GPIOG             ((uint32_t)0x00000100)
#define RCC_APB2Periph_ADC1              ((uint32_t)0x00000200)
#define RCC_APB2Periph_ADC2              ((uint32_t)0x00000400)
#define RCC_APB2Periph_TIM1              ((uint32_t)0x00000800)
#define RCC_APB2Periph_SPI1              ((uint32_t)0x00001000)
#define RCC_APB2Periph_TIM8              ((uint32_t)0x00002000)
#define RCC_APB2Periph_USART1            ((uint32_t)0x00004000)
#define RCC_APB2Periph_ADC3              ((uint32_t)0x00008000)
#define RCC_APB2Periph_TIM15             ((uint32_t)0x00010000)
#define RCC_APB2Periph_TIM16             ((uint32_t)0x00020000)
#define RCC_APB2Periph_TIM17             ((uint32_t)0x00040000)
#define RCC_APB2Periph_TIM9              ((uint32_t)0x00080000)
#define RCC_APB2Periph_TIM10             ((uint32_t)0x00100000)
#define RCC_APB2Periph_TIM11             ((uint32_t)0x00200000)

#define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFC00002) == 0x00) && ((PERIPH) != 0x00))
/**
 * @}
 */ 
-------------------------------------------------------------------------------------------------------


#define IS_FUNCTIONAL_STATE (STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))



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

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

  • Systick定时器基础知识讲解
  • Systick相关寄存器库函数讲解
    4个Systick寄存器
  1. CTRL
    在这里插入图片描述

  2. SysTick 控制和状态寄存器 LOAD

  3. 在这里插入图片描述

  4. SysTick 自动重装载除值寄存器 VAL
    在这里插入图片描述

  5. SysTick 当前值寄存器 CALIB

  6. SysTick 校准值寄存器

  • delay延时函数讲解(Systick应用)

  • Systick相关函数
    固件库中的Systick相关函数:


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

  SysTick_Config(uint32_t ticks) //初始化systick,时钟为HCLK,并开启中断
                                                  //core_cm3.h/core_cm4.h文件中

Systick中断服务函数:

 void SysTick_Handler(void);
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值