欢迎来到军工软件开发人才培养基地——学到牛牛

STM32系统时钟定时器

时间:2024-05-06 07:01:10 来源:学到牛牛

 

时钟系统是 CPU 的脉搏,就像人的心跳一样,所以时钟系统的重要性就不言而喻了。STM32F4有5个最重要的时钟源,分别为HSI(高速内部时钟)、HSE(高速外部时钟)、LSI(低速内部时钟)、LSE(低速外部时钟)、PLL(锁相环倍频输出)。在这 5 个中 HSI,HSE 以及 PLL 是高速时钟,LSI 和 LSE 是低速时钟。从来源可分为外部时钟源和内部时钟源,外部时钟源就是从外部通过外接晶振的方式获取时钟源,其中 HSE 和LSE 是外部时钟源,其他的是内部时钟源。

SysTick,系统定时器是属于CM4内核中的一个外设,内嵌在NVIC中。系统定时器是一个24bit的向下递减的计数器,计数器每计数一次的时间为1/SYSCLK。在STM32F407芯片一般我们设置系统时钟SYSCLK等于168MHz。当重装载数值寄存器的值递减到0的时候,系统定时器就产生一次中断,以此循环往复。

SysTick有4个寄存器,分别为CTRL控制级状态寄存器,LOAD重装载数值寄存器,VAL当前数值寄存器,CALIB校准数值寄存器。

 

1.png

SysTick属于内核的外设,有关寄存器定义和库函数都在内核相关的库文件core_cm4.h中。

使用SysTick_Config(uint32_t ticks) 中,ticks来设置重装载寄存器的值,当值被递减到0时,产生中断。该函数主要配置了SysTick中的LOAD、VAL、CTRL三个寄存器,同时也配置了系统定时器的中断优先级。

以下代码是通过系统时钟定时器中断方式,完成一个较为精准的延时函数。

void SysTick_Init( void )

{

while( SysTick_Config( SystemCoreClock / 1000000 ) )

;

}

 

volatile unsigned int Num;

 

void SysTick_Handler(void)

{

Num--;

}

 

void delay_us( int val )

{

Num = val;

while( Num )

;

}

 

void delay_ms( int val )

{

delay_us( 1000 * val );

}