ESP8266--学习笔记(八)-由AT固件源码分析一

 怎么说呢,其实学习ESP8266的资料还是挺少的,但是可以找得到一些固件源码;而我们作为初学者,这些源码真的是不可多得的资料。当我想实现一些功能的时候,其实是可以用一系列的AT指令来完成的。于是我就想,既然AT指令可以做到,那么我可以参考AT指令的机制来写一个符合自己要求的固件啊!
 于是乎通过AT固件启示,我完成了这样一个程序框架。

ESP8266--学习笔记(八)-由AT固件源码分析一_第1张图片

  • 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的资源。

你可能感兴趣的:(ESP8266,C)