SysTick.h
#ifndef __SYSTICK_H__
#define __SYSTICK_H__
#include "stm32f10x.h"
void SysTick_Init(void);
void Delay_us(__IO u32 nTime);
#endif
SysTick.c
#include "SysTick.h"
#include "stm32f10x.h"
static __IO u32 TimingDelay;
void SysTick_Init(void)
{
if(SysTick_Config(SystemCoreClock/100000))
{
while(1);
}
//关闭滴答定时器
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
void TimingDelay_Decrement(void)
{
if(TimingDelay != 0x00)
{
TimingDelay--;
}
}
void Delay_us(__IO u32 nTime)
{
TimingDelay = nTime;
//使能滴答定时器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
while(TimingDelay != 0);
}
中断函数,在stm32f10xit.c
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
修改main.c如下
#include "stm32f10x.h"
#include "led.h"
#include "SysTick.h"
int main(void)
{
//LED端初始化
LED_GPIO_Config();
//配置SysTick为10us中断一次
SysTick_Init();
while(1)
{
LED1(0);
Delay_us(50000);
LED1(1);
LED2(0);
Delay_us(50000);
LED2(1);
LED3(0);
Delay_us(50000);
LED3(1);
LED4(0);
Delay_us(50000);
LED4(1);
}
}
这里面只有两个函数,SysTick_Init()和Delay_us(),一个是配置SysTick定时器,一个是进行精确延时
中断函数也只是运行了一个自定义函数,看看不难理解
SysTick_Config(SystemCoreClock/100000);
SystemCoreClock是系统时钟的宏,SystemCoreClock = 72000000
我们的计时总时间 T = tick * (1/f),tick为SysTick_Config()的输入参数
1/f为SysTick timer使用的时钟源的时钟周期,f为该时钟源的时钟频率。
上面的语句中:tick = SystemCoreClock/100000=720,表示720个时钟周期中断一次,1/f是时钟周期的时间,1/f = 1/72us,所以T = 720*(1/72) = 10us
SysTick_CTRL_ENABLE_Msk,这是一个宏,用来指示寄存器的特定位置或进行位屏蔽用的,那么他是如何定义的呢?
|