最近在处理STM32的软件,在延时时,发现采用新建变量,在SysTick_Handler中递减的方式有异常。后查询到发现是另外一种的延时函数有影响,如下这种:
/延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff81000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nmsfac_ms;//时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
//延时nus
//nus为要延时的us数.
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nusfac_us; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
以上两种的延时函数运行是均会对SysTick_Handler中的函数运行有影响,具体影响网上有文章,不详述。后采用如下这种方式:
/**
-
@brief
-
@param
-
@arg nTime: time_DelayMs
-
@retval
*/
void time_DelayMs(__IO u32 nDelayTime)
{
timingDelay = nDelayTime;// Enable SysTick
//SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
while(timingDelay != 0);
}
void timingDelay_Decrement( void )// 此函数放入SysTick_Handler中随着滴答定时器的中断来不断递减。
{
//DEBUG_PRINTF( printf( “timingDelay = %d… \r\n”, timingDelay ) );
if ( timingDelay != 0 )
{
timingDelay–;
}
}
采用以上方式后,针对特定延时需求,可采用新建变量递减的方式来处理