Systick定时器延时

本文介绍了CM3内核处理器中的Systick定时器,用于实现延时功能。内容包括两种实现方式:1) 中断方式,利用库函数Systick_Config()定义中断时间段,通过递减time_delay变量实现延时,但存在中断影响的问题;2) 非中断方式,直接操作寄存器,提供更精准且无中断影响的延时方法。
摘要由CSDN通过智能技术生成

CM3内核的处理器,内部包含一个Systick定时器;

Systick是一个24位的倒计数定时器,当记到0时,将从RELOAD寄存器中自动重装载定时初值,只要不把它在Systick控制及状态寄存器中的使能位清除,就永不停息。
实现方式有两种:

1.中断方式:使用库函数,但有中断的存在,不利于在其他中断中调用延时函数。如下定义时间time_delay,Systick_Config()定义中断时间段,在中断中递减time_delay,从而实现延时。

volatile unsigned long time_delay; //延时时间  全局变量

void delay_ms(volatile unsigned long nms)
{
	if(Systick_Config(SystemFrequency/1000))   //SYSTICK分频   1ms的中断
	{
	while(1);
	}
	time_delay=nms;
	while(time_delay);
	SysTick->CTRL=0x00;  //关闭计数器
	SysTick->VAL=0x00;  //清空计数器
}

//延时 nus
void delay_us(volatile unsigned long nus)
{
	if(Systick_Config(SystemFrequency/1000000))   //SYSTICK分频 1us的系统时钟中断
	{
	while(1);
	}
	time_delay=nus;//读取定时时间
	while(time_delay);
	SysTick->CTRL=0x00;  //关闭计数器
	SysTick->VAL=0x00;  //清空计数器
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值