186 lines
4.3 KiB
C
186 lines
4.3 KiB
C
|
#include "delay.h"
|
|||
|
#include "sys.h"
|
|||
|
//////////////////////////////////////////////////////////////////////////////////
|
|||
|
//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>ucos,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
#if SYSTEM_SUPPORT_UCOS
|
|||
|
#include "includes.h" //ucos ʹ<><CAB9>
|
|||
|
#endif
|
|||
|
//////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
//ʹ<><CAB9>SysTick<63><6B><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ӳٽ<D3B3><D9BD>й<EFBFBD><D0B9><EFBFBD>(֧<><D6A7>ucosii)
|
|||
|
//<2F><><EFBFBD><EFBFBD>delay_us,delay_ms
|
|||
|
//STM32F4<46><34><EFBFBD><EFBFBD>-<2D>⺯<EFBFBD><E2BAAF><EFBFBD>汾
|
|||
|
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>http://mcudev.taobao.com
|
|||
|
//********************************************************************************
|
|||
|
//<2F><EFBFBD>˵<EFBFBD><CBB5>
|
|||
|
//<2F><>
|
|||
|
//////////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
static u8 fac_us=0;//us<75><73>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
static u16 fac_ms=0;//ms<6D><73>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>ucos<6F><73>,<2C><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ms<6D><73>
|
|||
|
|
|||
|
#ifdef OS_CRITICAL_METHOD //<2F><><EFBFBD><EFBFBD>OS_CRITICAL_METHOD<4F><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,˵<><CBB5>ʹ<EFBFBD><CAB9>ucosII<49><49>.
|
|||
|
//systick<63>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,ʹ<><CAB9>ucosʱ<73>õ<EFBFBD>
|
|||
|
void SysTick_Handler(void)
|
|||
|
{
|
|||
|
OSIntEnter(); //<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
OSTimeTick(); //<2F><><EFBFBD><EFBFBD>ucos<6F><73>ʱ<EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
OSIntExit(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
//<2F><>ʼ<EFBFBD><CABC><EFBFBD>ӳٺ<D3B3><D9BA><EFBFBD>
|
|||
|
//<2F><>ʹ<EFBFBD><CAB9>ucos<6F><73>ʱ<EFBFBD><CAB1>,<2C>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ucos<6F><73>ʱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>
|
|||
|
//SYSTICK<43><4B>ʱ<EFBFBD>ӹ̶<D3B9>ΪHCLKʱ<4B>ӵ<EFBFBD>1/8
|
|||
|
//SYSCLK:ϵͳʱ<CDB3><CAB1>
|
|||
|
void delay_init(u8 SYSCLK)
|
|||
|
{
|
|||
|
#ifdef OS_CRITICAL_METHOD //<2F><><EFBFBD><EFBFBD>OS_CRITICAL_METHOD<4F><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,˵<><CBB5>ʹ<EFBFBD><CAB9>ucosII<49><49>.
|
|||
|
u32 reload;
|
|||
|
#endif
|
|||
|
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
|
|||
|
fac_us=SYSCLK/8; //<2F><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9>ucos,fac_us<75><73><EFBFBD><EFBFBD>Ҫʹ<D2AA><CAB9>
|
|||
|
|
|||
|
#ifdef OS_CRITICAL_METHOD //<2F><><EFBFBD><EFBFBD>OS_CRITICAL_METHOD<4F><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,˵<><CBB5>ʹ<EFBFBD><CAB9>ucosII<49><49>.
|
|||
|
reload=SYSCLK/8; //ÿ<><C3BF><EFBFBD>ӵļ<D3B5><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>λΪK
|
|||
|
reload*=1000000/OS_TICKS_PER_SEC;//<2F><><EFBFBD><EFBFBD>OS_TICKS_PER_SEC<45>趨<EFBFBD><E8B6A8><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|||
|
//reloadΪ24λ<34>Ĵ<EFBFBD><C4B4><EFBFBD>,<2C><><EFBFBD><EFBFBD>ֵ:16777216,<2C><>168M<38><4D>,Լ<><D4BC>0.7989s<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
fac_ms=1000/OS_TICKS_PER_SEC;//<2F><><EFBFBD><EFBFBD>ucos<6F><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ٵ<EFBFBD>λ
|
|||
|
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //<2F><><EFBFBD><EFBFBD>SYSTICK<43>ж<EFBFBD>
|
|||
|
SysTick->LOAD=reload; //ÿ1/OS_TICKS_PER_SEC<45><43><EFBFBD>ж<EFBFBD>һ<EFBFBD><D2BB>
|
|||
|
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //<2F><><EFBFBD><EFBFBD>SYSTICK
|
|||
|
#else
|
|||
|
fac_ms=(u16)fac_us*1000;//<2F><>ucos<6F><73>,<2C><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>ms<6D><73>Ҫ<EFBFBD><D2AA>systickʱ<6B><CAB1><EFBFBD><EFBFBD>
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
#ifdef OS_CRITICAL_METHOD //<2F><><EFBFBD><EFBFBD>OS_CRITICAL_METHOD<4F><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,˵<><CBB5>ʹ<EFBFBD><CAB9>ucosII<49><49>.
|
|||
|
//<2F><>ʱnus
|
|||
|
//nus:Ҫ<><D2AA>ʱ<EFBFBD><CAB1>us<75><73>.
|
|||
|
void delay_us(u32 nus)
|
|||
|
{
|
|||
|
u32 ticks;
|
|||
|
u32 told,tnow,tcnt=0;
|
|||
|
u32 reload=SysTick->LOAD; //LOAD<41><44>ֵ
|
|||
|
ticks=nus*fac_us; //<2F><>Ҫ<EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
tcnt=0;
|
|||
|
OSSchedLock(); //<2F><>ֹucos<6F><73><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>us<75><73>ʱ
|
|||
|
told=SysTick->VAL; //<2F>ս<EFBFBD><D5BD><EFBFBD>ʱ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
while(1)
|
|||
|
{
|
|||
|
tnow=SysTick->VAL;
|
|||
|
if(tnow!=told)
|
|||
|
{
|
|||
|
if(tnow<told)tcnt+=told-tnow;//<2F><><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>һ<EFBFBD><D2BB>SYSTICK<43><4B>һ<EFBFBD><D2BB><EFBFBD>ݼ<EFBFBD><DDBC>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
else tcnt+=reload-tnow+told;
|
|||
|
told=tnow;
|
|||
|
if(tcnt>=ticks)break;//ʱ<>䳬<EFBFBD><E4B3AC>/<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD>ӳٵ<D3B3>ʱ<EFBFBD><CAB1>,<2C><><EFBFBD>˳<EFBFBD>.
|
|||
|
}
|
|||
|
};
|
|||
|
OSSchedUnlock(); //<2F><><EFBFBD><EFBFBD>ucos<6F><73><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
//<2F><>ʱnms
|
|||
|
//nms:Ҫ<><D2AA>ʱ<EFBFBD><CAB1>ms<6D><73>
|
|||
|
void delay_ms(u16 nms)
|
|||
|
{
|
|||
|
if(OSRunning==OS_TRUE&&OSLockNesting==0)//<2F><><EFBFBD><EFBFBD>os<6F>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
if(nms>=fac_ms)//<2F><>ʱ<EFBFBD><CAB1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ucos<6F><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
OSTimeDly(nms/fac_ms); //ucos<6F><73>ʱ
|
|||
|
}
|
|||
|
nms%=fac_ms; //ucos<6F>Ѿ<EFBFBD><D1BE><EFBFBD><DEB7>ṩ<EFBFBD><E1B9A9>ôС<C3B4><D0A1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>ʽ<EFBFBD><CABD>ʱ
|
|||
|
}
|
|||
|
delay_us((u32)(nms*1000)); //<2F><>ͨ<EFBFBD><CDA8>ʽ<EFBFBD><CABD>ʱ
|
|||
|
}
|
|||
|
#else //<2F><><EFBFBD><EFBFBD>ucosʱ
|
|||
|
//<2F><>ʱnus
|
|||
|
//nusΪҪ<CEAA><D2AA>ʱ<EFBFBD><CAB1>us<75><73>.
|
|||
|
//ע<><D7A2>:nus<75><73>ֵ,<2C><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>798915us
|
|||
|
void delay_us(u32 nus)
|
|||
|
{
|
|||
|
u32 temp;
|
|||
|
SysTick->LOAD=nus*fac_us; //ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
SysTick->VAL=0x00; //<2F><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
|||
|
do
|
|||
|
{
|
|||
|
temp=SysTick->CTRL;
|
|||
|
}
|
|||
|
while((temp&0x01)&&!(temp&(1<<16)));//<2F>ȴ<EFBFBD>ʱ<EFBFBD>䵽<EFBFBD><E4B5BD>
|
|||
|
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //<2F>رռ<D8B1><D5BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
SysTick->VAL =0X00; //<2F><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
//<2F><>ʱnms
|
|||
|
//ע<><D7A2>nms<6D>ķ<EFBFBD>Χ
|
|||
|
//SysTick->LOADΪ24λ<34>Ĵ<EFBFBD><C4B4><EFBFBD>,<2C><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱΪ:
|
|||
|
//nms<=0xffffff*8*1000/SYSCLK
|
|||
|
//SYSCLK<4C><4B>λΪHz,nms<6D><73>λΪms
|
|||
|
//<2F><>168M<38><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,nms<=798ms
|
|||
|
void delay_xms(u16 nms)
|
|||
|
{
|
|||
|
u32 temp;
|
|||
|
SysTick->LOAD=(u32)nms*fac_ms;//ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(SysTick->LOADΪ24bit)
|
|||
|
SysTick->VAL =0x00; //<2F><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
|||
|
do
|
|||
|
{
|
|||
|
temp=SysTick->CTRL;
|
|||
|
}
|
|||
|
while((temp&0x01)&&!(temp&(1<<16)));//<2F>ȴ<EFBFBD>ʱ<EFBFBD>䵽<EFBFBD><E4B5BD>
|
|||
|
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //<2F>رռ<D8B1><D5BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
SysTick->VAL =0X00; //<2F><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
//<2F><>ʱnms
|
|||
|
//nms:0~65535
|
|||
|
void delay_ms(u16 nms)
|
|||
|
{
|
|||
|
u8 repeat=nms/540; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>540,<2C>ǿ<EFBFBD><C7BF>ǵ<EFBFBD>ijЩ<C4B3>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD>ܳ<EFBFBD>Ƶʹ<C6B5><CAB9>,
|
|||
|
//<2F><><EFBFBD>糬Ƶ<E7B3AC><C6B5>248M<38><4D>ʱ<EFBFBD><CAB1>,delay_xms<6D><73><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>ʱ541ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
u16 remain=nms%540;
|
|||
|
while(repeat)
|
|||
|
{
|
|||
|
delay_xms(540);
|
|||
|
repeat--;
|
|||
|
}
|
|||
|
if(remain)delay_xms(remain);
|
|||
|
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|