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–;
}
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值