2019-08-16

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.无线信息覆盖范围的计算;

3.无线电波在自由空间传播时的距离计算方法;

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.2.ESP8266 BOOT MODE

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);

未完待续

近期项目组忙于技术研发,未能持续更新,预计3月左右将继续更新

2020/01/13 凡尘

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 完成飞机大战游戏设计 【作业要求】 自己敲一遍源代码,对自己负责 写出代码的整体框架(群里共享材料已给出,在此基础...
    棒棒糖117阅读 400评论 1赞 0
  • 新合成一个文集,用于分析、学习查理•芒格的思想,近几年陆陆续续买了几本撰写他投资思想的书,边读挺有感悟的,拾人牙慧...
    小镇蜗牛哥阅读 544评论 0赞 0
  • 为什么要使用Synchronized关键字?为了解决线程高并发安全问题,共享数据,多线程共同操作共享数据,Sync...
    xiaohuage阅读 198评论 1赞 1
  • 1、定义一个函数,任意传递三个整数类型的值,返回这三个值的和、差、平均值。 int demo(int v1, i...
    欲难满阅读 410评论 1赞 0
  • 壹 使用LinkedList集合模拟栈:底层是addLast()和removeLast()方法,还有判空方法i...
    划水小王子阅读 164评论 1赞 0

友情链接更多精彩内容