131 1300 0010
其他
当前位置: 首页>> 元件技术>>其他>>
  • 导航栏目
  • 二极管
  • 整流桥
  • MOS管
  • 其他
  • STM32单片机使用定时器中断方式实现毫秒级延时的
    STM32单片机使用定时器中断方式实现毫秒级延时的
  • STM32单片机使用定时器中断方式实现毫秒级延时的
  •   发布日期: 2019-06-04  浏览次数: 1,296

    因为STM32 HAL库中仅有对HAl_Delay()毫秒级的延时,为实现精确的微秒级延时,就不得不修改Systick,但由于HAL库内部使用其作为超时判断等操作,对其修改会发生不可预期的错误,不建议修改。因此,使用通用定时器进行定时操作。

    STM32单片机使用定时器中断方式实现毫秒级延时的设计

     

    参考网上例程,使用定时器中断方式实现延时,代码如下:

    TIM3溢出时间=72MHz/(71+1)/(0+1)=1Mhz=1us

    计数模式:向上计数模式

    使能TIM3中断

    */

    __IO staTIc uint32_t usDelay=0;

    void Delayms(uint32_t ms)

    {

    Delayus(ms*1000);

    }

    void Delayus(uint32_t us)

    {

    usDelay=us;

    HAL_TIM_Base_Start_IT(&htim3);

    while(usDelay);

    HAL_TIM_Base_Stop_IT(&htim3);

    }

    //重写回调函数

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

    {

    if(htim-》Instance == TIM3)

    {

    if(usDelay!=0)

    {

    usDelay--;

    }

    }

    }

    虽然说以上程序的并没什么错误,但在实际运行中,却无法得到正确的运行。同时,在进行Debug调试时,单步执行又可以正常运行。

    主要原因在于:中断间隔时间太短,导致中断函数还没有运行完成,其中断标志位却再次置位,导致在程序卡死。

    因此,关闭定时器中断,采用定时器轮询的方式实现延时,代码如下:

    /*

    TIM3溢出时间=72MHz/(71+1)/(0+1)=1Mhz=1us

    计数模式:向下计数模式

    */

    void Delay_us(uint32_t us){

    uint16_t counter=us&0xffff;

    HAL_TIM_Base_Start(&htim3);

    __HAL_TIM_SetCounter(&htim3,counter);

    while(counter》1)

    {

    counter=__HAL_TIM_GetCounter(&htim3);

    }

    HAL_TIM_Base_Stop(&htim3);

    }

    void Delay_ms(uint32_t ms){

    Delay_us(1000*ms);

    }


  • ·上一篇:
    ·下一篇:
  • 其他关联资讯
    深圳市日月辰科技有限公司
    地址:深圳市宝安区松岗镇潭头第二工业城A区27栋3楼
    电话:0755-2955 6626
    传真:0755-2978 1585
    手机:131 1300 0010
    邮箱:hu@szryc.com

    深圳市日月辰科技有限公司 版权所有:Copyright©2010-2023 www.szryc.com 电话:13113000010 粤ICP备2021111333号