SYDTEK 使用Systemtick来做延时[改良版]

下面是一个传统的延时函数的通用做法:

在这里插入图片描述

这种延时做法有几个缺点:
  1. 参数n要调试,比如传入1是1US,传入10不一定得10US

  2. 在使用这个延时得时候要关闭中断,否则有可能延时会变长

  3. 不同的编译环境、优化等级都有可能对这个延时的时间有影响
    为了解决这些问题,这里使用Systemtick来做延时,使用方法如下:

  4. 在需要的地方提前初始化并开始延时机制:
    在这里插入图片描述在这里插入图片描述

  5. 在需要延时的地方调用延时函数:
    在这里插入图片描述在这里插入图片描述

    Systemtick的延时函数因为VAL的值的递减是由硬件控制的所以时间很好算也很准。再因为VAL值是由硬件减的,所以及时中途被中断打断了,只要打断的时间不是很长这个延时依旧不会偏差。因为延时是硬件递减的,所以不会受编译器和忧患等级的影响!

请从如下地址下载:https://download.csdn.net/download/chengdong1314/20102218

改良版
上面说到的延时机制只能够算是一个思路,局限性太小了,这里专门做了一套兼容SDK的延时函数,具体代码如下:

/*
延时函数文件

作者:北京盛源达科技有限公司
日期:2016/7/8
*/
#include "delay.h"
#include "DebugLog.h"

#define DELAY_DEBUG

volatile uint32_t tick_total=0,tick_first=0;
uint8_t sysTick_irq=0;
void SysTick_Handler(void)
{
	sysTick_irq=1;
}
void SysTick_polling(void)
{
	if(sysTick_irq==1)
	{
		sysTick_irq=0;
		if(tick_first)
		{
			tick_total-=tick_first;
			tick_first=0;
			#ifdef DELAY_DEBUG
			dbg_printf("tick_first:%d\r\n",tick_total);
			#endif
		}
		else
		{
			if(tick_total>=0xFFFFFF) tick_total-=0xFFFFFF;
			#ifdef DELAY_DEBUG
			dbg_printf("tick_second:%d\r\n",tick_total);
			#endif
		}
	}
}
/*
n毫秒延时函数
参数: uint16_t n 要延时的毫秒数 单位:1ms
*/
void delay_ms(uint32_t n){
	tick_first=SysTick->VAL;
	tick_total=n*64*1000;
	if(tick_first>=tick_total)
	{
		#ifdef DELAY_DEBUG
		dbg_printf("first:%d %d\r\n",n,tick_first);
		#endif
		while(tick_total>(tick_first-SysTick->VAL))	SysTick_polling();
	}
	else
	{
		#ifdef DELAY_DEBUG
		dbg_printf("second:%d %d\r\n",n,tick_first);
		#endif
		while((tick_first!=0)||(tick_total>(0xFFFFFF-SysTick->VAL))) SysTick_polling();
	}
	tick_total=0;
	#ifdef DELAY_DEBUG
	dbg_printf("end:%d\r\n",SysTick->VAL);
	#endif
}

开机的时候按照如下方式初始化:

SysTick_Config(0xFFFFFF);  //最大值

这时候得到的35ms非常准确:
在这里插入图片描述
本章节内容可以从如下地址下载:https://download.csdn.net/download/chengdong1314/87537987

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值