打印
[应用相关]

单片机中断响应流程

[复制链接]
3192|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hoop|  楼主 | 2021-9-11 10:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hoop 于 2022-3-5 12:40 编辑

单片机中断响应流程
中断通常被用来执行一些紧急任务,在单片机的应用开发中至关重要。
那通常中断应该如何使用以及中断是怎么被一步一步的响应的呢?本文以AT32的USART1接收数据缓冲器满中断为例,进行一个简单的说明
中断应用三要素
1)外设中断使能
  通过调用usart_interrupt_enable(USART1, USART_RDBF_INT, TRUE);来完成
2)NVIC中断使能
  nvic_irq_enable(USART1_IRQn, 0, 0);
  注意要进行NVIC分组配置:nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
3)中断服务函数
  void USART1_IRQHandler(void)
  {
    if(usart_flag_get(USART1, USART_RDBF_FLAG) != RESET)
    {
      /* clear rdbf flag */
      usart1_index = usart_data_receive(USART1);

      /* toggle led */
      at32_led_toggle(LED4);
    }
  }
中断响应步骤
A.当USART1接收到一笔数据后,其会立即置位接收数据缓冲器满标志(RDBF)
B.由于使能了USART1的接收数据缓冲器满中断,故RDBF标志的置位会同步置位USART1对应的NVIC pending位
C.由于使能了USART1的NVIC中断,故其pending位的置位就会跟随指令跳转,将会实际跳转到中断函数内执行
D.代码实际跳转到中断函数内后,硬件会自动清除USART1对应的NVIC pending位
E.中断函数内通过usart_data_receive命令读USART1数据寄存器来清除RDBF标志
F.退出中断服务函数,等待下一次标志置位响应中断

注意事项:
1)中断函数内的if(usart_flag_get(USART1, USART_RDBF_FLAG) != RESET)用以区分同一中断向量下的不同中断源,通常不可少。比如USART1的中断源除RDBF外,还有包括TDBE、IDLEF等;
2)如果中断函数内不执行清中断标志的动作的话,那在退出中断函数时,因中断标志保持置位,其又会重复从中断响应步骤中的B处开始执行;
3)中断标志的清除需要时间,为避免标志未被真正清除就退出中断服务函数,进而引发中断连续响应的问题,通常清标志命令不在中断函数的末尾执行;
4)如果需要实时的响应中断,代码必须确保未执行__disable_irq();命令(此为内核指令)
5)如果不期望中断函数被实时响应,比如低功耗唤醒状态下期望待时钟恢复后再响应中断时,就可以在进低功耗前调用__disable_irq();禁止中断的实时响应(此时中断会被记录挂起),并在之后期望中断响应的时刻执行__enable_irq();(此时之前挂起的中断会被立即响应)

使用特权

评论回复
沙发
guijial511| | 2021-9-12 12:22 | 只看该作者
讲解详细,点个赞。

使用特权

评论回复
板凳
joyall| | 2021-9-17 10:29 | 只看该作者
讲解详细,点个赞。

使用特权

评论回复
地板
littlelida| | 2021-10-4 11:43 | 只看该作者
AT和st的风格也是类似的

使用特权

评论回复
5
onlycook| | 2021-10-5 10:23 | 只看该作者
学习下,点个赞

使用特权

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

本版积分规则

80

主题

322

帖子

0

粉丝