上一篇基础篇简单介绍了ESP8266模块固件刷写的方法,我觉得写的还是比较清楚的,大家应该都能看明白,既然已经知道怎么刷写固件了,那这一节就来学学SKD开发的一些基础,所谓“师傅领进门,修行靠各人”,本人也是一个初学者,这里把自己所学跟大家交流分享一下,菜鸟间的交流有时大家还比较容易接受,那现在就开始本章的学习吧。
首先本文用到的相关工具如下,请自行下载
ESP8266 IDE2.0 http://pan.baidu.com/s/1c21PJMw
ESP8266 固件官方刷写工具 http://espressif.com/en/support/download/other-tools?keys=&field_type_tid%5B%5D=14
USR-TCP232 http://pan.baidu.com/s/1gfMfHQz
开发参考文档地址 http://espressif.com/zh-hans/support/download/overview?keys=&field_type_tid%5B%5D=14
这里使用安可信的ESP8266 IDE2.0集成开发环境来讲解SDK程序的开发与刷写,开发工具的使用大家可参考《ESP8266 SDK 编程入门 02-开发工具篇》,上一篇文章中已经简单介绍了开发工具的使用及基本的代码框架,下面就通过使用ESP8266控制LED灯来介绍如何进行SDK开发。
我们再来回顾一下ESP8266-01的模块针脚图,这里的GPIO0和GPIO2是可以当作普通的IO针脚来使用的,现在我们就使用GPIO2来控制LED灯亮一秒灭一秒。首先先把代码粘出来给大家看,回头再详细讲解代码。
#include "ets_sys.h"
#include "gpio.h"
#include "osapi.h"
#include "os_type.h"
#include "user_interface.h"
#include "espconn.h"
LOCAL os_timer_t timer;
char zt = 1;
void timer_callback(){
if(zt == 1){
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0);
zt = 0;
}else{
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 1);
zt = 1;
}
}
void user_init(void)
{
//os_printf("SDK version:%s\n", system_get_sdk_version());
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO2);
os_timer_disarm(&timer);
os_timer_setfn(&timer,(os_timer_func_t *)timer_callback,NULL);
os_timer_arm(&timer,1000,1);
}
void user_rf_pre_init(){}
首先说一下原理,这里不能使用一般C语言的死循环的方式来实现,而是需要使用定时器来实现,定时器和针脚控制可参考《ESP8266_SDK_API编程手册_CN_v1.5.2》,下面我来简单解释一下程序代码。
这个程序里面涉及到的函数有三个,user_init()是入口函数,相当于main函数,user_rf_pre_init()是SDK1.1.0及之后版本需要增加的函数,暂时没啥用,timer_callback()是一个回调函数,下面的定时器会用到。
首先定义一个定时器函数和一个状态变量,用于判断LED灯的状态
LOCAL os_timer_t timer;
char zt = 1;
首先入口函数中选择GPIO2管脚
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO2);
然后定义定时器,语法可参考编程手册,里面说的都很详细了
os_timer_disarm(&timer);
os_timer_setfn(&timer,(os_timer_func_t *)timer_callback,NULL);
os_timer_arm(&timer,1000,1);
os_timer_setfn(&timer,(os_timer_func_t *)timer_callback,NULL);timer_callback就是自己的那个回调函数,GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0);这句的意思就是GPIO2输出低电平,1为高电平,其它的口类似,具体的语法解释也可以参考编程手册,都有详细说明。
程序写好后Clean一下项目再编译一下生成0x00000.bin和0x40000.bin,按照基础篇的教程将这两个文件刷进模块,记住这里只要刷两个文件就可以了,所以刷写的时候只要勾选这两个文件前面的复选框,固件刷进去后断电重新加电模块开始工作。
**********注意*********
这里有一点问题要跟大家重点说一下,就因为这个小问题折腾了我好几天,差点被逼疯,就是led的接法,由于硬件是半路出家,模块的GPIO2口是内部上拉的,模块启动过后是高电平,一开始我是将LED接到GPIO2和GND之间,一加电GPIO2就被下拉了,导致模块无法正常启动,老是出问题,一直不知道原因,折腾老半天,还好得到网友指点,才解决了这个问题。这里接线一定要将LED接到VCC和GPIO2之间,这样加电模块才能正常工作,所以前面的代码中GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0)这句是输出低电平,但LED反倒是亮的,切记切记.......最后祝大家玩得开心