一、SysTick时钟源
在STM32H7中,系统的时钟源并不像f1,f4一样来源于AHB总线,而是来源于PLL锁相环(在一般的配置中,会将Sys进行一分频),因此Sys的时钟是480MHz,因此系统滴答定时器输入时钟就是480MHz。
二、SysTick相关寄存器
SysTick是属于Cortex内核的外设,因此它的寄存器在相关内核编程手册可以找到。
我们可以看到有四个寄存器,在这里我们只用到了前三个寄存器:1.SysTick控制及状态寄存器。2.SysTick重装载寄值存器。3.SysTick当前值寄存器。
1.SysTick控制及状态寄存器
这里需要用到四个位,分别是位0、1、2、16
位0是使能或者失能计数,位1是使能或者失能SysTick的中断,位2是时钟源,在这里被修改为SysTick的分频系数,对于位16来说,计数到0的时候,位16被置1,由硬件清零,这里可以用来查看计数是否完成。
2.SysTick装载寄存器
这是一个24位的一个寄存器,它最大可以一次性计数2^24=16777216个数。
3.SysTick当前值寄存器
它和SysTick装载寄存器一样,也是24位的一个寄存器,它最大可以一次性计数2^24=16777216个数。可以读取他来判断还剩多少个计数周期。
三,延时实现方法
这些都是关于寄存器的操作,可以查阅手册来理解(CortexM内核)
1.SysTick初始化
void SysTickDelayInit()
{
SysTick -> CTRL = 0; //失能所有配置
SysTick -> LOAD = 0; //重装载值清零
SysTick -> VAL = 0; //系统滴答定时器当前数值寄存器值清零
SysTick -> CTRL |= 0; //输入时钟设置八分频
SysTick -> CTRL |=0; //使能滴答定时器中断
SysTick -> CTRL &=(~0x01); //计数失能
}
2.延时1us
void Delay_us(uint32_t us)
{
/*
在H750中,系统滴答定时器是连在PLL锁相环之后,而并未像f系列一样连在AHB总线上
480MHz八分频后为60MHz,为16.67ns,由于 1 us = 1000 ns 因此 1000 / 16.67 = 60(一微秒所需要的重装载值),
因此,当自动重装载值为60时候,就能达到 1 us 的延时效果
*/
if(us > 0xFFFFFF)
{
return;
}
SysTick -> LOAD = 60; //1us 的重装值
SysTick -> VAL = 0; //系统滴答定时器当前数值寄存器值清零
SysTick -> CTRL |= 0x01; //计数器使能
while(us--)//等待us微妙
{
while(!(SysTick->CTRL & 0x01<<16));
}
SysTick -> CTRL &=~(0x01); //计数失能
SysTick -> LOAD = 0; //重装载值清零
SysTick -> VAL = 0; //系统滴答定时器当前数值寄存器值清零
}
3.延时1ms
void Delay_ms(uint32_t ms)
{
while(ms--) //等待ms毫秒
{
Delay_us(1000); //等待1000微妙
}
}
注意:此方法和HAL库的“HAL_Delay”函数不同,HAL库使用的是利用系统滴答定时器每1ms产生的中断来实现延时。此方法虽然也用到了系统滴答定时器,但是没有使用中断。