65 lines
1.9 KiB
C
65 lines
1.9 KiB
C
#include "SysTick.h"
|
||
|
||
#if SYSTEM == SYSTEM_NONE
|
||
//初始化延迟函数
|
||
//SYSTICK的时钟固定为AHB时钟的1/8
|
||
//SYSCLK:系统时钟频率
|
||
void vSysTickInit(uint8_t ucSYSCLK)
|
||
{
|
||
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
|
||
xUcFacInit.ucFacUs=ucSYSCLK/8;
|
||
xUcFacInit.usFacMs=(uint16_t)xUcFacInit.ucFacUs*1000;
|
||
}
|
||
|
||
//延时nus
|
||
//nus为要延时的us数.
|
||
void vDelayUs(uint32_t ulNus)
|
||
{
|
||
uint32_t ulTemp;
|
||
SysTick->LOAD=ulNus*xUcFacInit.ucFacUs; //时间加载
|
||
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; //清空计数器
|
||
}
|
||
|
||
//延时nms
|
||
//注意nms的范围
|
||
//SysTick->LOAD为24位寄存器,所以,最大延时为:
|
||
//nms<=0xffffff*8*1000/SYSCLK
|
||
//SYSCLK单位为Hz,nms单位为ms
|
||
//对72M条件下,nms<=1864
|
||
|
||
/**
|
||
* @brief 毫秒级延时函数
|
||
* @note 由于Systick定时器为24位定时器,其装载的最大值为0xFFFFFF,也就是16777215,如果加载的值超过0xFFFFFF,则实际加载的值是取模后的值,导致延时时间缩短。
|
||
* 所以超过1.864s的延时会导致计数器溢出,从而导致定时为xms-16777215的结果。
|
||
* @note 如下函数会判断延时是否超过最大延时,若超过则分成多次1000ms处理。
|
||
* @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;
|
||
}
|
||
}
|
||
#endif
|