ESP-12S学习(2)--点亮LED
跨过前面的一个烧录大坑,终于迎来自己的第一个小实验
一、工程下创建文件夹
这是我在调试的时候遇到的一个问题,串口打印的问题
我在调用uart_init()
的时候报错没有定义,但是我明明就已经导入了uart.h
文件,查看文件所在,发现是工程文件夹
→driver_lib
→include
→driver
→uart.h
路径下(见图1),而导入是在driver
→uart.h
(见图2)
图1
图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
endifINCLUDES := $(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); // 选择GPIO5GPIO_OUTPUT_SET(GPIO_ID_PIN(5),1); // GPIO5输出1PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12); // 选择GPIO12PIN_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相关推荐
- 【STM32学习笔记-点亮LED灯】
STM32学习笔记-点亮LED灯 文章目录 STM32学习笔记-点亮LED灯 一.原理图分析 二.代码分析 1.mian函数 2.led.c函数 3.led.h函数 4.函数文件整理 5.LED_In ...
- STM32学习笔记——点亮LED
STM32学习笔记--点亮LED 本人学习STM32是直接通过操作stm32的寄存器,使用的开发板是野火ISO-V2版本: 先简单的介绍一下stm32的GPIO: stm32的GPIO有多种模式: 1 ...
- N76E003 学习一 点亮LED
//这3个头文件一般是必须的 #include "N76E003.h" #include "SFR_Macro.h" #include "Functi ...
- 嵌入式开发学习之--点亮LED灯(中)
上篇我们主要学习的是环境搭建和实际操作,这篇详细记录一下整个思考的过程. 首先,我们需要想一个问题,这个灯为什么会亮? 物理上来说,LED灯属于发光二极管,只要有正确的电压就会发亮.也就是说,我们烧写 ...
- 嵌入式开发学习之--点亮LED灯(上)
在嵌入式学习里,点亮LED灯的地位就如同编程语言学习里的"hello world",是每个初学者都必须经历的一关,因为点亮了LED灯,至少可以说明几件事: 1.开发环境没问题,包括 ...
- STM8学习笔记---点亮LED灯
对单片机操作时一般有三个步骤,1.系统时钟选择.2.单片机外设初始化.3主程序编写. 同样要点亮LED灯时,也要按照这个步骤来. 首先选择系统时钟,打开STM8S中文参考手册,找到时钟寄存器 可以看到 ...
- 基于Jetson Nano2GB 的 40Pin学习 GPIO 点亮LED灯笔记记录
Jetson Nano(含2GB).Xavier NX 等开发套件的引脚也兼容于树莓派的定义时,就表示上面列表中的周边设备,都能直接适用于现在主流的 Jetson 开发套件,不仅无需依赖中间的转换器, ...
- 普中51单片机学习日记-点亮LED
普中51单片机中LED小灯所用端口为P2端口,从P2^0到P2^7分别为从左到右八个小灯. 可以使用sbit关键字定义变量led,以此简化端口的输入,并且使程序的可读性增强. 当变量的值设置为0,即端 ...
- zigbee学习之路(二)点亮LED
一.前言 今天,我来教大家如何点亮led,这也是学习开发板最基础的步骤了. 二.原理分析 cc2530芯片跟虽然是51的内核,但是它跟51单片机还是有区别的,51单片机不需要对IO口进行配置,而cc2 ...
- 蓝桥杯单片机比赛学习:1、led点亮原理
此教程是鄙人蓝桥杯单片机的学习过程总结,可能会有错误,请指出批评.蓝桥杯单片机学习最重要的是将整个单片机模块化,比如,我们可以将它分为LED.蜂鸣器.继电器.数码管.按键.AD/DA.555定时器.光 ...
最新文章
- 乾坤合一~Linux设备驱动之终端设备驱动
- ipvs-dr模型及算法、keepalived基本应用、keepalive+ipvs实现高可用
- 内置host_浏览器内置对象应用实践
- Java URL传参中文乱码问题
- github本地文件和远端文件的协同
- POJ1185 炮兵阵地 状压DP
- C++游戏入门书籍推荐
- 统计一个数字在排序数组中出现的次数
- wos 文献被引_CiteSpace与Histcite在文献引用上的区别
- Sqlite3修复数据库
- 2005年1月8日——最伤心的一天
- 杭电 1242题(深度优先搜索)
- 2016年4月11日作业
- cad插入块_CAD中的块,用得好,画图快人一步!
- Unity app 如何打开商店
- win 10计算机查找大文件,教你如何在Win10系统中查找大文件?
- 习题5-3 使用函数计算两点间的距离 (10 分)
- 2021-2022年小学期 程序设计开发实践 随堂笔记
- Greenplum常用SQL——通过表名查找shema名
- 我的游戏学习日志10——数字游戏策划(5)游戏策划的概念与分工
热门文章
- 网络爬虫之scrapy爬取某招聘网手机APP发布信息
- 给Unity程序员的虚幻入门书-虚幻5如何像Unity一样复制一份资源
- 教师教学评价系统【数据库设计、论文、源码、开题报告】
- VPS 2021必备工具 XSHELL PUTTY WINSCP
- 回顾阿里巴巴Java开发手册中分层领域模型规约之DO,DTO,BO,AO,VO,POJO
- 使用高防服务器的好处
- SQL SERVER 2约束的创建,删除,重命名
- 子曰:“吾十有五而志于学.......
- logback--进阶--05--自定义Appenders
- 【项目管理】项目中的进度管理,你知道多少?