1、开发环境:
Windows 10 专业版,AiThinkerIDE_V1.5.2,ESP8266_NONOS_SDK_master,从串口打印信息获知是SDK3.0.6版本,最近(2022.10份)从github上获得。AiThinkerIDE_V1.5.2中导入ESP8266_NONOS_SDK_master,右键—>Properties
修改build command 为make COMPILE=gcc BOOT=new APP=1 SPI_SPEED=40 SPI_MODE=QIO SPI_SIZE_MAP=4
2、在创建driver中创建一个delay.c文件,在include/driver中创建delay.h文件
/*
* delay.c
*
* Created on: 2022年10月13日
* Author: Administrator
*/
#include "driver/delay.h"
void DelayUs(uint16 us)
{
uint16 i,j,k;
for(i=us;i>0;i--)
{
for(j=26;j>0;j--)
{
k++;
}
}
}
void DelayMs(uint16 ms)
{
uint16 i,j;
for(i=ms;i>0;i--)
{
for(j=1000;j>0;j--)
{
DelayUs(1);
}
}
}
void os_DelayMs(uint32 ms)
{
uint32 i,j;
for(i=ms;i>0;i--)
{
for(j=1000;j>0;j--)
{
os_delay_us(1);
}
}
}
/*
* delay.h
*
* Created on: 2022年10月13日
* Author: Administrator
*/
#ifndef DRIVER_LIB_INCLUDE_DELAY_H_
#define DRIVER_LIB_INCLUDE_DELAY_H_
#include "ets_sys.h"
#include "osapi.h"
void DelayUs(uint16 );
void DelayMs(uint16 );
void os_DelayMs(uint32 );
#endif /* DRIVER_LIB_INCLUDE_DELAY_H_ */
3、user_main.c 中添加如下内容,编译后出现 undefined reference to `os_DelayMs’错误
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_init(void)
{
partition_item_t partition_item;
os_printf("SDK version:%s\n", system_get_sdk_version());
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U,FUNC_GPIO2);
GPIO_OUTPUT_SET(GPIO_ID_PIN(2),1);
while(1)
{
system_soft_wdt_feed();
GPIO_OUTPUT_SET(GPIO_ID_PIN(2),1);
os_printf("led_on\n");
os_DelayMs(500);
GPIO_OUTPUT_SET(GPIO_ID_PIN(2),0);
os_DelayMs(500);
os_printf("led_off\n");
}
}
在文件的上面,明明添加了#include “driver/delay.h”,为什么会出现undefined reference to 这个错误呢?这个问题是因为项目Makefile文件没有添加driver与include路径造成的。打开makefile文件,找到: SUBDIRS= \ 与COMPONENTS_eagle.app.v6 = \
SUBDIRS= \
user \
driver
endif # } PDIR
APPDIR = .
LDDIR = ../ld
CCFLAGS += -Os
TARGET_LDFLAGS = \
-nostdlib \
-Wl,-EL \
--longcalls \
--text-section-literals
ifeq ($(FLAVOR),debug)
TARGET_LDFLAGS += -g -O2
endif
ifeq ($(FLAVOR),release)
TARGET_LDFLAGS += -g -O0
endif
COMPONENTS_eagle.app.v6 = \
user/libuser.a \
driver/libdriver.a
添加如下内容: driver,driver/libdriver.a,不要忘了前面的斜杠“\”,点击保存,然后再clean Project与Build Project,编译成功,好像这个叫注册目录吧。
4、还有一个问题,自己写的delay函数,延时不靠谱,不知道为什么
在delay.c中,自己编写了两个延时函数,一个延时us,一个延时ms,根据esp8266的晶体频率,应该没有问题,但是,不管写多大的参数,几乎就不能延时。以下函数,延时没有效果。
void DelayUs(uint16 us)
{
uint16 i,j,k;
for(i=us;i>0;i--)
{
for(j=26;j>0;j--)
{
k++;
}
}
}
void DelayMs(uint16 ms)
{
uint16 i,j;
for(i=ms;i>0;i--)
{
for(j=1000;j>0;j--)
{
DelayUs(1);
}
}
}
只能用系统自带的延时函数os_delay_us(),以及用这个函数构建的ms延时函数
void os_DelayMs(uint32 ms)
{
uint32 i,j;
for(i=ms;i>0;i--)
{
for(j=1000;j>0;j--)
{
os_delay_us(1);
}
}
}