STM32H750XBH6“SysTick“延时实现

一、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产生的中断来实现延时。此方法虽然也用到了系统滴答定时器,但是没有使用中断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值