STM32 延时处理总结

最近在处理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=nus
fac_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–;
}
}

采用以上方式后,针对特定延时需求,可采用新建变量递减的方式来处理

你可能感兴趣的:(STM32 延时处理总结)