【STM32标准库】【自制库】软件延迟(使用滴答定时器)

本文详细介绍了如何在STM32F4系列MCU中使用滴答定时器(SysTick)来实现微秒、毫秒和秒级别的延迟函数。通过设置SysTick_Config()函数配置中断频率,并结合NVIC_SetPriority()设置高优先级中断,实现了精确的时间延迟。代码示例展示了如何初始化滴答定时器,以及如何在中断服务函数中递减计数器以达到延迟效果。此外,还提供了毫秒和秒延迟函数的实现方式。
摘要由CSDN通过智能技术生成


文章基于适用于STM32F4系列,作者使用STM32F401CCU6开发板。
本文章基于此系列和开发板展开讨论。

滴答定时器

简介

官方名称为SysTick,是一个简单的定时器,常用于制作延迟函数

初始化

我们就是用这个定时器制作延迟函数
使用这个函数可以快速初始化滴答定时器

void SysTick_Config(unit32_t ticks);

调用这个函数可以快速设置

  • 时钟频率为AHB频率(系统频率)(见时钟系统)
  • 中断计数值为传入的ticks(也就是通用定时器的定时器周期)
  • 开启中断
SystemCoreClock 				//宏定义 系统时钟频率(单位Hz)
void SysTick_Handler(void);			//滴答定时器的中断服务函数

所以,中断触发时间间隔为

( ticks + 1 ) / SystemCoreClock 单位s

思路

利用滴答定时器的中断,每隔1us使变量-1,直到其为0,可以产生任意长度的微秒时间间隔,注意要给一个高中断优先级,详情见中断
非常简单

代码

微秒延迟

uint32_t Delay_time=0;								//多个函数调用且不能释放,需要全局变量
void Delay_us(uint32_t time)
{
	SysTick_Config((SystemCoreClock/1000000)-1);	//设置中断频率为1us触发一次
	NVIC_SetPriority(SysTick_IRQn,0);				//给定时器个高中断优先级
	Delay_time=time;								//将时间值输入到全局变量中
	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;			//打开SysTick定时器
	while(Delay_time);								//等待全局变量归零,占用cpu
	SysTick->CTRL|=~SysTick_CTRL_ENABLE_Msk;		//关闭SysTick定时器
}

//每隔1us触发中断
void SysTick_Handler(void)
{
	if(Delay_time)
	{
		Delay_time--;								//每1us减一
	}
}

毫秒,秒,分延迟
通过调用微秒延迟实现

void Delay_ms(uint32_t time)
{
	while(time--)
	{
		Delay_us(1000);
	}
}

void Delay_s(uint32_t time)
{
	while(time--)
	{
		Delay_ms(1000);
	}
}
void Delay_min(uint32_t time)
{
	while(time--)
	{
		Delay_s(60);
	}
}

成品

所有文件均可免费下载
CSDN

链接:百度网盘
提取码:n8jz

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值