- 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,这是一个宏,用来指示寄存器的特定位置或进行位屏蔽用的,那么他是如何定义的呢?
|