11.22:完善注释;提高代码的移植性;完善串口程序。
This commit is contained in:
130
STM32/Gateway_Node/System/Delay.c
Normal file
130
STM32/Gateway_Node/System/Delay.c
Normal file
@@ -0,0 +1,130 @@
|
||||
#include "Delay.h"
|
||||
|
||||
#if MODE == USE_SYS_TICK
|
||||
|
||||
//<2F><>ʼ<EFBFBD><CABC><EFBFBD>ӳٺ<D3B3><D9BA><EFBFBD>
|
||||
//SYSTICK<43><4B>ʱ<EFBFBD>ӹ̶<D3B9>ΪAHBʱ<42>ӵ<EFBFBD>1/8
|
||||
//SYSCLK:ϵͳʱ<CDB3><CAB1>Ƶ<EFBFBD><C6B5>
|
||||
void vDelayInit(void)
|
||||
{
|
||||
uint8_t ucSYSCLK;
|
||||
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
|
||||
xUcFacInit.ucFacUs=ucSYSCLK/8;
|
||||
xUcFacInit.usFacMs=(uint16_t)xUcFacInit.ucFacUs*1000;
|
||||
}
|
||||
|
||||
//<2F><>ʱnus
|
||||
//nusΪҪ<CEAA><D2AA>ʱ<EFBFBD><CAB1>us<75><73>.
|
||||
void vDelayUs(uint32_t ulNus)
|
||||
{
|
||||
uint32_t ulTemp;
|
||||
SysTick->LOAD=ulNus*xUcFacInit.ucFacUs; //ʱ<><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
|
||||
{
|
||||
ulTemp=SysTick->CTRL;
|
||||
} while((ulTemp&0x01)&&!(ulTemp&(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><>72M<32><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,nms<=1864
|
||||
|
||||
/**
|
||||
* @brief <20><><EFBFBD>뼶<EFBFBD><EBBCB6>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
|
||||
* @note <20><><EFBFBD><EFBFBD>Systick<63><6B>ʱ<EFBFBD><CAB1>Ϊ24λ<34><CEBB>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>ֵΪ0xFFFFFF<46><46>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD>16777215<31><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>0xFFFFFF<46><46><EFBFBD><EFBFBD>ʵ<EFBFBD>ʼ<EFBFBD><CABC>ص<EFBFBD>ֵ<EFBFBD><D6B5>ȡģ<C8A1><C4A3><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1><EFBFBD><EFBFBD><EFBFBD>̡<EFBFBD>
|
||||
* <20><><EFBFBD>Գ<EFBFBD><D4B3><EFBFBD>1.864s<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ᵼ<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¶<EFBFBD>ʱΪxms-16777215<31>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @note <20><><EFBFBD>º<EFBFBD><C2BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>ʱ<EFBFBD>Ƿ<C7B7><F1B3ACB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֳɶ<D6B3><C9B6><EFBFBD>1000ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void vDelayMs(uint16_t usNms)
|
||||
{
|
||||
uint32_t ulTemp;
|
||||
while (usNms)
|
||||
{
|
||||
uint16_t current = (usNms > 1000) ? 1000 : usNms;
|
||||
usNms -= current;
|
||||
|
||||
SysTick->LOAD = (uint32_t)current * xUcFacInit.usFacMs;
|
||||
SysTick->VAL = 0x00;
|
||||
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
|
||||
do
|
||||
{
|
||||
ulTemp = SysTick->CTRL;
|
||||
} while ((ulTemp & 0x01) && !(ulTemp & (1 << 16)));
|
||||
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
||||
SysTick->VAL = 0x00;
|
||||
}
|
||||
}
|
||||
|
||||
#elif MODE == USE_DWT
|
||||
|
||||
void vDelayInit(void)
|
||||
{
|
||||
//ʹ<><CAB9>DWT<57><54><EFBFBD><EFBFBD>
|
||||
DEMCR |= (uint32_t)TRCENA;
|
||||
|
||||
//DWT CYCCNT<4E>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
|
||||
DWT_CYCCNT = (uint32_t)0u;
|
||||
|
||||
//ʹ<><CAB9>Cortex-M3 DWT CYCCNT<4E>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||||
DWT_CTRL |= (uint32_t)DWT_CTRL_CYCCNTENA;
|
||||
}
|
||||
|
||||
// <><CEA2><EFBFBD><EFBFBD>ʱ
|
||||
void vDelayUs(uint32_t ulNus)
|
||||
{
|
||||
if(ulNus > 10000) ulNus = 10000;
|
||||
|
||||
uint32_t ulTicksStart, ulTicksEnd, ulTicksDelay;
|
||||
|
||||
ulTicksStart = DWT_CYCCNT;
|
||||
ulTicksDelay = ( ulNus * ( SystemCoreClock / (1000000) ) ); // <20><><EFBFBD><CEA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵδ<C9B5><CEB4><EFBFBD>
|
||||
ulTicksEnd = ulTicksStart + ulTicksDelay;
|
||||
|
||||
// ulTicksEndû<64><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if ( ulTicksEnd >= ulTicksStart )
|
||||
{
|
||||
// DWT_CYCCNT<4E><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if(DWT_CYCCNT > ulTicksStart)
|
||||
{
|
||||
while( DWT_CYCCNT < ulTicksEnd );
|
||||
}
|
||||
// DWT_CYCCNT<4E><54><EFBFBD><EFBFBD>
|
||||
else
|
||||
{
|
||||
// <20>Ѿ<EFBFBD><D1BE><EFBFBD>ʱ<EFBFBD><CAB1>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD>
|
||||
return;
|
||||
}
|
||||
}
|
||||
else // ulTicksEnd<6E><64><EFBFBD><EFBFBD>
|
||||
{
|
||||
// DWT_CYCCNT<4E><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if(DWT_CYCCNT > ulTicksStart)
|
||||
{
|
||||
// <20>ȴ<EFBFBD>DWT_CYCCNT<4E><54>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
|
||||
while( DWT_CYCCNT > ulTicksEnd );
|
||||
}
|
||||
// <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DWT_CYCCNT<4E><54><EFBFBD><EFBFBD>ulTicksEnd
|
||||
while( DWT_CYCCNT < ulTicksEnd );
|
||||
}
|
||||
}
|
||||
|
||||
void vDelayMs(uint16_t usNms)
|
||||
{
|
||||
for(uint16_t i = 0; i < usNms; i++)
|
||||
{
|
||||
// delay 1 ms
|
||||
vDelayUs(1000);
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
#endif
|
||||
Reference in New Issue
Block a user