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

一、工程下创建文件夹

这是我在调试的时候遇到的一个问题,串口打印的问题
我在调用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
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 开头的宏作的用就是因为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);    // 选择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相关推荐

  1. 【STM32学习笔记-点亮LED灯】

    STM32学习笔记-点亮LED灯 文章目录 STM32学习笔记-点亮LED灯 一.原理图分析 二.代码分析 1.mian函数 2.led.c函数 3.led.h函数 4.函数文件整理 5.LED_In ...

  2. STM32学习笔记——点亮LED

    STM32学习笔记--点亮LED 本人学习STM32是直接通过操作stm32的寄存器,使用的开发板是野火ISO-V2版本: 先简单的介绍一下stm32的GPIO: stm32的GPIO有多种模式: 1 ...

  3. N76E003 学习一 点亮LED

    //这3个头文件一般是必须的 #include "N76E003.h" #include "SFR_Macro.h" #include "Functi ...

  4. 嵌入式开发学习之--点亮LED灯(中)

    上篇我们主要学习的是环境搭建和实际操作,这篇详细记录一下整个思考的过程. 首先,我们需要想一个问题,这个灯为什么会亮? 物理上来说,LED灯属于发光二极管,只要有正确的电压就会发亮.也就是说,我们烧写 ...

  5. 嵌入式开发学习之--点亮LED灯(上)

    在嵌入式学习里,点亮LED灯的地位就如同编程语言学习里的"hello world",是每个初学者都必须经历的一关,因为点亮了LED灯,至少可以说明几件事: 1.开发环境没问题,包括 ...

  6. STM8学习笔记---点亮LED灯

    对单片机操作时一般有三个步骤,1.系统时钟选择.2.单片机外设初始化.3主程序编写. 同样要点亮LED灯时,也要按照这个步骤来. 首先选择系统时钟,打开STM8S中文参考手册,找到时钟寄存器 可以看到 ...

  7. 基于Jetson Nano2GB 的 40Pin学习 GPIO 点亮LED灯笔记记录

    Jetson Nano(含2GB).Xavier NX 等开发套件的引脚也兼容于树莓派的定义时,就表示上面列表中的周边设备,都能直接适用于现在主流的 Jetson 开发套件,不仅无需依赖中间的转换器, ...

  8. 普中51单片机学习日记-点亮LED

    普中51单片机中LED小灯所用端口为P2端口,从P2^0到P2^7分别为从左到右八个小灯. 可以使用sbit关键字定义变量led,以此简化端口的输入,并且使程序的可读性增强. 当变量的值设置为0,即端 ...

  9. zigbee学习之路(二)点亮LED

    一.前言 今天,我来教大家如何点亮led,这也是学习开发板最基础的步骤了. 二.原理分析 cc2530芯片跟虽然是51的内核,但是它跟51单片机还是有区别的,51单片机不需要对IO口进行配置,而cc2 ...

  10. 蓝桥杯单片机比赛学习:1、led点亮原理

    此教程是鄙人蓝桥杯单片机的学习过程总结,可能会有错误,请指出批评.蓝桥杯单片机学习最重要的是将整个单片机模块化,比如,我们可以将它分为LED.蜂鸣器.继电器.数码管.按键.AD/DA.555定时器.光 ...

最新文章

  1. 乾坤合一~Linux设备驱动之终端设备驱动
  2. ipvs-dr模型及算法、keepalived基本应用、keepalive+ipvs实现高可用
  3. 内置host_浏览器内置对象应用实践
  4. Java URL传参中文乱码问题
  5. github本地文件和远端文件的协同
  6. POJ1185 炮兵阵地 状压DP
  7. C++游戏入门书籍推荐
  8. 统计一个数字在排序数组中出现的次数
  9. wos 文献被引_CiteSpace与Histcite在文献引用上的区别
  10. Sqlite3修复数据库
  11. 2005年1月8日——最伤心的一天
  12. 杭电 1242题(深度优先搜索)
  13. 2016年4月11日作业
  14. cad插入块_CAD中的块,用得好,画图快人一步!
  15. Unity app 如何打开商店
  16. win 10计算机查找大文件,教你如何在Win10系统中查找大文件?
  17. 习题5-3 使用函数计算两点间的距离 (10 分)
  18. 2021-2022年小学期 程序设计开发实践 随堂笔记
  19. Greenplum常用SQL——通过表名查找shema名
  20. 我的游戏学习日志10——数字游戏策划(5)游戏策划的概念与分工

热门文章

  1. 网络爬虫之scrapy爬取某招聘网手机APP发布信息
  2. 给Unity程序员的虚幻入门书-虚幻5如何像Unity一样复制一份资源
  3. 教师教学评价系统【数据库设计、论文、源码、开题报告】
  4. VPS 2021必备工具 XSHELL PUTTY WINSCP
  5. 回顾阿里巴巴Java开发手册中分层领域模型规约之DO,DTO,BO,AO,VO,POJO
  6. 使用高防服务器的好处
  7. SQL SERVER 2约束的创建,删除,重命名
  8. 子曰:“吾十有五而志于学.......
  9. logback--进阶--05--自定义Appenders
  10. 【项目管理】项目中的进度管理,你知道多少?