1. 程式人生 > >ESP8266--學習筆記(八)-由AT韌體原始碼分析一

ESP8266--學習筆記(八)-由AT韌體原始碼分析一

 怎麼說呢,其實學習ESP8266的資料還是挺少的,但是可以找得到一些韌體原始碼;而我們作為初學者,這些原始碼真的是不可多得的資料。當我想實現一些功能的時候,其實是可以用一系列的AT指令來完成的。於是我就想,既然AT指令可以做到,那麼我可以參考AT指令的機制來寫一個符合自己要求的韌體啊!
 於是乎通過AT韌體啟示,我完成了這樣一個程式框架。

這裡寫圖片描述

  • user_main.c
  • my_wifi.c
  • my_wifi.h

整個就是通過定義這麼一個列舉型別定義來完成整個框架的資訊傳遞。
讓整個系統開始跑起來的動機就是,串列埠資料接收導致的中斷!

typedef enum{
my_statIdle,
my_statRecving,
my_statProcess,
my_statIpSending,
my_statIpSended,
my_statIpTraning
}my_stateType;

user_main.c

/*
 * user_main.c
 *
 *  Created on: 2017脛錨3脭脗14脠脮
 *      Author: yuanlifu
 */
#include "ets_sys.h"
#include "driver/uart.h"
#include "user_main.h"
#include "wifi.h"


void user_init(){
    uint8 opmode;
    uart_init(115200,115200);

    my_init();
}

void user_rf_pre_init(){

}

my_wifi.h

/*
 * my_wifi.h
 *
 *  Created on: 2017年3月22日
 *      Author: yuanlifu
 */
#ifndef APP_USER_MY_H_ #define APP_USER_MY_H_ #include "user_main.h" #include "user_interface.h" #define my_recvTaskPrio 0 #define my_recvTaskQueueLen 64 #define my_procTaskPrio 1 #define my_procTaskQueueLen 1 void my_init(void); typedef enum{ my_statIdle, my_statRecving, my_statProcess, my_statIpSending, my_statIpSended, my_statIpTraning }my_stateType; #endif /* APP_USER_MY_H_ */

my_wifi.c

/*
 * my_wifi.c
 *
 *  Created on: 2017年3月22日
 *      Author: yuanlifu
 */
#include "my.h"
#include "osapi.h"
#include "user_interface.h"
#include "driver/uart.h"
#include "wifi.h"

os_event_t    my_recvTaskQueue[my_recvTaskQueueLen];
os_event_t    my_procTaskQueue[my_procTaskQueueLen];

my_stateType  my_state;
BOOL echoFlag = TRUE;

static void my_procTask(os_event_t *events);
static void my_recvTask(os_event_t *events);

/**
  * @brief  Uart receive task.
  * @param  events: contain the uart receive data
  * @retval None
  */
static void ICACHE_FLASH_ATTR
my_recvTask(os_event_t *events)
{
    static uint8_t atHead[2];
    static uint8_t *pCmdLine;
    uint8_t temp;

    while(READ_PERI_REG(UART_STATUS(UART0)) & (UART_RXFIFO_CNT << UART_RXFIFO_CNT_S))
    {
        if(my_state != my_statIpTraning)
        {
        }

       switch(my_state)
       {
            case my_statIdle: //serch "AT" head

              break;

            case my_statRecving: //push receive data to cmd line

              break;

            case my_statProcess: //process data

              break;

            case my_statIpSending:

              break;

            case my_statIpSended: //send data

              break;

            case my_statIpTraning:

              break;
            default:

              break;
         }
    }
    if(UART_RXFIFO_FULL_INT_ST == (READ_PERI_REG(UART_INT_ST(UART0)) & UART_RXFIFO_FULL_INT_ST))
    {
        WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR);
    }
    else if(UART_RXFIFO_TOUT_INT_ST == (READ_PERI_REG(UART_INT_ST(UART0)) & UART_RXFIFO_TOUT_INT_ST))
    {
        WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_TOUT_INT_CLR);
    }
    ETS_UART_INTR_ENABLE();
}

/**
  * @brief  Task of process command or txdata.
  * @param  events: no used
  * @retval None
  */
static void ICACHE_FLASH_ATTR
my_procTask(os_event_t *events)
{
    if(my_state == my_statProcess)
    {
    }
    else if(my_state == my_statIpSended)
    {
    }
    else if(my_state == my_statIpTraning)
    {
    }
}


void ICACHE_FLASH_ATTR
my_init(void){
    system_os_task(my_recvTask, my_recvTaskPrio, my_recvTaskQueue, my_recvTaskQueueLen);
    system_os_task(my_procTask, my_procTaskPrio, my_procTaskQueue, my_procTaskQueueLen);
}

 接下來就是繼續發掘at-fimware的資源。