概述
跨过前面的一个烧录大坑,终于迎来自己的第一个小实验
一、工程下创建文件夹
这是我在调试的时候遇到的一个问题,串口打印的问题
我在调用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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复