esp8266学习笔记(2)——点亮一盏led灯

根据传统,从点亮一盏led灯开始吧。
查阅手册,这个gpio设置还是比较简单的。esp8266学习笔记(2)——点亮一盏led灯_第1张图片
esp8266学习笔记(2)——点亮一盏led灯_第2张图片
一个按键一个led,按键控制led灯的简单代码。


#include "driver/public.h"
#include "gpio.h"  //端口控制需要的头文件
#include "ets_sys.h"
#include "osapi.h"
#include "os_type.h"
void delay_ms(uint16 x)
{
	for(;x>0;x--)
	{
	  os_delay_us(1000);
	}
}

/*主函数入口*/
void ICACHE_FLASH_ATTR
user_init(void)
{

	    //uart_init(115200, 115200);//设置串口0和串口1的波特率
	    os_printf("download time:%s %s",__DATE__,__TIME__);
	    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14);//选择GPIO14
	    GPIO_OUTPUT_SET(GPIO_ID_PIN(14), 1);//GPIO14为高

	    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U,FUNC_GPIO2);//选择GPIO2
	    GPIO_DIS_OUTPUT(GPIO_ID_PIN(2)) ; // 设置GPIO2为输入

	    while(1)
	    {

		    if(GPIO_INPUT_GET(GPIO_ID_PIN(2))==0x00)//读取GPIO2的值,按键按下为0
		    {
				delay_ms(20); //延时20MS,去抖
				if(GPIO_INPUT_GET(GPIO_ID_PIN(2))==0x00)
				{
					GPIO_OUTPUT_SET(GPIO_ID_PIN(14), 1);	     //GPIO16为高

					while(GPIO_INPUT_GET(GPIO_ID_PIN(2))==0x00);           //等待按键释放
				}

			}
		    GPIO_OUTPUT_SET(GPIO_ID_PIN(14), 0);	     //GPIO16为低
	    }

}


/******************************************************************************
 * FunctionName : user_rf_cal_sector_set
 * Description  : SDK just reversed 4 sectors, used for rf init data and paramters.
 *                We add this function to force users to set rf cal sector, since
 *                we don't know which sector is free in user's application.
 *                sector map for last several sectors : ABCCC
 *                A : rf cal
 *                B : rf init data
 *                C : sdk parameters
 * Parameters   : none
 * Returns      : rf cal sector
*******************************************************************************/
uint32 ICACHE_FLASH_ATTR
user_rf_cal_sector_set(void)
{
    enum flash_size_map size_map = system_get_flash_size_map();
    uint32 rf_cal_sec = 0;

    switch (size_map) {
        case FLASH_SIZE_4M_MAP_256_256:
            rf_cal_sec = 128 - 5;
            break;

        case FLASH_SIZE_8M_MAP_512_512:
            rf_cal_sec = 256 - 5;
            break;

        case FLASH_SIZE_16M_MAP_512_512:
            rf_cal_sec = 512 - 5;
            break;
        case FLASH_SIZE_16M_MAP_1024_1024:
            rf_cal_sec = 512 - 5;
            break;

        case FLASH_SIZE_32M_MAP_512_512:
            rf_cal_sec = 1024 - 5;
            break;
        case FLASH_SIZE_32M_MAP_1024_1024:
            rf_cal_sec = 1024 - 5;
            break;

        case FLASH_SIZE_64M_MAP_1024_1024:
            rf_cal_sec = 2048 - 5;
            break;
        case FLASH_SIZE_128M_MAP_1024_1024:
            rf_cal_sec = 4096 - 5;
            break;
        default:
            rf_cal_sec = 0;
            break;
    }

    return rf_cal_sec;
}

void ICACHE_FLASH_ATTR
user_rf_pre_init(void){}


编译下载就可以了。这里有踩过几个坑记一下。

  • 编辑完记得保存再编译,否则编译的是上次保存的文件跟keil有所区别(被这个折腾了好久╯ω╰)
  • user_rf_cal_sector_set(void)这个函数不能删掉,弄空文档的时候不知道这个有上面用就把这个删了,后面编译老是报错
    ../Makefile:396: recipe for target '.output/eagle/debug/image/eagle.app.v6.out' failed make[1]: *** [.output/eagle/debug/image/eagle.app.v6.out] Error 1 make[1]: Leaving directory '/cygdrive/d/esp8266/Wdeng/app' make: *** [.subdirs] Error 2 Makefile:330: recipe for target '.subdirs' failed
    后来查了手册发现这个是不能删的esp8266学习笔记(2)——点亮一盏led灯_第3张图片
    所以一个空的工程文件user_main里面应该有user_init(void)、user_rf_cal_sector_set(void)、user_rf_pre_init(void)三个函数,最后一个函数要不要好像是看sdk版本的。
  • 有个问题还没有解决,打算后面再去解决,先码着。调用uart_init初始化串口波特率后就不打印我后面的os_printf了,其他都正常跑的,系统打印也是有的,把初始化拿掉就可以打印了,好像是这个初始化影响到了串口的打印,具体是什么问题一时间没找到,非常欢迎大神解惑。

你可能感兴趣的:(esp8266学习笔记)