pvvx, все-таки есть глюки. Версия сборки 0.3.2b (на версии 0.3.3 тоже).
Если вообще никак не модифицировать сборку, то надо сделать следующее:
1. Устанавливаем скорость 9600 (на 115200 тоже есть эффект, но реже).
2. Отображаем поллющую страничку (обязательное условие).
3. Подключаем к UART что-нибудь, что туда шлет символы. У меня микроконтроллер, шлет по 10 байт 3 раза в секунду. RTS/CTS нет.
3. Запускаем TCP-соединение и ждем.
По приему где-то 9000 (+-3000) символов происходит перезагрузка модуля, а именно: uptime не сбрасывается, но в остальном - перезагрузка, в отладочный уарт высыпается вся информация, как при загрузке, в рабочий уарт тоже что-то высыпается, связь по Wi-Fi теряется, но тут же восстанавливается.
Далее. Модифицируем сборку следующим образом.
1. Отключаем запуск TCP-сервера в user_main.c: [inline]// if(syscfg.tcp2uart_port) tcp2uart_init(syscfg.tcp2uart_port); [/inline]
2. В uart_tcp.c функцию uart_init дополняем:
Код:
void ICACHE_FLASH_ATTR uart_init(void)
{
struct UartxCfg ux;
//disable all UARTs interrupt
ets_isr_mask(1 << ETS_UART_INUM);
//tcp2uart_int_rxtx_disable();
// UART0
if(flash_read_cfg(&ux, ID_CFG_UART0, sizeof(ux)) != sizeof(ux)) {
ux.baud = UART0_DEFBAUD;
ux.cfg.dw = UART0_REGCONFIG0DEF;
};
uart0_flow_ctrl_flg = ux.cfg.b.flow_en;
ux.cfg.dw &= UART0_REGCONFIG0MASK;
UART0_INT_ENA = 0;
UART0_CONF0 = ux.cfg.dw;
//set rx fifo trigger
UART0_CONF1 = ((0x01 & UART_RXFIFO_FULL_THRHD) << UART_RXFIFO_FULL_THRHD_S)
| ((0x10 & UART_TXFIFO_EMPTY_THRHD) << UART_TXFIFO_EMPTY_THRHD_S)
| (((128 - RST_FIFO_CNT_SET) & UART_RX_FLOW_THRHD) << UART_RX_FLOW_THRHD_S)
| ((0x01 & UART_RX_TOUT_THRHD) << UART_RX_TOUT_THRHD_S)// | UART_RX_TOUT_EN
;
update_mux_uart0();
uart_div_modify(UART0, UART_CLK_FREQ / ux.baud); // WRITE_PERI_REG(UART_CLKDIV(num), ux.baud) + clear rx and tx fifo, not ready =
// clear all interrupt UART0
UART0_INT_CLR &= ~0xffff;
// добавил МК
uart0_set_flow(false);
//clear rx and tx fifo, not ready
uint32 conf0 = UART0_CONF0;
UART0_CONF0 = conf0 | UART_RXFIFO_RST | UART_TXFIFO_RST;
UART0_CONF0 = conf0 & (~ (UART_RXFIFO_RST | UART_TXFIFO_RST));
update_rts0(); // вот это зачем? ну ладно...
UART0_INT_ENA &= ~UART_TXFIFO_EMPTY_INT_ENA; // отключаем прерывание по опустошению буфера TX
UART0_INT_ENA |= UART_RXFIFO_FULL_INT_ENA; // включаем прерывание по приходу символа в RX
ets_intr_unlock(); // ETS_UART_INTR_ENABLE();
// *** //
// UART1
if(flash_read_cfg(&ux, ID_CFG_UART1, sizeof(ux)) != sizeof(ux)) {
ux.baud = UART1_DEFBAUD;
ux.cfg.dw = UART1_REGCONFIG0DEF;
};
ux.cfg.dw &= UART1_REGCONFIG0MASK;
UART1_INT_ENA = 0;
UART1_CONF0 = ux.cfg.dw;
UART1_CONF1 = 0x01707070;
update_mux_txd1();
uart_div_modify(UART1, UART_CLK_FREQ / ux.baud); // WRITE_PERI_REG(UART_CLKDIV(num), ux.baud) + clear rx and tx fifo, not ready =
// clear all interrupt
UART1_INT_CLR &= ~0xffff;
MEMW();
os_install_putc1((void *)uart1_write_char); // install uart1 putc callback
ets_isr_attach(ETS_UART_INUM, uart_intr_handler, NULL);
ets_isr_unmask(1 << ETS_UART_INUM);
}
3. В этом же файле функцию - обработчик прерывания UARTов модифицируем:
Код:
void uart_intr_handler(void *para)
{
// uart0 and uart1 intr combine togther, when interrupt occur, see reg 0x3ff20020, bit2, bit0 represents
// uart1 and uart0 respectively
MEMW();
uint32 ints = UART0_INT_ST;
if(ints) {
if (ints & UART_RXFIFO_FULL_INT_ST) { // прерывание по приему символов? да
UART0_INT_ENA &= ~UART_RXFIFO_FULL_INT_ENA;
ets_intr_lock(); // ETS_UART_INTR_DISABLE();
//parse_rx_buf(); // функция-парсер. пока закомментирована
os_printf("Symbol!\n"); // в отладку пишем что-нить, чтобы видеть, что прерывание срабатывает
//clear rx and tx fifo, not ready Интересно, что если этого не делать, модуль перезагружается после нескольких принятых символов.
uint32 conf0 = UART0_CONF0;
UART0_CONF0 = conf0 | UART_RXFIFO_RST | UART_TXFIFO_RST;
UART0_CONF0 = conf0 & (~ (UART_RXFIFO_RST | UART_TXFIFO_RST));
UART0_INT_ENA |= UART_RXFIFO_FULL_INT_ENA; // зарядить прерывание UART rx
ets_intr_unlock(); // ETS_UART_INTR_ENABLE();
};
UART0_INT_CLR = ints;
}
else {
UART1_INT_ENA = 0;
UART1_INT_CLR = UART1_INT_ST;
}
}
4. Компилируем, запускаем, загружаем поллющую страничку, льем в уарт, ждем. Видим - каждые 30-40 секунд - перезагрузка модуля, uptime сбрасывается (иногда нет)...