SysTick定时器应用过程:
1、设置时钟源,一般选参考时钟HCLK/8
2、设置定时器初值
3、将计数器清0(写任意数到VAL,VAL都会清0)
4、启动定时器
5、等待计数结束
6、关闭定时器
main.c
nt main(void)
{
Stm32_Clock_Init(336,8,2,7);//系统时钟初始化
LED_Init();//LED灯初始化
BEEP_Init();
while(1)
{
LED0 = 0; BEEP = 1; //led0亮beep响
Delay_ms(1000); //延时1s
LED0 = 1; BEEP = 0; //led0灭led1亮
Delay_ms(1000);
}
}
封装结构体:
typedef struct
{
volatile u32 CTRL;
volatile u32 LOAD;
volatile u32 VAL;
volatile u32 CALIB;
}SysTick_TypeDef;
#define SysTick ((SysTick_TypeDef*)0xe000e010)
sys.c
//delay_xms()只能进行<798ms的延时
void Delay_xms(u16 xms)
{
u32 num=21000;
if(xms>798)
return;
SysTick->CTRL&=~(1<<2);//1.设置时钟源,一般选参考时钟HCLK/8=21MHZ
SysTick->LOAD=xms*num;//2.设置定时器初值
SysTick->VAL=0; //3.将计数器清0(写任意数到VAL,VAL都会清0)
SysTick->CTRL|=(1<<0);//4.启动定时器->bit0=1
while((SysTick->CTRL&(1<<16))==0);//5.等待计数结束->bit16=1
SysTick->CTRL&=~(1<<0);//6.关闭定时器->bit0=0
}
//delay_ms()可以进行>798ms的延时
void Delay_ms(u16 ms)
{
u16 repeat=0,remain=0;
repeat=ms/500;//调用Delay_xms(500)合计repeat次
remain=ms%500;//将剩余的数最后调用Delay_xms(remain)
while(repeat)
{
Delay_xms(500);
repeat--;
}
if(remain>0)
Delay_xms(remain);
}