打印

外设事件中断响应流程及注意事项

[复制链接]
688|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
林堪堪|  楼主 | 2022-6-21 19:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Questions:为实现任务的快速响应,应用通常会设计外设中断,在中断函数内响应事件标志对应的回调任务。但大多外设均具备多个可引起中断的事件标志,如何实现回调任务的精确响应将变得尤其重要,本文档旨在介绍一种保障回调任务可被精确响应的方法。

Answer:
以下将以USART2为例进行阐述。


中断响应过程及注意事项
1)        事件标志置位
当事件标志产生条件成立后,硬件会置位对应的事件标志。
示例:当USART2接收数据缓冲器满时,会立即置位对应的RDBF标志。
注意:事件标志的置位发生在其对应的事件产生条件成立时,不受对应的中断使能状态影响。
2)        中断服务响应
当事件标志,且对应的外设中断处于使能状态时,硬件会通过外设中断通道向内核申请中断服务。
示例:当USART2的RDBF标志置位,且RDBFIEN处于开启状态时,硬件会自动通过USART2中断通道向内核申请中断服务,同步置位USART2的NVIC pending位来指示有中断申请出现,以指示代码需要跳转到中断服务函数执行。
注意:外设中断处于失能状态时,对应的事件标志置位并不会申请中断服务。
3)        中断函数执行
在符合中断响应优先级规则条件时,代码就会自动跳转执行中断函数内的回调任务。
由于同一个中断通道具备多个引起中断的事件标志,对应共用同一个NVIC pending位,且该pending位在代码跳转到中断函数后会被硬件自动清零。
注意:该NVIC pending位会跟随该中断通道内的任意被使能中断的事件标志置位而置位,其只记录有无,不会累加。并在响应中断函数时被硬件自动清除。
为避免事件标志的回调任务被漏执行或误执行,软件必须要在中断函数内做好事件标志的区分处理。如下建议方法:
回调任务漏执行的避免方法
当同时使用同一外设的多个事件中断时,中断到底是由什么事件标志产生的须由软件按照如下区分:
在中断函数内,查询每一个事件标志的状态来决定是否响应对应的回调任务。
示例1:当同时使用USART2的RDBF中断和TDBE中断时,中断函数需如下设计
  void USART2_IRQHandler(void)
{
  if(usart_flag_get(USART2, USART_RDBF_FLAG) != RESET)
  {
    /* user code */
  }

  if(usart_flag_get(USART2, USART_TDBE_FLAG) != RESET)

  {
    /* user code */
  }
}

可同步参考如下路径demo示例用法AT32Fxxx_Firmware_Library_V2.x.x\project\at_start_fxxx\examples\spi\halfduplex_interrupt
回调任务误执行的避免方法
当分时使用同一外设的多个事件中断时,中断到底是由什么事件标志产生的须由软件按照如下区分:
在中断函数内,查询每事件的中断状态及标志状态来决定是否响应对应的回调任务。
示例1:当使用USART2的RDBF中断、并分时的使用TDBE中断时,中断函数需如下设计
void USART2_IRQHandler(void)
{
  if(usart_flag_get(USART2, USART_RDBF_FLAG) != RESET)
  {
    /* user code */
  }
  if(USART2->ctrl1_bit.tdbeien != RESET)
  {
    if(usart_flag_get(USART2, USART_TDBE_FLAG) != RESET)
    {
      /* user code */
    }
  }
}

可同步参考如下路径demo示例用法AT32Fxxx_Firmware_Library_V2.x.x\project\at_start_fxxx\examples\spi\halfduplex_transceiver_switch
4)        中断结束返回
当中断回调任务执行完毕时,软件应该及时清除事件状态标志,随后代码会自动跳转回主函数。


使用特权

评论回复

相关帖子

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

本版积分规则

69

主题

119

帖子

5

粉丝