单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us(
)和毫秒级delay_ms(
)。1.普通延时法这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番功夫。下面的代码是在网上搜到的,经测试延时比较精准。//粗延时函数,微秒
void delay_us(u16 time)
{
u16 i=0;
while(time--)
{
i=10; //自己定义
while(i--) ;
}
}
//毫秒级的延时
void delay_ms(u16 time)
{
u16 i=0;
while(time--)
{
i=12000; //自己定义
while(i--) ;
}
}2.SysTick 定时器延时CM3 内核的处理器,内部包含了一个SysTick
定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD
寄存器中自动重装载定时初值。只要不把它在SysTick
控制及状态寄存器中的使能位清除,就永不停息。SysTick 在STM32
的参考手册里面介绍的很简单,其详细介绍,请参阅《Cortex-M3 权威指南》。
这里面也有两种方式实现:a.中断方式
如下,定义延时时间time_delay,SysTick_Config()定义中断时间段,在中断中递减time_delay,从而实现延时。
volatile unsigned long time_delay; //
延时时间,注意定义为全局变量
//延时n_ms
void delay_ms(volatile unsigned long nms)
{
//SYSTICK分频--1ms的系统时钟中断
if (SysTick_Config(SystemFrequency/1000))
{
while (1);
}
time_delay=nms;//读取定时时间
while(time_delay);
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
//延时nus
void delay_us(volatile unsigned long nus)
{
//SYSTICK分频--1us的系统时钟中断
if (SysTick_Config(SystemFrequency/1000000))
{
while (1);
}
time_delay=nus;//读取定时时间
while(time_delay);
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
} //在中断中将time_delay递减。实现延时void
SysTick_Handler(void)
{
if(time_delay)
time_delay--;
单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us(
)和毫秒级delay_ms(
)。1.普通延时法这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番功夫。下面的代码是在网上搜到的,经测试延时比较精准。//粗延时函数,微秒
void delay_us(u16 time)
{
u16 i=0;
while(time--)
{
i=10; //自己定义
while(i--) ;
}
}
//毫秒级的延时
void delay_ms(u16 time)
{
u16 i=0;
while(time--)
{
i=12000; //自己定义
while(i--) ;
}
}2.SysTick 定时器延时CM3 内核的处理器,内部包含了一个SysTick
定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD
寄存器中自动重装载定时初值。只要不把它在SysTick
控制及状态寄存器中的使能位清除,就永不停息。SysTick 在STM32
的参考手册里面介绍的很简单,其详细介绍,请参阅《Cortex-M3 权威指南》。
这里面也有两种方式实现:a.中断方式
如下,定义延时时间time_delay,SysTick_Config()定义中断时间段,在中断中递减time_delay,从而实现延时。
volatile unsigned long time_delay; //
延时时间,注意定义为全局变量
//延时n_ms
void delay_ms(volatile unsigned long nms)
{
//SYSTICK分频--1ms的系统时钟中断
if (SysTick_Config(SystemFrequency/1000))
{
while (1);
}
time_delay=nms;//读取定时时间
while(time_delay);
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
//延时nus
void delay_us(volatile unsigned long nus)
{
//SYSTICK分频--1us的系统时钟中断
if (SysTick_Config(SystemFrequency/1000000))
{
while (1);
}
time_delay=nus;//读取定时时间
while(time_delay);
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
} //在中断中将time_delay递减。实现延时void
SysTick_Handler(void)
{
if(time_delay)
time_delay--;
}b.非中断方式主要仿照原子的《STM32不完全手册》。SYSTICK 的时钟固定为HCLK
时钟的1/8,在这里我们选用内部时钟源72M,所以SYSTICK的时钟为9M,即SYSTICK定时器以9M的频率递减。SysTick
主要包含CTRL、LOAD、VAL、CALIB 等4
个寄存器,SysTick->CTRL位段名称类型复位值描述
16COUNTFLAGR0如果在上次读本寄存器后systick已为0,则该位为1,若
读该位自动清零
2CLKSOURCERW00:外部时钟源 1:内部时钟
1TICKINTRW00:减到0无动作;1:减到0产生systick异常请求
0ENABLERW0systick定时器使能位
SysTick-> LOAD位段名称类型复位值描述
23:0RELOADRW0减到0时被重新装载的值
SysTick-> VAL位段名称类型复位值描述
23:0CURRENTRW0读取时返回当前倒计数的值,写则清零,同时还会清除在systick控制及状态寄存器中的COUNTFLAG
标志
SysTick-> CALIB
不常用,在这里我们也用不到,故不介绍了。程序如下,相当于查询法。//仿原子延时,不进入systic中断
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD = 9*nus;
SysTick->VAL=0X00;//清空计数器
SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
do
{
temp=SysTick->CTRL;//读取当前倒计数值
}while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD = 9000*nms;
SysTick->VAL=0X00;//清空计数器
SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
do
{
temp=SysTick->CTRL;//读取当前倒计数值
}while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}三种方式各有利弊,第一种方式容易理解,但不太精准。第二种方式采用库函数,编写简单,由于中断的存在,不利于在其他中断中调用此延时函数。第三种方式直接操作寄存器,看起来比较繁琐,其实也不难,同时克服了以上两种方式的缺点,个人感觉比较好用。
stm32中Delay()函数延时的时间是怎么计算的
time_delay=nus;\/\/读取定时时间 while(time_delay);SysTick->CTRL=0x00; \/\/关闭计数器 SysTick->VAL =0X00; \/\/清空计数器 } \/\/在中断中将time_delay递减。实现延时void SysTick_Handler(void){ if(time_delay)time_delay--;
STM32delay函数延时如何计算
根据你的时钟频率计算的,1个延时差不多运算一次,减一次数,比如48MHZ,延时10000就是(10000\/48MHZ)秒
...请问这个延时是怎么计算(详细过程) void Delay(vu32 nCount) { fo...
所以nCoun=72000 时 是延时1ms
delay函数是如何计算延时的
首先取决于你的时钟频率选定为多少。以24位的SysTick定时器为例,在3.5版本的库函数(该版本简化了对该计时器的配置函数)中,调用函数 SystemInit(); 初始化SysTick计时器为STM32主时钟的8分频,假设主频达到72MHz 则此时计时器的频率为9MHz,即1秒可 向下记数 9000000(9M)次。f=9MHz,所以...
delay500延迟了多少秒
STM32CUBEMX自动生成情况下,默认为延时1ms单位,即HAL_Delay(500)表示500ms延时 简单比喻一次振荡需要1us,那1ms就是1000次振荡,300ms就是300x1000次振荡,这样就能大概的计算出300ms delay;这得看你的CPU运行一条指令得多久,像单片机89C51一般一条1us。
如何用STM32延时到1微妙以下
以SysTick的初值是720为例,系统时钟为72m。SysTick记720个数产生一次中断。这样算也就是1秒产生100000次中断(1次10us)。当Delay(x)中x大于0时会将x传给一个全局的变量使他在每发生一次中断之后自减1.系统卡在等待这个变量变为零的死循环上直到这个全局来量变为零。
STM32中,systick具体延时时间怎么计算的?
\/\/延时函数 void Delay_10us(unsigned long Countlinef){ SYSTICK_CSR |= 0x07; \/\/启动SysTick使能 SysTick_Delay = Countlinef; \/\/把延时变量赋值SysTick_Delay全局变量 while(SysTick_Delay != 0); \/\/判断延时时间是否到 SYSTICK_CSR |= 0x06; \/\/时间到关闭 SysTick使能用的时候...
delay函数怎么使用来延长时间?
函数名: delay 功 能: 将程序的执行暂停一段时间(毫秒)用 法: void delay(unsigned milliseconds);程序例:\/* Emits a 440-Hz tone for 500 milliseconds *\/ include<dos.h> int main(void){ sound(440);delay(500);nosound();return 0;} ...
STM32中,systick具体延时时间怎么计算的?
TimingDelay =nTime; \/\/ 读取延时时间 SysTick_CSR=0x07; \/\/ 使能SysTick计数器 while(TimingDelay!= 0); \/\/ 判断延时是否结束 SysTick_CSR=0x06;\/\/ 关闭SysTick计数器 } void Delay_Nus(uint32_t nTime) \/\/us级的延时函数 { SysTick_Current=0;SysTick_Reload=72; \/\/重装载寄存器...
STM32的空指令延时函数求答疑
void Delay(__IO u32 nCount)是一个带形参的函数,使用的时候如void Delay(5000),就是5000自减,减到0为止。for(; nCount != 0; nCount--);也就是for(nCount=0; nCount != 0; nCount--);