中级会员
 
- 积分
- 298
- 金钱
- 298
- 注册时间
- 2014-1-9
- 在线时间
- 8 小时
|

楼主 |
发表于 2014-6-21 16:49:03
|
显示全部楼层
static u8 fac_us=0;//us???±±?????
static u16 fac_ms=0;//ms???±±?????
//??????????????
//?±????ucos???±?ò,???????á??????ucos???±??????
//SYSTICK???±?????¨??HCLK?±????1/8
//SYSCLK:?????±??
void delay_init()
{
#ifdef OS_CRITICAL_METHOD //????OS_CRITICAL_METHOD?¨????,???÷????ucosII??.
u32 reload;
#endif
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //?????????±?? HCLK/8
fac_us=SystemCoreClock/8000000; //???????±????1/8
#ifdef OS_CRITICAL_METHOD //????OS_CRITICAL_METHOD?¨????,???÷????ucosII??.
reload=SystemCoreClock/8000000; //???????????????? ??????K
reload*=1000000/OS_TICKS_PER_SEC;//?ù??OS_TICKS_PER_SEC?è?¨?????±??
//reload??24???????÷,×??ó??:16777216,??72M??,????1.86s×ó??
fac_ms=1000/OS_TICKS_PER_SEC;//?ú±íucos???????±??×???????
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //????SYSTICK????
SysTick->LOAD=reload; //??1/OS_TICKS_PER_SEC??????????
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //????SYSTICK
#else
fac_ms=(u16)fac_us*1000;//·?ucos??,?ú±í????ms?è????systick?±????
#endif
}
#ifdef OS_CRITICAL_METHOD //??????ucos
//???±nus
//nus???????±??us??.
void delay_us(u32 nus)
{
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD; //LOAD????
ticks=nus*fac_us; //?è??????????
tcnt=0;
told=SysTick->VAL; //???????±???????÷??
while(1)
{
tnow=SysTick->VAL;
if(tnow!=told)
{
if(tnow<told)tcnt+=told-tnow;//????×???????SYSTICK?????????????????÷????????.
else tcnt+=reload-tnow+told;
told=tnow;
if(tcnt>=ticks)break;//?±??????/?????????????±??,?ò????.
}
};
}
//???±nms
//nms:?????±??ms??
void delay_ms(u16 nms)
{
if(OSRunning==OS_TRUE)//????os??????????
{
if(nms>=fac_ms)//???±???±???ó??ucos??×????±??????
{
OSTimeDly(nms/fac_ms);//ucos???±
}
nms%=fac_ms; //ucos??????·¨?á?????????????±??,???????¨·??????±
}
delay_us((u32)(nms*1000)); //???¨·??????±,???±ucos??·¨?????÷??.
}
#else//????ucos?±
//???±nus
//nus???????±??us??.
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //?±??????
SysTick->VAL=0x00; //?????????÷
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //????????
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//?????±??????
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //??±??????÷
SysTick->VAL =0X00; //?????????÷
}
//???±nms
//×???nms??·??§
//SysTick->LOAD??24???????÷,?ù??,×??ó???±??:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK??????Hz,nms??????ms
//??72M??????,nms<=1864
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;//?±??????(SysTick->LOAD??24bit)
SysTick->VAL =0x00; //?????????÷
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //????????
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//?????±??????
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //??±??????÷
SysTick->VAL =0X00; //?????????÷
}
#endif |
|