我是靠谱客的博主 清新大碗,最近开发中收集的这篇文章主要介绍ESP-12S学习(2)--点亮LED,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

跨过前面的一个烧录大坑,终于迎来自己的第一个小实验

一、工程下创建文件夹

这是我在调试的时候遇到的一个问题,串口打印的问题
我在调用uart_init()的时候报错没有定义,但是我明明就已经导入了uart.h文件,查看文件所在,发现是工程文件夹driver_libincludedriveruart.h路径下(见图1),而导入是在driveruart.h(见图2)
在这里插入图片描述

图1

在这里插入图片描述

图2

Makefile编译,所有的依赖关系都被记录在Makefile文件上,app文件夹下面的user是被编译的文件夹,参考user文件夹下面的Makefile文件,在app文件夹下面创建driver文件夹,复制user下面的Makefiledriver_lib/driver下面的uart.capp/driver文件夹中
在这里插入图片描述
打开Makefile文件修改

ifndef PDIR
// 修改libuser.a为libdriver.a(这个名字是自己定的随便起,写1.a也是可以的)
// GEN_LIBS = libuser.a
GEN_LIBS = libdriver.a
endif

INCLUDES := $(INCLUDES) -I $(PDIR)include
INCLUDES += -I ./
INCLUDES += -I ../../include/ets
PDIR := ../$(PDIR)
sinclude $(PDIR)Makefile

然后仿照driver_lib文件夹,在app文件夹中创建include/driver(用于存放头文件)
在这里插入图片描述
这里面还需要在app下面的Makefile文件里面修改一点东西,以连接上driver
在这里插入图片描述
在这里插入图片描述
增加两处代码
这样在user_main.c文件里面就可以include "driver/uart.h"这么引用uart.h


二、点亮LED
P1:

首先解释一下ICACHE_FLASH_ATTR这个宏定义,这部分内容引用于文章《ESP8266—“ICACHE_FLASH_ATTR”宏——解释含义》

const uint8 MyArr[1024] ICACHE_RODATA_ATTR = {0};
void MyFun() ICACHE_FLASH_ATTR {
}

这种 ICACHE 开头的宏作的用就是因为esp8266ram有限,所以在启动的时候就不可能把所有的数据都载入ram,只能是先载入必要的数据,其他数据保留在Flash中,在需要的时候读取。esp8266的固件有5个有效段,分别是 .data.rodata.bss.text.irom0.text,(这些都是从编译好的elf文件中提取的)其中 .data.rodata.bss.text 这四个段在启动的时候被载入内存,.irom0.text 则通过内存映射的方式访问,不会占用宝贵的ram。所以不是必要的数据都可以装入 .irom0.text 这个段中以节省ram占用。另外需要注意的是,任何中断函数都不可以存放在 .irom0.text 中,会crash!!!

#define ICACHE_FLASH_ATTR __attribute__((section(".irom0.text")))
#define ICACHE_RODATA_ATTR __attribute__((section(".irom.text")))

这两个宏就是告诉编译器数据的保存位置。变量用 ICACHE_RODATA_ATTR ,(切记变量必须是 const 类型的),函数用 ICACHE_FLASH_ATTR


P2:ESP提供的IO接口函数
PIN_PULLUP_DIS(PIN_NAME)		//管脚上拉屏蔽
PIN_PULLUP_EN(PIN_NAME) 		//管脚上拉使能
PIN_FUNC_SELECT(PIN_NAME, FUNC) //管脚功能选择

在这里插入图片描述

!!!:

PIN_NAME最多到PERIPHS_IO_MUX_GPIO5_U,也就是说想要单独去配置GPIO12~GPIO16是没有办法的

GPIO_OUTPUT_SET(gpio_no,bit_value)	//设置 gpio_no 管脚输出 bit_value,与上⼀节的输出⾼低电平的示例相同。
GPIO_DIS_OUTPUT(gpio_no) 			//设置 gpio_no 管脚输⼊,与上⼀节的设置输⼊示例相同。
GPIO_INPUT_GET(gpio_no) 			//获取 gpio_no 管脚的电平状态。

假设是第5管脚,这里面的GPIO_ID_PIN(5)是等价于5的,即下面两者是一样的

GPIO_INPUT_GET(GPIO_ID_PIN(5))
GPIO_INPUT_GET(5);

P3:user_init
void ICACHE_FLASH_ATTR
user_init(void)
{
	uint8 i = 0;
	uart_init(74880, 74880);	//设置串口0和串口1的波特率
    os_printf("Hello8266!");

    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U,FUNC_GPIO5);	// 选择GPIO5
    GPIO_OUTPUT_SET(GPIO_ID_PIN(5),1);					// GPIO5输出1

    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);	// 选择GPIO12
    PIN_PULLUP_EN(PERIPHS_IO_MUX_MTDI_U);				// 上拉使能
    GPIO_DIS_OUTPUT(GPIO_ID_PIN(12));					// GPIO12输入
	PIN_PULLUP_DIS(PERIPHS_IO_MUX_GPIO5_U);
	
    while (1)
    {
        system_soft_wdt_feed();	// 喂狗

        if(GPIO_INPUT_GET(GPIO_ID_PIN(12)) == 0)	// 按键按下
        {
        	delay_ms(10);
        	if (GPIO_INPUT_GET(GPIO_ID_PIN(12)) == 0)
        	{
        		i++;
        		if (i == 1)
        			GPIO_OUTPUT_SET(GPIO_ID_PIN(5),1);
        		else
        		{
        			GPIO_OUTPUT_SET(GPIO_ID_PIN(5),0);
        			i = 0;
        		}
        		while (GPIO_INPUT_GET(GPIO_ID_PIN(12)) == 0)
        			system_soft_wdt_feed();			//喂狗
        	}
        }
    }
}
2020.5.26

到之后才发现前面有点东西是不太对的,PIN_NAME的话是没有直接的GPIO12_U之类的,他们的管脚名字不叫这个,对照这个图来配置就OK啦

2020.5.28

最后

以上就是清新大碗为你收集整理的ESP-12S学习(2)--点亮LED的全部内容,希望文章能够帮你解决ESP-12S学习(2)--点亮LED所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部