打印
[应用相关]

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

[复制链接]
297|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yyller|  楼主 | 2020-9-3 18:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
                                    

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

       

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

        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);

        }

               
            

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

241

帖子

1

粉丝