’
.
STM32
的几种延时方法(基于
MDK
固件库
3.0
,晶振
8M
)
单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时
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))