01-04: ESP8266模块详解
版权声明:Copyright © 2016-2019,Stardust Studio,All Rights Reserved
序言——凡尘
程序是一种思想,是一块块积木,我们是静坐其中搭积木的孩童,倘若思想成熟了,我们便有了玩伴而不再孤独。
(1)笔者的驱动芯片为stm32f103系列,但不限于stm系列单片机、51、K6X、LPC、树莓派等单片机;
(2)欢迎各位大牛投稿补充和完善;
1.入门
在阅读后续内容时请先阅读:
2.ESP8266EX DataSheet要点归纳
首先,请先了解:
1.无线标准802.11 b/g/n ;
2.无线信息覆盖范围的计算;
4.WEP, WPA, WPA2, TKIP, AES, CCMP, EAP无线加密;
5.TCP/UDP 协议,和 HTTP、FTP、SMTP,区别及应用场景;
6.天线增益;
归纳:
1.目前市面上路由器频段为2.4G和5G两种,笔者在此选用2.4G(ESP8266EX频率范围2.4G ∼ 2.5 G),无线标准802.11 g,可得发射功率为50mW,传输损耗为92dbm,自由空间传播(忽略大气、墙体等阻碍)距离约为396m(无天线增益),如果加装6db天线而使得发射具有指向性的话,距离将增加到792m(每增加6db,距离便翻一倍)。
2.加密选择WPA2;
3.引脚数为32pin,17个GPIO;
4.32 位微型 MCU,带有 16 位精简模式,主频支持 80 MHz 和160 MHz,支持 RTOS;
5.ESP8266EX 片上没有 programmable ROM,用户程序存放在外部的 SPI Flash 中;

2.ESP8266官方IDE开发
笔者原想细致写一下相关专题,但在搜集相关文章时发现已有人写的比较完善:
1.ESP8266库开发教程(基于乐鑫公司官方库[基于嵌入式OS系统]);
2.ESP8266常见问题(更多问题可访问乐鑫问题库);
4.补充内容
4.1.esp8266中“while(1)” 循环(因看门狗复位导致)
那么我们可以禁止看门狗复位吗?
在non-OS SDK中用户可以通过创建 timer 和 call_back 函数代替 while(1) 循环。
如果某段代码连续执行时间必须超过3.2s,用户用下面的方式解决看门狗复位的问题。
方法一:在执行该代码段前调用system_soft_wdt_stop() 函数,从关闭 wdt 到硬 wdt 触发,有6s的时间。
方法二:在代码段里执行若干次喂狗操作 system_soft_wdt_feed()。
方法三:在代码段执行完毕后,调用 system_soft_wdt_restart() 函数。
4.2.关于“os_delay_us();”延时时间问题
void ets_delay_us(uint32_t us);
ESP8266_NONOS_SDK-2.2.0中的结果,us(max)=4294967295us=429s
4.3.esp8266中“while(1)” 不能和软件定时器共存
void Led_Task_Run(void)
{
os_printf("\r\nHello world !\r\n");
}
void ICACHE_FLASH_ATTR user_init(void)
{
static os_timer_t os_timer;
gpio_init();
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14);
os_timer_disarm( &os_timer);
os_timer_setfn( &os_timer, (ETSTimerFunc *) ( Led_Task_Run ), NULL );
os_timer_arm( &os_timer,50, true );
while(1)
{
GPIO_OUTPUT_SET(14, 1);
os_delay_us(500000);
GPIO_OUTPUT_SET(14, 0);
os_delay_us(500000);
system_soft_wdt_feed();
}
}

void Led_Task_Run(void)
{
os_printf("\r\nHello world !\r\n");
}
void ICACHE_FLASH_ATTR user_init(void)
{
static os_timer_t os_timer;
gpio_init();
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14);
os_timer_disarm( &os_timer);
os_timer_setfn( &os_timer, (ETSTimerFunc *) ( Led_Task_Run ), NULL );
os_timer_arm( &os_timer,60, 1);
GPIO_OUTPUT_SET(14, 1);
os_delay_us(1000000);
os_printf("\r\nOK !\r\n");
GPIO_OUTPUT_SET(14, 0);
os_delay_us(1000000);
os_printf("\r\nOK !\r\n");
}

4.4.PWM输出毛刺
uint32 pwm_duty_init[3]={1000,10000,0};
uint32 io_info[3][3]={{PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12,12},{PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13,13},{PERIPHS_IO_MUX_MTDO_U,FUNC_GPIO15,15}};
uint32 duty[3]= {1000,10000,222222}; //占空比分别为0.2%、 2.2%、50%【duty:设置高电平时间参数,占空比的值为 (duty*45)/ (period*1000),period :“pwm_init(1000,duty,3,io_info);”中“1000”,单位为微秒】
pwm_init(1000,duty,3,io_info);