• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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);
}
 
Сверху Снизу