<4> esp8266 iot LED灯闪烁

Posted 疯狂程序

tags:

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

目录

一、GPIO接口API

二、新建项目

三、新建文件

1.bsp_led.c

2.bsp_led.h

四、user_main.c


一、GPIO接口API

二、新建项目

复制上节(<esp8266 iot 软件延时>https://blog.csdn.net/qq_27558597/article/details/117728922?spm=1001.2014.3001.5502)工程,重命名为003_GPIO_LED,如下:

三、新建文件

新建bsp_led.c、bsp_led.h文件,源代码文件新建方法请查看<esp8266 iot 软件延时>https://blog.csdn.net/qq_27558597/article/details/117728922?spm=1001.2014.3001.5502章节

1.bsp_led.c

模组上的LED的驱动口在esp8266上的GPIO2,高电平有效。

/*
*********************************************************************************************************
*
*	程序名称: LED灯驱动模块
*	文件名称: bsp_led.c
*	版    本: v1.0.0
*   编    写: 风巽云科技 lijiangmo
*	说    明: 
*
*	版本记录: 
*	v1.0.0: 2021年6月9日,初版
*
*	Copyright (C), 2021-2031, 深圳市风巽云科技有限公司 https://fxymcu.taobao.com
*
*********************************************************************************************************
*/
#include "ets_sys.h"
#include "gpio.h"

/* 驱动引脚定义 */
#define LED_PIN_NAME PERIPHS_IO_MUX_GPIO2_U
#define LED_FUNC FUNC_GPIO2
#define LED_GPIO_ID 2

/* LED状态 */
static uint8_t ucLedStaus;

/*
*********************************************************************************************************
*	函 数 名: bsp_InitLED
*	功能说明: 配置LED指示灯相关的GPIO
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void ICACHE_FLASH_ATTR bsp_InitLED(void)
{
    PIN_FUNC_SELECT(LED_PIN_NAME, LED_FUNC); /* GPIO2设为IO口 */
    ucLedStaus = 0;
    GPIO_OUTPUT_SET(GPIO_ID_PIN(LED_GPIO_ID), ucLedStaus); /* 设置为低电平输出 */
}

/*
*********************************************************************************************************
*	函 数 名: bsp_LED_On
*	功能说明: 点亮LED指示灯。
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void ICACHE_FLASH_ATTR bsp_LED_On(void)
{
    ucLedStaus = 1;
    GPIO_OUTPUT_SET(GPIO_ID_PIN(LED_GPIO_ID), ucLedStaus); /* 设置为高电平输出 */
}

/*
*********************************************************************************************************
*	函 数 名: bsp_LED_Off
*	功能说明: 熄灭LED指示灯。
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void ICACHE_FLASH_ATTR bsp_LED_Off(void)
{
    ucLedStaus = 0;
    GPIO_OUTPUT_SET(GPIO_ID_PIN(LED_GPIO_ID), ucLedStaus); /* 设置为低电平输出 */
}

/*
*********************************************************************************************************
*	函 数 名: bsp_LED_Toggle
*	功能说明: 翻转LED指示灯。
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void ICACHE_FLASH_ATTR bsp_LED_Toggle(void)
{
    ucLedStaus = !ucLedStaus;
    GPIO_OUTPUT_SET(GPIO_ID_PIN(LED_GPIO_ID), ucLedStaus); /* 设置为反电平输出 */
}

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

2.bsp_led.h

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

#ifndef __BSP_LED_H
#define __BSP_LED_H

/* 供外部调用函数 */
void ICACHE_FLASH_ATTR bsp_InitLED(void);
void ICACHE_FLASH_ATTR bsp_LED_On(void);
void ICACHE_FLASH_ATTR bsp_LED_Off(void);
void ICACHE_FLASH_ATTR bsp_LED_Toggle(void);

#endif

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

四、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.
 *
 */

/*
*********************************************************************************************************
*
*	程序名称: LED灯
*	文件名称: user_main.c
*   MCU型号 : ESP8266 FLASH:4MB RAM: 160KB(64KB为iRAM,96KB为dRAM)
*   运行平台: ESP8266 IoT开发板
*	版    本: v1.0.0
*   编    写: 风巽云科技 lijiangmo
*	说    明: 配置GPIO为输出模式
*
*	版本记录:
*	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"
#include "driver/bsp_led.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;

    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); /* 初始化波特率-默认 */
	os_delay_us(1000);
	bsp_InitLED();

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

	while(1)
	{
		bsp_LED_Toggle();
		bsp_DelayMs(500);
	}
}

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

程序解析:初始化LED相应IO,在while主循环里间隔500m翻转IO口电平状态。

以上是关于<4> esp8266 iot LED灯闪烁的主要内容,如果未能解决你的问题,请参考以下文章

<4> esp8266 iot LED灯闪烁

micropython-esp8266控制灯

Arduino ESP8266定时器中断

<5> esp8266 iot 按键输入

<5> esp8266 iot 按键输入

<5> esp8266 iot 按键输入