跨过前面的一个烧录大坑,终于迎来自己的第一个小实验
一、工程下创建文件夹
这是我在调试的时候遇到的一个问题,串口打印的问题
我在调用uart_init()的时候报错没有定义,但是我明明就已经导入了uart.h文件,查看文件所在,发现是工程文件夹→driver_lib→include→driver→uart.h路径下(见图1),而导入是在driver→uart.h(见图2)


Makefile编译,所有的依赖关系都被记录在Makefile文件上,app文件夹下面的user是被编译的文件夹,参考user文件夹下面的Makefile文件,在app文件夹下面创建driver文件夹,复制user下面的Makefile和driver_lib/driver下面的uart.c到app/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 开头的宏作的用就是因为esp8266的ram有限,所以在启动的时候就不可能把所有的数据都载入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内容请搜索靠谱客的其他文章。
发表评论 取消回复