• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

stm32滴答定时器用中断还是用非中断?

liuxiaofei126 2018-10-10 浏览量:3027
stm32滴答定时器用中断还是用非中断?
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 首先是中断要比查询方式不耗费指令,主程序可以完成其它任务。

    其次,如代码中所示。uwTick是个全局变量,任何功能都可以拿uwTick当作计数源。

    比如HAL库里的延时函数是这么写的:

    void HAL_Delay(uint32_t Delay)
    {
      uint32_t tickstart = HAL_GetTick(); //取得当前Tick计数值
      uint32_t wait = Delay;


      /* Add a freq to guarantee minimum wait */
      if (wait < HAL_MAX_DELAY)
      {
        wait += (uint32_t)(uwTickFreq); //算出延时结束时的计数值
      }


      while ((HAL_GetTick() - tickstart) < wait)//进入循环,等待当前Tick等于结束时的Tick
      {
      }
    }


    再看另一处代码,这里不是简单地延时,而是等待超时

    static HAL_StatusTypeDef RTC_EnterInitMode(RTC_HandleTypeDef* hrtc)
    {
      uint32_t tickstart = 0U;
     
      tickstart = HAL_GetTick();  //取出当前Tick
      /* Wait till RTC is in INIT state and if Time out is reached exit */
      while((hrtc->Instance->CRL & RTC_CRL_RTOFF) == (uint32_t)RESET)  //进入循环
      {
        if((HAL_GetTick() - tickstart) > RTC_TIMEOUT_VALUE) //当前Tick和进入函数时记录的Tick相差大于预定值RTC_TIMEOUT_VALUE​
        {                                                                              //确定超时,函数返回一个超时
          return HAL_TIMEOUT;
        }
      }

      /* Disable the write protection for RTC registers */
      __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
     
     
      return HAL_OK; 
    }

    通过上面两段代码,可以看到,在中断函数里只是简单地做个累加,就可以实现不同的应用。

    • 发布于 2018-10-10
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:22
  • 这个看你程序的框架是怎么设计的。但是使用中断的好处就是可以节省处理器的负担和时间。中断是单片机的一种资源,有中断发生才会去处理,没有发生则不用理会。如果你使用非中断就意味着你的处理器要实时去检测滴答定时器的状态。这样有点浪费处理器的时间啊。但是有些场合这样做也合理的。主要看你的程序整体是怎么设计的。
    • 发布于2018-10-11
    • 举报
    • 评论 0
    • 1
    • 0

  • 肯定用中断好

    typedef enum
    {
      HAL_TICK_FREQ_10HZ         = 100U
      HAL_TICK_FREQ_100HZ        = 10U
      HAL_TICK_FREQ_1KHZ         = 1U
      HAL_TICK_FREQ_DEFAULT      = HAL_TICK_FREQ_1KHZ
    } HAL_TickFreqTypeDef;


    HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT;


    void SysTick_Handler(void)
    {
     uwTick += uwTickFreq;
    }


    这是HAL库里关于滴答时钟的代码

    • 发布于2018-10-10
    • 举报
    • 评论 3
    • 0
    • 0
liuxiaofei126 回复了 Spirit :能否说明为啥用中断好 回复
Spirit 回复了 liuxiaofei126 :另外补答一下好了。 回复
liuxiaofei126 回复了 Spirit :如果在其他中断程序中调用的话好吗 回复

  • 看你的用途和程序构架.如果觉得中断太霸道可以用非中断.
    • 发布于2018-10-10
    • 举报
    • 评论 0
    • 0
    • 0

  • 最好用中断,要不然你的定时不会准确的
    • 发布于2018-10-10
    • 举报
    • 评论 0
    • 0
    • 0

  • 用中断好,中断比较准确,而且是隔离的
    • 发布于2018-10-10
    • 举报
    • 评论 0
    • 0
    • 0

  • 就应用上来讲,用中断好,中断比较准确,但是项目上来说就要综合考虑了。
    • 发布于2018-10-10
    • 举报
    • 评论 0
    • 0
    • 0

  • 主要还是看应用 不过中断方式可以适应的范围广 总的来说还是中断有优势
    • 发布于2018-10-10
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个要根据需要来使用,使用CUBEMX生成的程序,systick使用的是中断方式,中断间隔默认是1ms。

    具体使用的化,要看实际需要,比如比较常见的原子的程序里,裸机跑程序的化,就是用查询方式实现的延时nus和nms的程序,在需要用的地方调用响应的延时函数就行。

    单systick的话,用中断和用查询精度是一样的。因为他们的时钟都一样。

    • 发布于2018-10-10
    • 举报
    • 评论 0
    • 0
    • 0

  • 看对系统的影响程度吧,一般都是中断
    • 发布于2018-10-10
    • 举报
    • 评论 0
    • 0
    • 0

  • 看需求分析,如果用中断不会影响到你得应用,就用中断,否者用非中断
    • 发布于2018-10-10
    • 举报
    • 评论 0
    • 0
    • 0

  • 看需求分析,如果用中断不会影响到你得应用,就用中断,否者用非中断
    • 发布于2018-10-10
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个主要看你的需求和代码结构,如果你的主循环里面什么都没有或者说你使用了操作系统,那么就可以在while循环里面查询状态而不是使用中断
    • 发布于2018-10-10
    • 举报
    • 评论 0
    • 0
    • 0

  • 滴答定时器,也是个定时器,就当作普通的定时器用,可以中断,可以不中断,都行
    • 发布于2018-10-10
    • 举报
    • 评论 0
    • 0
    • 0

  • 滴答定时器一般会用一个优先级相对较低的中断,中断效率比轮询高,但是因为这个定时器中断太频繁,优先级高的话会影响别的业务
    • 发布于2018-10-11
    • 举报
    • 评论 0
    • 0
    • 0

  • 中断方式比较好,处理的时候能快速的响应请求
    • 发布于2018-10-20
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个定时器比较特殊,看你的使用方式,一般裸机我是习惯使用它非中断去做延时
    • 发布于2018-10-21
    • 举报
    • 评论 0
    • 0
    • 0

  • 要看实际的情况,中断的方式响应会更快
    • 发布于2018-10-27
    • 举报
    • 评论 0
    • 0
    • 0

  • 一般的操作都是用中断,当然有消息队列处理也完全没有问题
    • 发布于2018-10-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 滴答定时器定时器也是依靠中断进行计数的,只不过中断时间极快不会影响别的语句罢了。
    • 发布于2018-10-31
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

stm32滴答定时器用中断还是用非中断?