STM32入门:时钟系统

377 阅读6分钟

C语言相关知识

static关键字:

  • static声明的局部变量,存储在静态存储区;
  • 它在函数调用结束之后,不会被释放,它的值会一直保留下来。 extern变量声明:
  • extern可以置于变量或函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义;
  • extern声明变量可以多次,但定义只能有一次。

STM32时钟系统

STM时钟系统

  1. 在 STM32 中,一共有5个时钟源,分别是 HSI、HSE、LSI、LSE、PLL:
  • HSI 是高速内部时钟, RC 振荡器,频率为 8MHz ;
  • HSE 是高速外部时钟,可接石英 / 陶瓷谐振器,或者接外部时钟源,频率范围是 4MHz – 16MHz ;
  • LSI 是低速内部时钟,RC 振荡器,频率为 40KHz,提供低功耗时钟;
  • LSE 是低速外部时钟,接频率为 32.768KHz 的石英晶体;
  • PLL 为锁相环倍频输出,严格的来说并不算一个独立的时钟源,PLL 的输入可以接 HSI/2、HSE 或者 HSE/2 。PLL倍频可选择为 2 – 16 倍,但是其输出频率最大不得超过 72MHz 。
  1. 系统时钟SYSCLK可来源于三个时钟源:
  • HSI振荡器时钟
  • HSE振荡器时钟
  • PLL时钟
  1. STM32 还可以选择一个时钟信号输出到 MCO 脚 (PA.8) 上,可以选择为 PLL 输出的 2 分频、HSI、HSE或者系统时钟;
  2. 40kHz的 LSI 供独立看门狗 IWDG 使用,另外它还可以被选择为实时时钟 RTC 的时钟源。另外,实时时钟 RTC 的时钟源还可以选择 LSE,或者是 HSE 的 128 分频;
  3. STM32 中有一个全速功能的 USB 模块,其串行接口引擎需要一个频率为 48MHz 的时钟源。该时钟源只能从 PLL 端获取,可以选择为 1.5 分频或者 1 分频,也就是,当需使用到 USB 模块时, PLL 必须使能,并且时钟配置为 48MHz 或 72MHz;
  4. 系统时钟最大频率为 72MHz ,它通过 AHB 分频器分频后送给各个模块使用, AHB分频器可以选择1、2、4、8、16、64、128、256、512分频,AHB分频器输出的时钟送给 5 大模块使用:
  • 送给 AHB 总线、内核、内存和 DMA 使用的 HCLK 时钟;
  • 通过 8 分频后送给 Cortex 的系统定时器时钟STCLK;
  • 直接送给 Cortex 的空闲运行时钟 FCLK;
  • 送给 APB1 分频器。APB1分频器可以选择1、2、4、8、16分频,其输出一路供 APB1 外设使用( PCLK1 ,最大频率36MHz),另一路送给定时器 (Timer)2 、3 、4使用。该倍频器根据PCLK1的分频值自动选择 1 或者 2 倍频,时钟输出供定时器 2 、3 、4 使用。需要注意的是定时器的倍频器,当APB的分频为1时,它的倍频值为1,否则它的倍频值就为2。;
  • 送给 APB2 分频器。APB2分频器可以选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另外一路送给定时器 (Timer)1 使用。该倍频器根据PCLK2的分频值自动选择1 或 2 倍频,时钟输出供定时器 1 使用。另外 APB2 分频器还有一路输出供 ADC 分频器使用,分频后送给 ADC 模块使用。ADC分频器可选择为2、4、6、8分频。 系统结构
  1. APB1和APB2连接的模块
  • 连接在 APB1( 低速外设 ) 上的设备有:电源接口、备份接口、 CAN 、 USB 、 I2C1 、 I2C2 、 UART2 、 UART3 、 SPI2 、窗口看门狗、 Timer2 、 Timer3 、 Timer4 。注意:USB模块虽然需要一个单独的48MHz的时钟信号,但是它应该不是供USB模块工作的时钟,而只是提供给串行接口引擎(SIE)使用的时钟。USB模块的工作时钟应该是由APB1提供的。
  • 连接在 APB2 (高速外设)上的设备有: UART1 、 SPI1 、 Timer1 、 ADC1 、 ADC2 、 GPIOx(PA~PE) 、第二功能 IO 口。 STM32时钟树

RCC相关配置寄存器

typedef struct
{
  __IO uint32_t CR;
  __IO uint32_t CFGR;
  __IO uint32_t CIR;
  __IO uint32_t APB2RSTR;
  __IO uint32_t APB1RSTR;
  __IO uint32_t AHBENR;
  __IO uint32_t APB2ENR;
  __IO uint32_t APB1ENR;
  __IO uint32_t BDCR;
  __IO uint32_t CSR;
} RCC_TypeDef;
  1. 时钟控制寄存器(CR)(复位值为0x0000 xx83)
  • 主要功能:内外部高速时钟的使能和就绪标志(含内部高速时钟校准调整),外部高速时钟旁路,时钟安全系统CSS使能,PLL使能和PLL就绪标志。
  1. 时钟配置寄存器(CFGR)(复位值为0x0000 0000)
  • 主要功能:系统时钟源切换及状态,AHB、APB1、APB2、ADC、USB预分频,PLL输入时钟源选择及HSE输入PLL分频选择,PLL倍频系数,MCO(PA8)引脚微控制器时钟输出。
  1. AHB外设时钟使能寄存器(AHBENR) (复位值: 0x0000 0014)
  • 主要功能:DMA1、DMA2、SRAM、FLITF、CRC、FSMC、SDIO时钟使能。
  1. APB2外设时钟使能寄存器(APB2ENR)(复位值: 0x0000 0000)
  • 主要功能:AFIO、IOPA、IOPB、IOPC、IOPD、IOPE、IOPF、IOPG、ADC1、ADC2、TIM1、SPI1、TIM8、USART1、ADC3时钟使能。
  1. APB1外设时钟使能寄存器(APB1ENR)(复位值: 0x0000 0000)
  • 主要功能:TIM2、TIM3、TIM4、TIM5、TIM6、TIM7、WWDG、SPI2、SPI3、USART2、USART3、USART4、USART5、I2C1、I2C2、USB、CAN、BKP、PWR、DAC时钟使能。

系统时钟初始化函数

SystemInit()函数作用:

  • 使能内部高速时钟HSI;
  • 将HSI作为系统时钟;
  • 复位HPRE、PPRE1、PPRE2、ADCPRE、MC0,使得HCLK=SYSCLKPCLK1=HCLKPCLK2=HCLK,微控制器时钟不输出(PCLK2供APB2外设使用,PCLK1供APB1外设使用);
  • 复位HSE、CSS(时钟安全系统)、PLL,关闭外部外部高速时钟、时钟安全系统、锁相环倍频输出;
  • 复位HSEBYP,使得外部高速时钟没有旁路;
  • 复位PLLSRC,PLLXTPRE,PLLMUL,USBPRE/OTGFSPRE,HSI时钟2分频后作为PLL输入时钟(PLL已关闭);
  • 禁用所有中断;
  • 使能外部高速时钟HSE,并待其就绪;
  • HCLK=SYSCLK PCK2=HCLK PCK1=HCLK/2
  • 将HSE时钟作为PLL输入时钟且PLL倍频系数为9
  • 将PLL输出作为系统时钟

SysTick定时器

  1. SysTick定时器介绍
  • SysTick定时器也叫SysTick滴答定时器,它是Cortex-M3内核的一个外设,被嵌入在NVIC 中;
  • SysTick定时器是一个24位向下递减的定时器,当定时器计数到0时,将从LOAD寄存器中自动重装定时器初值,重新向下递减计数,如此循环往复;
  • SysTick是系统定时器时钟,它可以直接取内核时钟(FCLK),还可以取部时钟源(STCLK),其中外部时钟源是HCLK(AHB总线时钟)的1/8;
  • 如果开启SysTick中断的话,当定时器计数到0,将产生一个中断信号,该中断优先级也可以设置。
  1. 4个SysTick寄存器
  • CTRL SysTick控制和状态寄存器 配置函数:
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
  • LOAD SysTick自动装载值寄存器
  • VAL SysTick当前值寄存器
  • CALIB SysTick校准值寄存器
  1. SysTick相关函数
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);//Systick时钟源选择
static __INLINE uint32_t SysTick_Config(uint32_t ticks);//初始化systick,时钟为HCLK并开启中断,ticks-1为初始值,每计数ticks次中断一次
void SysTick_Handler(void);//中断服务函数

参考资料

  1. STM32的时钟系统RCC详细整理
  2. 【正点原子】 手把手教你学STM32单片机教学视频
  3. SysTick定时器的原理与编程使用