在观察到以下条件时,UART 可以生成中断:
- 超限错误
- 中断错误
- 奇偶校验错误
- 组帧错误
- 接收超时
- 发送(当满足 UART:IFLS TXSEL 寄存器位中定义的条件时)
- 接收(当满足 UART:IFLS RXSEL 寄存器位中定义的条件时)
- 传输结束(当 TX 线路上没有数据且 TX FIFO 下溢时)
所有中断事件在发送到中断控制器之前都一起进行“或”运算,因此 UART 在任何给定的时间只能向控制器生成一个中断请求。软件可以通过读取 UART 屏蔽中断状态寄存器 (UART:MIS) 在单个中断服务例程 (ISR) 中处理多个中断事件。
可以触发控制器级中断的中断事件通过在 UART 中断屏蔽寄存器 (UART:IMSC) 中设置相应的位来定义。如果不使用中断,原始中断状态始终可以通过 UART 原始中断状态寄存器 (UART:RIS) 看到。
通过设置 UART 中断清除寄存器 (UART:ICR) 中的相应位,可以清除中断(对于 UART:MIS 和 UART:RIS 寄存器)。
当 RX FIFO 不为空且在 32 位周期内没有接收到更多数据时,此接收超时中断有效。当 FIFO 通过读取所有数据(或通过读取保持寄存器)变为空,或者设置 UART:ICR 寄存器中的相应位时,接收超时中断将被清除。
UART 模块支持使用 UART 中断屏蔽设置/清除寄存器 (UART:IMSC) 为每个单独的中断源设置和清除屏蔽。可能导致组合中断发送到 CPU 的五个事件为:
- RX:发生以下事件之一时,接收中断将更改状态:
- 如果启用 FIFO 且接收 FIFO 到达编程的触发电平。当发生这种情况时,接收中断会置为高电平。通过从接收 FIFO 读取数据直至其低于触发电平,或通过清除中断来清除接收中断。
- 如果 FIFO 禁用(深度为一个位置)并且接收到数据从而填充该位置,接收中断会置为高电平。通过对接收 FIFO 执行单次读取,或通过清除中断来清除接收中断。
- TX:发生以下事件之一时,发送中断将更改状态:
- 如果 FIFO 使能且发送 FIFO 等于或低于编程的触发电平,则发送中断会置为高电平。通过向发送 FIFO 写入数据直至其高于触发电平,或通过清除中断来清除发送中断。
- 如果 FIFO 禁用(深度为一个位置)并且发送器单个位置中没有数据,则发送中断会置为高电平。通过对发送 FIFO 执行单次写入,或通过清除中断来清除中断。
- RX 超时:当接收 FIFO 不为空且在 32 位周期内没有接收到更多数据时,此接收超时中断有效。当 FIFO 通过读取所有数据(或通过读取保持寄存器)变为空,或者中断清除寄存器 (UART:ICR) 中的相应位写入 1 时,接收超时中断将被清除。
- 调制解调器状态:如果调制解调器状态信号 uart_cts 发生变化,则调制解调器状态中断置为有效。可以使用 UART:ICR 寄存器中的相应清除位来清除它。
- 错误:当 UART 在接收数据过程中出现错误时,错误中断置为有效。中断可能由多个不同的错误条件引起:可以通过读取 UART:RIS 寄存器或 UART:MIS 寄存器来确定中断原因。可以通过写入 UART:ICR 寄存器的相关位来清除中断。
除了 UART 模块产生的五个事件外,还有两个额外的事件会被或运算到中断线路中:
- RX DMA 完成:表示接收器 DMA 已完成其任务。这是由 DMA 模块提供的电平中断,使用 DMA 模块中的 dma_done 清除寄存器 (UDMA:REQDONE) 清除。
- TX DMA 完成:表示发送 DMA 已完成其任务。这是由 DMA 模块提供的电平中断,使用 DMA 模块中的 dma_done 清除寄存器 (UDMA:REQDONE) 清除。