#include"delay.h"
#define systemclock 64 //64MHz,systick使用的是系统时钟,详情见:https://blog.youkuaiyun.com/m0_68583522/article/details/135387012;
/*注意:systic计数器是一个24位递减计数器*/
void delay_us(uint32_t nus)
{
uint32_t cnt_old=0,cnt_new=0,delays=0,t_cnt=0;
//获取systick计数器的重装值,为了让滴答定时器每毫秒滴答一次,
//每个芯片的重装值是不一样的,但这个重装值不用我们进行配置,在初始化时会自动配置,这个值最终等于SystemCoreClock / (1000U / uwTickFreq),
//详情见:https://blog.youkuaiyun.com/m0_68583522/article/details/135387012;
uint32_t reload = SysTick->LOAD;
delays =nus * systemclock; //计算你要延时的这段时间内systick计数器递减次数:微秒的数量级和兆赫兹的数量级刚好抵消;
cnt_old = SysTick->VAL;
while (1)
{
cnt_new = SysTick->VAL;
if (cnt_new != cnt_old)
{
if (cnt_new < cnt_old)//未重装
{
t_cnt += cnt_old - cnt_new; /* 这里注意一下SYSTICK是一个递减的计数器就可以了 */
}
else//进行了重装
{
t_cnt += reload - cnt_new + cnt_old;
}
cnt_old = cnt_new;
if (t_cnt >= delays)
{
break; /* 时间超过/等于要延迟的时间,则退出 */
}
}
}
}
void delay_ms(uint16_t nms)
{
delay_us((uint32_t)(nms * 1000));
}
#ifndef __DELAY_H
#define __DELAY_H
#include "main.h"
void delay_ms(uint16_t nms); /* 延时nms */
void delay_us(uint32_t nus); /* 延时nus */
#endif