串口发送完成中断回调函数的使用

发布于 2020-09-16 10:33:56

uart.png

在上述图片中,红色方框所标注问题,此处只进行判断接收的标志位,而在uart_isr函数中没有对发送完成的相关标志位进行判断,那么如何实现串口的发送完成中断的处理?

usart.png

这个图片就是void rt_hw_serial_isr(struct rt_serial_device *serial, int event)函数中的DMA模式相对应的代码。红色方框所标之处就是调用的串口发送完成中断回调函数,那么如果不是在DMA模式下,就是在中断模式下进行发送数据,那这个发送中断回调函数又是在哪里被执行的?

查看更多

关注者
1
被浏览
654
陈斌
陈斌 2020-11-12

可以改成下面这样


    /* UART in mode Receiver -------------------------------------------------*/
    if ((__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_RXNE) != RESET) &&
            (__HAL_UART_GET_IT_SOURCE(&(uart->handle), UART_IT_RXNE) != RESET))
    {
        rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
    }
#ifdef RT_SERIAL_USING_DMA
    else if ((uart->uart_dma_flag) && (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_IDLE) != RESET)
             && (__HAL_UART_GET_IT_SOURCE(&(uart->handle), UART_IT_IDLE) != RESET))
    {
        level = rt_hw_interrupt_disable();
        recv_total_index = serial->config.bufsz - __HAL_DMA_GET_COUNTER(&(uart->dma_rx.handle));
        recv_len = recv_total_index - uart->dma_rx.last_index;
        uart->dma_rx.last_index = recv_total_index;
        rt_hw_interrupt_enable(level);

        if (recv_len)
        {
            rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8));
        }
        __HAL_UART_CLEAR_IDLEFLAG(&uart->handle);
    }
#endif
    else if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_TC) &&
            (__HAL_UART_GET_IT_SOURCE(&(uart->handle), UART_IT_TC) != RESET))
    {
#ifdef RT_SERIAL_USING_DMA
        if ((serial->parent.open_flag & RT_DEVICE_FLAG_DMA_TX) != 0)
        {
            HAL_UART_IRQHandler(&(uart->handle));
        }
#endif
                if ((serial->parent.open_flag & RT_DEVICE_FLAG_INT_TX) != 0)
        {
            rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DONE);
        }
        UART_INSTANCE_CLEAR_FUNCTION(&(uart->handle), UART_FLAG_TC);
    }
    else .....
3 个回答
wqwang
wqwang 2020-09-17

好像没有调用的,似乎只能用DMA,也没有普通的发送中断

rainz
rainz 2020-09-17

看一下HAL_UART_TxCpltCallback这个函数有相应的处理

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览