STM32 SysTick定时器做延时函数
2016-10-12 08:15
330 查看
在STM32中延时函数用的非常广泛,具体延时函数怎么使用,下面我们来进行想详解,本文主要介绍采用SysTick计时器来实验系统延时:
原理介绍:
SysTick计时器是一个24位的倒计数定时器,主要用来做操作系统的定时器,每来一个时钟周期计数减1,当计数到0时,他就会自动从LOAD寄存器中自动重装设置的初值,操作时只要不把CTRL寄存器中的ENABLE位清0,它就永远不会停止,即使在睡眠状态他也还是在继续奋斗。
配置代码如下:
static u8 fac_us=0;//us延时倍乘数
static u16 fac_ms=0;//ms延时倍乘数
//初始化延迟函数
//SYSTICK的时钟固定为HCLK时钟的1/8
//SYSCLK:系统时钟
void delay_init(u8 SYSCLK)
{
SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟 HCLK/8
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}
//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
//延时nus
//nus为要延时的us数.
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
(1)、SysTick->CTRL&=0xfffffffb;选择外部时钟源(PLLCLK)作为系统时钟来源,AHB不分频,之后AHB进行8分频后送到内核,作为STCLK时钟,时钟频率为72/8=9Mhz。
(2)、fac_us=SYSCLK/8; 延时一个us秒需要装入定时器的值,SysTick频率为9mhz,1us时间内,定时器会减9,所以定时1us,装入值为9。
(3)、fac_ms=(u16)fac_us*1000;延时ms秒,直接在us秒基础上乘以1000。
(4)、SysTick->LOAD=(u32)nms*fac_ms;设置延时x nms装入得初值。
(5)、SysTick->VAL =0x00; 清零,进行自动重装
(6)、SysTick->VAL =0X00; 开启定时器
(7)、 do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));不断查询,定时到了硬件置位。
(8)、 SysTick->CTRL=0x00; 时间到了关闭定时器
(9)、 SysTick->VAL =0X00;清空计数器
(10)、延时us函数也是一样的。
(10)、注意LOAD寄存器是24bit寄存器,最大填入数值为2^24,超过了会溢出。
原理介绍:
SysTick计时器是一个24位的倒计数定时器,主要用来做操作系统的定时器,每来一个时钟周期计数减1,当计数到0时,他就会自动从LOAD寄存器中自动重装设置的初值,操作时只要不把CTRL寄存器中的ENABLE位清0,它就永远不会停止,即使在睡眠状态他也还是在继续奋斗。
配置代码如下:
static u8 fac_us=0;//us延时倍乘数
static u16 fac_ms=0;//ms延时倍乘数
//初始化延迟函数
//SYSTICK的时钟固定为HCLK时钟的1/8
//SYSCLK:系统时钟
void delay_init(u8 SYSCLK)
{
SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟 HCLK/8
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}
//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
//延时nus
//nus为要延时的us数.
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
(1)、SysTick->CTRL&=0xfffffffb;选择外部时钟源(PLLCLK)作为系统时钟来源,AHB不分频,之后AHB进行8分频后送到内核,作为STCLK时钟,时钟频率为72/8=9Mhz。
(2)、fac_us=SYSCLK/8; 延时一个us秒需要装入定时器的值,SysTick频率为9mhz,1us时间内,定时器会减9,所以定时1us,装入值为9。
(3)、fac_ms=(u16)fac_us*1000;延时ms秒,直接在us秒基础上乘以1000。
(4)、SysTick->LOAD=(u32)nms*fac_ms;设置延时x nms装入得初值。
(5)、SysTick->VAL =0x00; 清零,进行自动重装
(6)、SysTick->VAL =0X00; 开启定时器
(7)、 do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));不断查询,定时到了硬件置位。
(8)、 SysTick->CTRL=0x00; 时间到了关闭定时器
(9)、 SysTick->VAL =0X00;清空计数器
(10)、延时us函数也是一样的。
(10)、注意LOAD寄存器是24bit寄存器,最大填入数值为2^24,超过了会溢出。
相关文章推荐
- STM32 SysTick定时器常见问题及延时函数的实现
- 利用STM32的SysTick设计精确延时函数
- STM32的时钟(二):SysTick定时器实现Delay()函数
- STM32定时器写精准的延时函数
- stm32 SysTick定时器常见问题和实现延时
- STM32 SysTick定时器
- stm32上最方便的定时器Systick
- STM32---系统滴答定时器(systick)应用
- stm32笔记:Systick系统滴答定时器
- STM32用定时器精确延时的方法
- STM32中的SysTick定时器
- .net micro framework的入门例程-点灯神话-6.使用定时器代替延时函数闪烁LED
- Stm32 Systick定时器
- 关于STM32的systick定时器的详细说明
- 关于STM32的systick定时器的详细说明
- STM32库文件--STM32F10x_StdPeriph_Driver 3.5.0中systick库文件函数不全,添加
- STM32 SysTick定时器应用【worldsing笔记】
- STM32菜鸟成长记录---系统滴答定时器(systick)应用
- 关于STM32的systick定时器的详细说明
- STM32菜鸟学习笔记 系统滴答定时器(systick)