<3> esp8266 iot 软件延时

Posted 疯狂程序

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了<3> esp8266 iot 软件延时相关的知识,希望对你有一定的参考价值。

目录

一、延时函数os_delay_us

二、新建项目

三、新建文件

1.bsp_delay.c

2.bsp_delay.h

四、ICACHE_FLASH_ATTR,system_soft_wdt_feed()解析

五、user_main.c

六、程序运行结果


一、延时函数os_delay_us

二、新建项目

复制(<esp8266 iot 开发环境搭建(AiThinkerIDE_V1.5.2)>https://blog.csdn.net/qq_27558597/article/details/117656516?spm=1001.2014.3001.5502)章节的SDK模板,项目名为<002_Delay>,导入IDE,如下:

打开driver文件夹,删除暂时用不到的.c文件,以及include下的driver的对应的.h文件,过程如下:

注意不要把Makefile删除了。

三、新建文件

1.bsp_delay.c

修改bsp_delay.c内容如下:

/*
*********************************************************************************************************
*
*	程序名称: 系统延时模块
*	文件名称: bsp_delay.c
*	版    本: v1.0.0
*   编    写: 风巽云科技 lijiangmo
*	说    明: 使用os_delay_us重新封装
*
*	版本记录: 
*	v1.0.0: 2021年6月9日,初版
*
*	Copyright (C), 2021-2031, 深圳市风巽云科技有限公司 https://fxymcu.taobao.com
*
*********************************************************************************************************
*/

#include "osapi.h"
#include "user_interface.h"

/*
*********************************************************************************************************
*	函 数 bsp_DelayUsUs
*	功能说明: us延时
*	形    参: ulNus: 延时值,注意最大延时值为 2^24 / fUsValueCount)
*	返 回 值: 无
*********************************************************************************************************
*/
void ICACHE_FLASH_ATTR bsp_DelayUs(uint32_t ulNus)
{
    os_delay_us(ulNus);
}

/*
*********************************************************************************************************
*	函 数 bsp_DelayMsMs
*	功能说明: ms延时
*	形    参: ulNms: 毫秒延时值
*	返 回 值: 无
*********************************************************************************************************
*/
void ICACHE_FLASH_ATTR bsp_DelayMs(uint32_t ulNms)
{
    uint32_t ulStatus;

    while (ulNms)
    {
        /* 延时1000us */
        os_delay_us(1000);
        /* 清零看门狗计数器 */
        system_soft_wdt_feed();
        ulNms--;
    }
}

/********************************************* End of file **********************************************/

2.bsp_delay.h

修改bsp_delay.h内容如下:

/*
*********************************************************************************************************
*
*	程序名称: 系统延时模块
*	文件名称: bsp_delay.h
*	版    本: v1.0.0
*   编    写: 风巽云科技 lijiangmo
*   日    期: 2021年6月9日
*
*	Copyright (C), 2021-2031, 深圳市风巽云科技有限公司 https://fxymcu.taobao.com
*
*********************************************************************************************************
*/

#ifndef __BSP_DELAY_H
#define __BSP_DELAY_H

/* 供外部调用函数 */
void ICACHE_FLASH_ATTR bsp_DelayUs(uint32_t ulNus);
void ICACHE_FLASH_ATTR bsp_DelayMs(uint32_t ulNms);

#endif

/********************************************* End of file **********************************************/

四、ICACHE_FLASH_ATTR,system_soft_wdt_feed()解析

五、user_main.c

/*
 * ESPRESSIF MIT License
 *
 * Copyright (c) 2016 <ESPRESSIF SYSTEMS (SHANGHAI) PTE LTD>
 *
 * Permission is hereby granted for use on ESPRESSIF SYSTEMS ESP8266 only, in which case,
 * it is free of charge, to any person obtaining a copy of this software and associated
 * documentation files (the "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the Software is furnished
 * to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies or
 * substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 */

/*
*********************************************************************************************************
*
*	程序名称: 软件延时
*	文件名称: user_main.c
*   MCU型号 : ESP8266 FLASH:4MB RAM: 160KB(64KB为iRAM,96KB为dRAM)
*   运行平台: ESP8266 IoT开发板
*	版    本: v1.0.0
*   编    写: 风巽云科技 lijiangmo
*	说    明: 软件延时
*
*	版本记录:
*	v1.0.0: 2021年6月9日,初版
*
*	Copyright (C), 2021-2031, 深圳市风巽云科技有限公司 https://fxymcu.taobao.com
*
*********************************************************************************************************
*/

#include "ets_sys.h"
#include "osapi.h"
#include "mem.h"
#include "user_interface.h"
#include "sntp.h"
#include "smartconfig.h"
#include "espconn.h"

#include "driver/uart.h"
#include "driver/bsp_delay.h"

/* FLASH分区表 */
#if ((SPI_FLASH_SIZE_MAP == 0) || (SPI_FLASH_SIZE_MAP == 1))
#error "The flash map is not supported"
#elif (SPI_FLASH_SIZE_MAP == 2)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0xfb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0xfc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0xfd000
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 0x7c000
#elif (SPI_FLASH_SIZE_MAP == 3)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0x1fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0x1fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0x1fd000
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 0x7c000
#elif (SPI_FLASH_SIZE_MAP == 4)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0x3fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0x3fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0x3fd000
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 0x7c000
#elif (SPI_FLASH_SIZE_MAP == 5)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x101000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0x1fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0x1fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0x1fd000
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 0xfc000
#elif (SPI_FLASH_SIZE_MAP == 6)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x101000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0x3fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0x3fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0x3fd000
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 0xfc000
#else
#error "The flash map is not supported"
#endif

#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM SYSTEM_PARTITION_CUSTOMER_BEGIN

static const partition_item_t at_partition_table[] = {
    {SYSTEM_PARTITION_BOOTLOADER, 0x0, 0x1000},
    {SYSTEM_PARTITION_OTA_1, 0x1000, SYSTEM_PARTITION_OTA_SIZE},
    {SYSTEM_PARTITION_OTA_2, SYSTEM_PARTITION_OTA_2_ADDR, SYSTEM_PARTITION_OTA_SIZE},
    {SYSTEM_PARTITION_RF_CAL, SYSTEM_PARTITION_RF_CAL_ADDR, 0x1000},
    {SYSTEM_PARTITION_PHY_DATA, SYSTEM_PARTITION_PHY_DATA_ADDR, 0x1000},
    {SYSTEM_PARTITION_SYSTEM_PARAMETER, SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR, 0x3000},
    {SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM, SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR, 0x1000},
};

/*
*********************************************************************************************************
*	函 数 名: user_pre_init
*	功能说明: 注册分区表
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void ICACHE_FLASH_ATTR user_pre_init(void)
{
	os_printf("->SPI_FLASH_SIZE_MAP = %d\\r\\n", SPI_FLASH_SIZE_MAP);
	if (!system_partition_table_regist(at_partition_table, sizeof(at_partition_table) / sizeof(at_partition_table[0]), SPI_FLASH_SIZE_MAP))
	{
		os_printf("->system_partition_table_regist fail\\r\\n");
		while (1)
		{
		}
	}
	os_printf("->system_partition_table_regist success\\r\\n");
}

/*
*********************************************************************************************************
*	函 数 名: PrintfSystempInfo
*	功能说明: 打印例程名称和例程发布日期
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
static void ICACHE_FLASH_ATTR PrintfSystempInfo(void)
{
    os_printf("\\r\\n\\r\\n");
    os_printf("-------------------------------------------------------------\\r\\n");
    os_printf("->ESP8266 IoT\\r\\n");
    /* SDK版本 */
    os_printf("->SDK: %s\\r\\n", system_get_sdk_version());
    /* 编译时间 */
    os_printf("->Build: %s %s\\r\\n", __DATE__, __TIME__);
    /* 芯片ID */
    os_printf("->CPU ID: 0x%X\\r\\n", system_get_chip_id());
    /* CPU时钟 */
    os_printf("->CPU Freq: %dMHz\\r\\n", system_get_cpu_freq());
    /* FLASH ID */
    os_printf("->FLASH ID: 0x%X\\r\\n", spi_flash_get_id());
    /* 查询系统剩余可用heap区空间 */
    os_printf("->Heap Size: %dByte %dKB\\r\\n", system_get_free_heap_size(), system_get_free_heap_size() / 1024);
    /* 打印系统内存空间分配,打印信息包括 data/rodata/bss/heap */
    system_print_meminfo();
    os_printf("-------------------------------------------------------------\\r\\n\\r\\n");
}

/*
*********************************************************************************************************
*	函 数 名: user_init
*	功能说明: 用户应用初始化
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void ICACHE_FLASH_ATTR user_init(void)
{
    partition_item_t partition_item;
    uint8_t ucTimeCnt = 0;

    if (!system_partition_get_item(SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM, &partition_item))
    {
        os_printf("Get partition information fail\\r\\n");
    }

    /* 硬件初始化 */
	//system_update_cpu_freq(SYS_CPU_80MHZ);     /* CPU频率80MHz-默认 */
	//UART_SetPrintPort(0);                      /* 系统Debug信息从串口0输出-默认 */
	//uart_init(BIT_RATE_74880, BIT_RATE_74880); /* 初始化波特率-默认 */
    bsp_DelayUs(1000);

	/* 串口打印系统信息 */
	PrintfSystempInfo();

	while(1)
	{
		ucTimeCnt++;
		os_printf("ucTimeCnt = %d\\r\\n", ucTimeCnt);
		bsp_DelayMs(200);
	}
}

/********************************************* End of file **********************************************/

注:源文件修改后要点击保存,编译器编译时是以保存文件为准。

项目名上右键选择Properties配置工程,选择C/C++ Build->Build command中添加编译规则(make COMPILE=gcc BOOT=none APP=0 SPI_SPEED=40 SPI_MODE=DIO SPI_SIZE_MAP=4),可以根据实际情况来更改规则,点击OK退出。

项目名上右键清除项目,编译项目,如下:

下载程序,如果不清楚怎么下载程序请查看<esp8266 iot 程序下载>https://blog.csdn.net/qq_27558597/article/details/117666184?spm=1001.2014.3001.5502

六、程序运行结果

打开串口调试助手,波特率设置为74880bps(esp8266默认波特率)

全部内容如下:


 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x40100000, len 25964, room 16 
tail 12
chksum 0xec
ho 0 tail 12 room 4
load 0x3ffe8000, len 1272, room 12 
tail 12
chksum 0x76
ho 0 tail 12 room 4
load 0x3ffe8500, len 1688, room 12 
tail 12
chksum 0xc2
csum 0xc2
->SPI_FLASH_SIZE_MAP = 4
->system_partition_table_regist success
V2
Mo
�rf cal sector: 1019
freq trace enable 0
rf[112] : 00
rf[113] : 00
rf[114] : 01

SDK ver: 3.0.4(9532ceb) compiled @ May 22 2020 16:26:04
phy ver: 1156_0, pp ver: 10.2



-------------------------------------------------------------
->ESP8266 IoT
->SDK: 3.0.4(9532ceb)
->Build: Jun  9 2021 09:36:01
->CPU ID: 0x5D1487
->CPU Freq: 80MHz
->FLASH ID: 0x164020
->Heap Size: 53120Byte 51KB
data  : 0x3ffe8000 ~ 0x3ffe84f6, len: 1270
rodata: 0x3ffe8500 ~ 0x3ffe8b98, len: 1688
bss   : 0x3ffe8b98 ~ 0x3ffeef48, len: 25520
heap  : 0x3ffeef48 ~ 0x3fffc000, len: 53432
-------------------------------------------------------------

ucTimeCnt = 1
ucTimeCnt = 2
ucTimeCnt = 3
ucTimeCnt = 4
ucTimeCnt = 5
ucTimeCnt = 6
ucTimeCnt = 7
ucTimeCnt = 8
ucTimeCnt = 9
ucTimeCnt = 10
ucTimeCnt = 11
ucTimeCnt = 12

可以看到,程序间隔200ms打印出计数值。

以上是关于<3> esp8266 iot 软件延时的主要内容,如果未能解决你的问题,请参考以下文章

<3> esp8266 iot 软件延时

<4> esp8266 iot LED灯闪烁

<4> esp8266 iot LED灯闪烁

<4> esp8266 iot LED灯闪烁

<2> esp8266 iot 程序下载

<2> esp8266 iot 程序下载