• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Сброс UART прерываний

kript0n

New member
Почему-то не сбрасываются прерывания UART'a. В коде ниже выдает "InterruptInterrupt...", но никогда - точный тип прерывания. Т.е. ни одно условие status & interrupt type не срабатывает. Уже пробовал отключать прерывания, но там есть свои проблемы.
UART_RXFIFO_FULL_INT_CLR тоже пробовал.

Код:
LOCAL void
uart0_rx_intr_handler(void *para)
{
    ETS_UART_INTR_DISABLE();
    #ifdef DEBUG
    os_printf("Interrupt");
    #endif // DEBUG

    uint32 rx_count = (READ_PERI_REG(UART_STATUS(UART0)) >> UART_RXFIFO_CNT_S) & UART_RXFIFO_CNT;
    if(rx_count > 0)
    {
        available += rx_count;
        #ifdef DEBUG
        os_printf("RX_COUNT: %lu\r\n", rx_count);
        #endif // DEBUG
        while(rx_count-- > 0)
        {
            uint8 c = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;
            uart_buffer[write_pointer] = c;
            #ifdef DEBUG
            os_printf("Got char 0x%02x\r\n", c);
            #endif // DEBUG
            write_pointer = (write_pointer == UART_BUF_SIZE -1) ? 0 : write_pointer+1;
        }
    }

    uint32 status = READ_PERI_REG(UART_INT_ST(UART0));
    if (status & UART_RXFIFO_FULL_INT_ST)
    {
        #ifdef DEBUG
        os_printf("RX FIFO is full\r\n");
        #endif // DEBUG
        WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR);
    }

    if(status & UART_BRK_DET_INT_ST)
    {
        #ifdef DEBUG
        os_printf("BRK interrupt\r\n");
        #endif // DEBUG
        WRITE_PERI_REG(UART_INT_CLR(UART0), UART_BRK_DET_INT_CLR);
    }

    if(status & UART_CTS_CHG_INT_ST)
    {
        #ifdef DEBUG
        os_printf("CTS change interrupt\r\n");
        #endif // DEBUG
        WRITE_PERI_REG(UART_INT_CLR(UART0), UART_CTS_CHG_INT_CLR);
    }

    if(status & UART_DSR_CHG_INT_ST)
    {
        #ifdef DEBUG
        os_printf("DSR change interrupt\r\n");
        #endif // DEBUG
        WRITE_PERI_REG(UART_INT_CLR(UART0), UART_DSR_CHG_INT_CLR);
    }

    if(status & UART_RXFIFO_OVF_INT_ST)
    {
        #ifdef DEBUG
        os_printf("RX FIFO overflow interrupt\r\n");
        #endif // DEBUG
        WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_OVF_INT_CLR);
    }

    if(status & UART_FRM_ERR_INT_ST)
    {
        #ifdef DEBUG
        os_printf("Frame error interrupt\r\n");
        #endif // DEBUG
        WRITE_PERI_REG(UART_INT_CLR(UART0), UART_FRM_ERR_INT_CLR);
    }

    if(status & UART_PARITY_ERR_INT_ST)
    {
        #ifdef DEBUG
        os_printf("Parity error interrupt\r\n");
        #endif // DEBUG
        WRITE_PERI_REG(UART_INT_CLR(UART0), UART_PARITY_ERR_INT_CLR);
    }

    if(status & UART_TXFIFO_EMPTY_INT_ST)
    {
        #ifdef DEBUG
        os_printf("TX FIFO empty interrupt\r\n");
        #endif // DEBUG
        WRITE_PERI_REG(UART_INT_CLR(UART0), UART_TXFIFO_EMPTY_INT_CLR);
    }

    if(available >= 4)
    {
        #ifdef DEBUG
        os_printf("UART Call communication task\r\n");
        #endif // DEBUG
        system_os_post(COMMUNICATION_TASK_PRIO, EVENT_UART_MESSAGE, 0);
    }
    else
    {
        ETS_UART_INTR_ENABLE();
    }

   //CLEAR_PERI_REG_MASK(UART_INT_ENA(UART0), UART_RXFIFO_FULL_INT_ENA|UART_RXFIFO_TOUT_INT_ENA |
                            //UART_RXFIFO_OVF_INT_ENA | UART_FRM_ERR_INT_ENA | UART_PARITY_ERR_INT_ENA);
    //CLEAR_PERI_REG_MASK(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR | UART_TXFIFO_EMPTY_INT_CLR);
}
 
Сверху Снизу