• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Мигание светодиодом по команде UART

Meinframe

New member
Подскажите. Я пытаюсь соединить пример работы по UART (http://41j.com/blog/2015/01/esp8266-serial-uart0-txrx/) и пример мигания светодиодом "Blinky" из esp_iot_sdk_v0.9.5_15_01_23.zip (https://github.com/esp8266/esp8266-wiki/tree/master/sdk).

Проблема в изменении, как мне кажется, флага по UART. Так как я проверял, что задача мигания выполняется и не выполняется при начальном значении флага 1 или 0 соответственно. Вопрос что я делаю не так? куда копать?
Код:
#include "ets_sys.h"
#include "osapi.h"
#include "gpio.h"
#include "os_type.h"
#include "user_interface.h"
#include "user_config.h"
#include "uart.h"

#include "c_types.h"
#include "espconn.h"
#include "mem.h"

#define user_procTaskPrio        0
#define user_procTaskPrio1       1
#define user_procTaskQueueLen    2
os_event_t    user_procTaskQueue[user_procTaskQueueLen];
static void user_procTask(os_event_t *events);
int UART_ENABLE_BLINK = 1;

static void loop(os_event_t *events);

LOCAL os_timer_t network_timer;

static volatile os_timer_t some_timer;

//Do nothing function
static void ICACHE_FLASH_ATTR
user_procTask(os_event_t *events)
{
    os_delay_us(10);
}

void some_timerfunc(void *arg)
{
    if(UART_ENABLE_BLINK == 1)
    {
            //Do blinky stuff
        if (GPIO_REG_READ(GPIO_OUT_ADDRESS) & BIT2)
        {
        //Set GPIO2 to LOW
        gpio_output_set(0, BIT2, BIT2, 0);
        }
        else
        {
        //Set GPIO2 to HIGH
        gpio_output_set(BIT2, 0, BIT2, 0);
        }
    }
    else if(UART_ENABLE_BLINK == 0)
    {
        //Set GPIO2 to LOW
        gpio_output_set(0, BIT2, BIT2, 0);
    }

    system_os_post(user_procTaskPrio1, 0, 0 );

}

/* Доступные функции SDK Espressif */
//PROVIDE ( UartConnCheck = 0x40003230 );
//PROVIDE ( UartConnectProc = 0x400037a0 );
//PROVIDE ( UartDwnLdProc = 0x40003368 );
//PROVIDE ( UartGetCmdLn = 0x40003ef4 );
//PROVIDE ( UartRegReadProc = 0x4000381c );
//PROVIDE ( UartRegWriteProc = 0x400037ac );
//PROVIDE ( UartRxString = 0x40003c30 );
//PROVIDE ( Uart_Init = 0x40003a14 );
//PROVIDE ( ets_install_uart_printf = 0x40002438 );
//PROVIDE ( ets_uart_printf = 0x40002544 );
//PROVIDE ( uartAttach = 0x4000383c );
//PROVIDE ( uart_baudrate_detect = 0x40003924 );
//PROVIDE ( uart_buff_switch = 0x400038a4 );
//PROVIDE ( uart_div_modify = 0x400039d8 );
//PROVIDE ( uart_rx_intr_handler = 0x40003bbc );
//PROVIDE ( uart_rx_one_char = 0x40003b8c );
//PROVIDE ( uart_rx_one_char_block = 0x40003b64 );
//PROVIDE ( uart_rx_readbuff = 0x40003ec8 );
//PROVIDE ( uart_tx_one_char = 0x40003b30 );
//PROVIDE ( UartDev = 0x3fffde10 );

void ICACHE_FLASH_ATTR wifi_config_ap();

int debug(char *text) {
}

//Main code function
static void ICACHE_FLASH_ATTR loop(os_event_t *events) {

  int c = uart0_rx_one_char();

  if(c == 5)
  {
      UART_ENABLE_BLINK = 1;
  }
  else if(c == 6)
  {
      UART_ENABLE_BLINK = 0;
  }

  os_delay_us(100);
  system_os_post(user_procTaskPrio, 0, 0 );
}

void ICACHE_FLASH_ATTR network_wait_for_ip() {

  struct ip_info ipconfig;
  os_timer_disarm(&network_timer);
  wifi_get_ip_info(STATION_IF, &ipconfig);
  if (wifi_station_get_connect_status() == STATION_GOT_IP && ipconfig.ip.addr != 0) {
    char page_buffer[40];
    os_sprintf(page_buffer,"myIP: %d.%d.%d.%d",IP2STR(&ipconfig.ip));
    debug(page_buffer);
    //safecast_send_nema("$BNRDD,1010,2015-01-06T17:31:15Z,0,0,128,V,3537.2633,N,13938.0270,E,37.70,A,9,11160");
  } else {
    char page_buffer[40];
    os_sprintf(page_buffer,"network retry, status: %d",wifi_station_get_connect_status());
    if(wifi_station_get_connect_status() == 3) wifi_station_connect();
    debug(page_buffer);
    os_timer_setfn(&network_timer, (os_timer_func_t *)network_wait_for_ip, NULL);
    os_timer_arm(&network_timer, 2000, 0);
  }
}

void ICACHE_FLASH_ATTR network_init() {
  debug("init network 1");
  os_timer_disarm(&network_timer);
  os_timer_setfn(&network_timer, (os_timer_func_t *)network_wait_for_ip, NULL);
  os_timer_arm(&network_timer, 2000, 0);
  debug("init network 2");
}

void ICACHE_FLASH_ATTR wifi_config_station() {
    // Wifi configuration
    char ssid[32] = SSID;
    char password[64] = SSID_PASSWORD;

    struct station_config stationConf;

    //Set station mode
    wifi_set_opmode( 0x1 );

    //Set ap settings
    stationConf.bssid_set = 0;
    os_memcpy(&stationConf.ssid, ssid, 32);
    os_memcpy(&stationConf.password, password, 64);

    wifi_station_set_config(&stationConf);
    debug("init wifi");
    debug(ssid);
    debug(password);
}

//Init function
void ICACHE_FLASH_ATTR user_init() {

    // Initialize the GPIO subsystem.
    gpio_init();

    // Set UART Speed (default appears to be rather odd 77KBPS)
    uart_init(BIT_RATE_9600,BIT_RATE_9600);

    // check GPIO setting (for config mode selection)
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);
    PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U);

    //Set GPIO2 to output mode
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);

    //Set GPIO2 low
    gpio_output_set(0, BIT2, BIT2, 0);

    //Disarm timer
    os_timer_disarm(&some_timer);

    //Setup timer
    os_timer_setfn(&some_timer, (os_timer_func_t *)some_timerfunc, NULL);

    //Arm the timer
    //&some_timer is the pointer
    //500 is the fire time in ms
    //0 for once and 1 for repeating
    os_timer_arm(&some_timer, 500, 1);

    wifi_config_station();

    //Start os task
    system_os_task(loop, user_procTaskPrio,user_procTaskQueue, user_procTaskQueueLen);
    system_os_post(user_procTaskPrio, 0, 0 );
    system_os_task(user_procTask, user_procTaskPrio1,user_procTaskQueue, user_procTaskQueueLen);
    system_os_post(user_procTaskPrio1, 0, 0 );
    network_init();
}
 
Сверху Снизу