STM32延时不同写法

本文介绍了STM32延时的三种方法:普通延时函数、定时器计数和Systick定时器。普通延时简单但不精准,定时器计数提高精度但占用CPU资源,Systick定时器则能实现精准延时并优化资源利用。通过Systick_Config()配置中断时间,并结合时间与频率公式计算延迟。延时函数需用到全局volatile变量,中断处理需注意固件库的systick中断函数处理。
摘要由CSDN通过智能技术生成

对于STM32系列的延时函数有着不同的写法,本章将给大家带来最简单的延时到最精准延时函数的各种写法及原理。
在STM32系列中要学会用好systick定时器,这很重要

一.普通延时函数

原理
用C中累加或者累减的方法,到一定条件后就退出。
好处
好写,用for循环或者while循环,不用去理解各种有关底层硬件的寄存器。
坏处
延时不精准,误差大,让CPU持续空跑,大大浪费CPU资源。

void delay(uint16 i)
{
	#if 0
	while(i--)
	{}
	#endif
	for(int j=0;j<i;j++)
	{}
}

二.定时器计数

在32中,使用定时器的地方很多,所以对于32中各种稀缺的外设资源极其珍贵,用好各种外设对于小白来说是关键的一步。
原理
采用C中累加原理,选定某一定时器,通过计数器来产生中断。
好处
可达到精准延时,但会使CPU在定时器中持续累加或累减,占用CPU资源。

这里随便举的一个例子

void TIM4_Init(u16 ar,u16 rs)
{
	TIM_TimeBaseInitTypeDef TIM_InitStrue;
	NVIC_InitTypeDef NVIC_InitStrue;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能定时器时钟
	
	TIM_InitStrue.TIM_Period=ar;//自动装载值
	TIM_InitStrue.TIM_Prescaler=rs;//预分频系数的设置
	TIM_InitStrue.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_InitStrue.TIM_ClockDivision=TIM_CKD_DIV1;//设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseInit(TIM4,&TIM_InitStrue);//初始化定时器,对定时器进行配置
	
	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);//开启定时器中断
	
	NVIC_InitStrue.NVIC_IRQChannel=TIM4_IRQn;
	NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=2;
	NVIC_InitStrue.NVIC_IRQChannelSubPriority=2;
	NVIC_Init(&NVIC_InitStrue);//初始化中断,设置中断的优先级

	TIM_Cmd(TIM4,ENABLE);//使能定时器
}

void TIM4_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET)
	{
		LED1=!LED1;
		TIM_ClearITPendingBit(TIM4,TIM_IT_Update);//清除中断标志位
	}
}	

三、Systick定时器

关于滴答定时器,我的理解为可以替代所有的定时器中有关涉及到时间的问题配置,可以让定时器更好的配合其他功能使用,而定时器中的计数器寄存器可以用于PID之类,更好的控制精度。

在此处介绍两种有关Systcik定时器的使用方法

(1).同样运用CPU持续在滴答定时器进行计数

void delay_us(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值