1.SysTick定时器
SysTick定时器也叫滴答定时器,是Cortex-M3的一个外设,嵌在NVIC。它是一个24位向下递减的定时器,每计数一次需要时间是1/SYSTICK,SYSTICK是系统定时器时钟,其可以直接取自系统时钟也可以8分频后取出。当定时器计数到0,将从LOAD寄存器中自动重装初值。如果开启SysTick中断,计数到0就产生一中断信号。只要知道计数次数就知道了计数时间。
滴答9次是1微妙,1000次是1ms
delayms最多延迟1864ms
systick.c
#include "SysTick.h"
static u8 fac_us=0; //us延时倍乘数
static u16 fac_ms=0; //ms延时倍乘数
//初始化延迟函数
//SYSTICK的时钟固定为AHB时钟的1/8
//SYSCLK:系统时钟频率
void SysTick_Init(u8 SYSCLK)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}
/*******************************************************************************
* 函 数 名 : delay_us
* 函数功能 : us延时,
* 输 入 : nus:要延时的us数
注意:nus的值,不要大于798915us(最大值即2^24/fac_us@fac_us=21)
* 输 出 : 无
*******************************************************************************/
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
/*******************************************************************************
* 函 数 名 : delay_ms
* 函数功能 : ms延时,
* 输 入 : nms:要延时的ms数
注意:nms的值,SysTick->LOAD为24位寄存器,
不要大于0xffffff*8*1000/SYSCLK
对72M条件下,nms<=1864ms
* 输 出 : 无
*******************************************************************************/
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms; //时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
systick.h
#ifndef _systick_H
#define _systick_H
#include "system.h"
void SysTick_Init(u8 SYSCLK);
void delay_ms(u16 nms);
void delay_us(u32 nus);
#endif
main.c
#include "systick.h"
#include "led.h"
typedef unsigned int uint;
void delay(uint i)
{
while(i--);
}
int main()
{
SysTick_Init(72);
LED_INIT(); //初始化LED
while(1)
{
led1 = ~led1;
delay_ms(500);
}
}