初级会员

- 积分
- 82
- 金钱
- 82
- 注册时间
- 2014-8-21
- 在线时间
- 1 小时
|
5金钱
其中有三个文件 我想问关于delay.c的 这个文件下有两个 void delay_us(u32 nus) 以及两个void delay_ms(u16 nms) 到底哪个才是真正的延时函数 同时为什么会有两个呢 ?
#include "delay.h"
#include "sys.h"
//////////////////////////////////////////////////////////////////////////////////
#if SYSTEM_SUPPORT_UCOS
#include "includes.h"
#endif
//////////////////////////////////////////////////////////////////////////////////
//ALIENTEK STM32
static u8 fac_us=0;
static u16 fac_ms=0;
#ifdef OS_CRITICAL_METHOD /
void SysTick_Handler(void)
{
OSIntEnter();
OSTimeTick();
OSIntExit();
}
#endif
void delay_init(u8 SYSCLK)
{
#ifdef OS_CRITICAL_METHOD
u32 reload;
#endif
SysTick->CTRL&=~(1<<2);
fac_us=SYSCLK/8;
#ifdef OS_CRITICAL_METHOD
reload=SYSCLK/8;
reload*=1000000/OS_TICKS_PER_SEC;
fac_ms=1000/OS_TICKS_PER_SEC;
SysTick->CTRL|=1<<1;
SysTick->LOAD=reload;
SysTick->CTRL|=1<<0;
#else
fac_ms=(u16)fac_us*1000;
#endif
}
#ifdef OS_CRITICAL_METHOD //????OS_CRITICAL_METHOD?¨????,???÷????ucosII??.
void delay_us(u32 nus)
{
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD;
ticks=nus*fac_us;
tcnt=0;
OSSchedLock();
told=SysTick->VAL;
while(1)
{
tnow=SysTick->VAL;
if(tnow!=told)
{
if(tnow<told)tcnt+=told-tnow;/
else tcnt+=reload-tnow+told;
told=tnow;
if(tcnt>=ticks)break;
}
};
OSSchedUnlock();
}
void delay_ms(u16 nms)
{
if(OSRunning==TRUE)
{
if(nms>=fac_ms)
{
OSTimeDly(nms/fac_ms);
}
nms%=fac_ms;
}
delay_us((u32)(nms*1000));
}
#else
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us;
SysTick->VAL=0x00;
SysTick->CTRL=0x01 ;
do
{
temp=SysTick->CTRL;
}
while((temp&0x01)&&!(temp&(1<<16)));
SysTick->CTRL=0x00;
SysTick->VAL =0X00;
}
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;
SysTick->VAL =0x00;
SysTick->CTRL=0x01 ;
do
{
temp=SysTick->CTRL;
}
while((temp&0x01)&&!(temp&(1<<16)));
SysTick->CTRL=0x00;
SysTick->VAL =0X00;
}
#endif
|
最佳答案
查看完整内容[请看2#楼]
回复【2楼】STM32VBT6:
---------------------------------
尽管你回答的不是我所问的 还是谢谢你了 我已经搞懂了 看了手册后明白了 一个是使用ucos 一个不使用ucos
|