我试图为esp32上的UART中断定义一个ISR,通常,我的Programm应该只是发送出去,并从发送缓冲区(tx-FIFO)字节数组,一旦发送缓冲区就做一个中断为空,并从发送缓冲区开始同一数组的另一个输出。
目前,我找不到如何为UART_TX_DONE_INT中断分配特定的ISR(然后可以定义自己)的方法,该中断指示发送缓冲区为空。
我卡住的主要原因是因为我不知道这个中断句柄/处理程序是什么,就像这个人http://zerothelement21.blogspot.com/2018/05/esp32-uart-interrupt-handling.html所描述的那样。
期望: 我可以定义一个中断,该中断在tx_FIFO为空时触发,并且我可以自己定义该中断的ISR。
答案 0 :(得分:0)
中断处理程序或中断服务程序(ISR)只是一个函数/例程,只要发生中断,硬件就会调用该函数/例程,在这种情况下, UART TX FIFO降至某个特定点以下时,UART将声明适当的中断标志,然后通知中断控制器“暂停” CPU,然后调用适当的ISR。因此,一般的流程是将中断处理程序创建为一个函数,在该函数中,您将再次填充FIFO,将函数注册为中断服务程序,然后启用中断并启动TX。
幸运的是,对于ESP32,Espressif在其SDK中设置了一些便捷功能来帮助处理中断,请参阅this section in the programming guide。 TL; DR是您需要通过调用uart_intr_config()
来配置中断,使用uart_isr_register
注册自己的处理程序(几乎所有C函数都可以),然后使用uart_enable_tx_intr()
启用中断。
编辑添加:您是否考虑过可能不需要编写自定义ISR来完成所需的工作?检出uart_write_bytes()
,它将数据复制到中间环形缓冲区,然后退出,而SDK提供的ISR为您将数据传输到FIFO。