对于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(