系统定时器实现delay函数

优化前

void delay_ms(uint32_t ms)
{
	while(ms --)
	{
		SysTick->CTRL = 0; 			// 关闭系统定时器后才能配置寄存器
		SysTick->LOAD = 21000; 			// 设置计数值,用于设置定时的时间
		SysTick->VAL = 0; 			// 清空当前值还有计数标志位
		SysTick->CTRL = 1; 			// 使能系统定时器工作,且时钟源为系统时钟的8分频(168MHz/8=21MHz)
		while ((SysTick->CTRL & (1<<16))==0);	// 等待系统定时器计数完毕
		SysTick->CTRL = 0; 			// 关闭系统定时器	
	}
}

void delay_us(uint32_t n)
{

	SysTick->CTRL = 0; // 关闭系统定时器
	SysTick->LOAD = n*168-1; // 168000000/1000000 -1,每次延时1us
	SysTick->VAL = 0; //清空val寄存器 还有清空COUNTFLAG标志位
	SysTick->CTRL = 5; // 使能系统定时器工作,而它的时钟源为处理器时钟168MHz
	while ((SysTick->CTRL & 0x00010000)==0);// 等待系统定时器计数完毕
	SysTick->CTRL = 0; // 关闭系统定时器	
}

优化后:官方代码没有想到意外关闭的问题

int32_t delay_us(uint32_t nus)
{
	uint32_t temp;

	SysTick->CTRL = 0; 					
	SysTick->LOAD = (nus*21)-1; 		
	SysTick->VAL = 0; 					
	SysTick->CTRL = 1; 					
	
	while(1)
	{
	
		temp=SysTick->CTRL;
		
		//检测count flag
		if(temp & 0x00010000)
			break;
		
		//检测系统定时器是否意外关闭	
		if((temp & 0x1)==0)
			return -1;		
	}
	
	SysTick->CTRL = 0; 					

	return 0;
}

int32_t  delay_ms(uint32_t nms)
{
	uint32_t t = nms;
	uint32_t temp;
	
	while(t--)
	{
		SysTick->CTRL = 0; 			
		SysTick->LOAD = 21000-1; 	
		SysTick->VAL = 0; 			
		SysTick->CTRL = 1; 			
		while(1)
		{

			temp=SysTick->CTRL;
			
			//检测count flag
			if(temp & 0x00010000)
				break;
			
			//检测系统定时器是否意外关闭	
			if((temp & 0x1)==0)
				return -1;		
		}
	}	
	
	SysTick->CTRL = 0; 	
	
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值