中级会员
 
- 积分
- 376
- 金钱
- 376
- 注册时间
- 2012-11-7
- 在线时间
- 35 小时
|
delay.c文件
#include "stm32f10x.h"
#include "delay.h"
u32 T_ok=0;//T0~T7为1ms定时时基OK,T8~T15为10ms定时时基OK,T16~T23为100ms定时时基OK,T24~T31为1s定时时基OK
u8 f_1ms_ok=0;//
u16 T_now[32]={0};//将数组元素的高位定义为定时完成标志位,后面的15位定义为延时过去的时间,
//注意1、延时计数范围在1~32767之间;
//2、如果计数值超出这个范围,取下一个定时期间的定时器
//3、如果(T_now & 0x8000)==0x8000,表明设定的定时时间到;
void Stick_Init(void)//SysTick初始化
{
//SystemCoreClock/100 10ms中断一次
//SystemCoreClock/200 5ms中断一次
//SystemCoreClock/1000 1ms中断一次
//SystemCoreClock/100000 10us中断一次
//SystemCoreClock/1000000 1us中断一次
if(SysTick_Config(SystemCoreClock/1000))
{
while(1);
}
else
SysTick->CTRL |=SysTick_CTRL_ENABLE_Msk;//开systick中断使能
}
void T(u8 i,u16 delay_num)//定时器函数,注意i不能大于31,delay_num不能大于32767
{
if((T_now & 0x8000)!=0x8000)
{
if((T_ok & (1<<i))==(1<<i))//时基时间到
{
T_ok &=~(1<<i);
if(delay_num>T_now)
T_now++;
else
T_now=0x8000;
}
}
}
void Init_T(u8 i)//定时器初始化,注意i不能大于31
{
T_now=0;
}
void tick_interrupt(void)//SysTick中断函数中调用的函数
{
static u16 t_num=0;
T_ok |=0x000000ff;//1ms
t_num++;
f_1ms_ok=0xff;
if(t_num % 10==0)
T_ok |=0x0000ff00;//10ms
if(t_num % 100==0)
T_ok |=0x00ff0000;//100ms
if(t_num % 1000==0)
{
T_ok |=0xff000000;//1s
t_num=0;
}
}
delay.h文件
#ifndef __DELAY_H
#define __DELAY_H
extern void Stick_Init(void);
extern void T(u8 i,u16 delay_num);
extern void tick_interrupt(void);
extern void Init_T(u8 i);
extern u8 f_1ms_ok;
extern u16 T_now[32];
#endif
|
|
|