首页 > 其他分享 >RTOS_SDK-ESP8266环境搭建+独立按键

RTOS_SDK-ESP8266环境搭建+独立按键

时间:2025-01-14 16:28:39浏览次数:3  
标签:sta ESP8266 IO void RTOS key GPIO gpio SDK

本文针对ESP8266的RTOS_SDK开发编译流程出现的报错进行了一些解决,并且完成了按键控制LED功能

环境准备

硬件环境准备

  1. esp8266(焊接排针)

  2. 独立按键

  3. 杜邦线

软件环境准备

参考这位大佬:环境搭建教程

  1. ESP8266_RTOS_SDK

  2. AiThinkerIDE_V1.5.2

注意事项

  1. 出现 mintty.exe 报错

是未安装python环境问题,打开CMD窗口检查python是否安装.

  • program “g++” not found in PATH和program “gcc” not found in PATH

c/c++环境未安装,安装mingw64后解决

  • 图形配置界面闪退

打开CMD窗口检查python版本,由于AiThinkerIDE_V1.5.2内置了python版本为2.7,所以需要将cmd中运行的版本与ide安装的一致

  • 编译后蓝屏

更换电脑解决

软件开发流程

当环境搭建好后,可以进行代码编写开发

创建自定义工程

复制工程并且修改为想要的名称,我这里由于是测试GPIO故修改为GPIO_test

在这里插入图片描述

修改编译路径

在这里插入图片描述

编写功能代码

参考例程以及sdk文档:

  1. GPIO-led功能

添加头文件

#include "driver/gpio.h"

添加宏定义

// led_gpio
#define GPIO_LED_IO_NUM  2        //gpio2

Led初始化

void user_init(void)
{
        //led
        gpio_config_t io_conf;
        io_conf.pin_bit_mask = (1ULL<<GPIO_LED_IO_NUM);
        io_conf.mode = GPIO_MODE_OUTPUT;
        io_conf.intr_type = GPIO_INTR_DISABLE;
        io_conf.pull_down_en = 0;
        io_conf.pull_up_en = 0;
        gpio_config(&io_conf);
}

主循环添加

user_init();
while(1)
{
        gpio_set_level(GPIO_LED_IO_NUM,0);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
        gpio_set_level(GPIO_LED_IO_NUM,1);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
}

编译下载可看到led闪烁

  • GPIO-按键功能

添加头文件

#include "driver/gpio.h"
#include "driver/hw_timer.h"

添加宏定义(根据外接按键来)

//key_gpio
#define GPIO_KEY_IO_S1  16        //gpio16
#define GPIO_KEY_IO_S2  5
#define GPIO_KEY_IO_S3  4
#define GPIO_KEY_IO_S4  0

定义按键结构体

struct keys
{
        unsigned char judge_sta;        //判断按键按键按下的动作到了第几步
        unsigned char key_sta;                //如果按键被按下,为0
        unsigned char key_flag;        //如果确认被按下,为1
} ;
struct keys key[5]={0}; 

定义按键扫描定时器函数以及按键处理任务

//任务定义
void key_task(void *pvParameters);
void key_hw_timer_callback1(void *arg); //扫描消抖

按键初始化

void user_init(void)
{
        //led
        gpio_config_t io_conf;
        io_conf.pin_bit_mask = (1ULL<<GPIO_LED_IO_NUM);
        io_conf.mode = GPIO_MODE_OUTPUT;
        io_conf.intr_type = GPIO_INTR_DISABLE;
        io_conf.pull_down_en = 0;
        io_conf.pull_up_en = 0;
        gpio_config(&io_conf);
        //key
        io_conf.pin_bit_mask = ( (1ULL<<GPIO_KEY_IO_S1) | (1ULL<<GPIO_KEY_IO_S2) | (1ULL<<GPIO_KEY_IO_S3) |(1ULL<<GPIO_KEY_IO_S4) );
        io_conf.mode = GPIO_MODE_INPUT;
        io_conf.intr_type = GPIO_INTR_DISABLE;
        io_conf.pull_down_en = 0;
        io_conf.pull_up_en = 1;
        gpio_config(&io_conf);
}

主函数调用初始化

    //timer
    hw_timer_init(key_hw_timer_callback1, NULL);
    hw_timer_alarm_us(10000, TEST_RELOAD);//10000us=10ms 触发一次
    //task
    xTaskCreate(key_task,"key_task",512,NULL,10,NULL);

实现按键扫描以及消抖

void key_hw_timer_callback1(void *arg)
{

    key[1].key_sta = gpio_get_level(GPIO_KEY_IO_S1);
    key[2].key_sta = gpio_get_level(GPIO_KEY_IO_S2);
    key[3].key_sta = gpio_get_level(GPIO_KEY_IO_S3);
    key[4].key_sta = gpio_get_level(GPIO_KEY_IO_S4);

    for(int i=1;i<=4;i++)
    {
            switch (key[i].judge_sta)
            {
                    case 0:
                    {
                            if(key[i].key_sta==0) key[i].judge_sta = 1; //第一次判断是否按下
                    }
                    break;
                    case 1:
                    {
                            if(key[i].key_sta==0) //进入下一次定时器扫描,按键还是按下状态,那么就确认为按下,以此来消抖
                            {
                                    key[i].judge_sta = 2;
                                    key[i].key_flag = 1;
                            }
                            else    //否则就是抖动,本次不算按键被按下
                                    key[i].judge_sta = 0;
                    }
                    break;
                    case 2:
                    {
                            if(key[i].key_sta==1) key[i].judge_sta = 0; //判断是否松手,松手后按键状态重置
                    }
                    break;
            }
    }

}

实现按键处理函数

void key_task(void *pvParameters)
{
        printf("KET TASK CREATE\n");
        while(1)
        {
                if(key[1].key_flag)
                {
                        gpio_set_level(GPIO_LED_IO_NUM,0);
                        key[1].key_flag=0;
                }
                if(key[2].key_flag)
                {
                        gpio_set_level(GPIO_LED_IO_NUM,1);
                        key[2].key_flag=0;
                }
                if(key[3].key_flag)
                {
                        gpio_set_level(GPIO_LED_IO_NUM,0);
                        key[3].key_flag=0;
                }
                if(key[4].key_flag)
                {
                        gpio_set_level(GPIO_LED_IO_NUM,1);
                        key[4].key_flag=0;
                }
                vTaskDelay(10 / portTICK_PERIOD_MS);
        }
}

编译下载得到,按下按键操控led亮灭

注意事项
  1. 每个任务中必须添加vTaskDelay()函数,否则程序无法跳转空闲函数进行任务切换,且会触发看门狗重启,具体详情见RTOS内核

编译下载

  1. 编译程序

在这里插入图片描述

  • 下载程序

在这里插入图片描述
在这里插入图片描述

出现这个说明正在编译

在这里插入图片描述

注意事项

  1. 下载时需要将串口关闭,否则下载失败

源代码

user_main.c

/* GPIO Example

   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "driver/gpio.h"
#include "driver/hw_timer.h"

//timer
#define TEST_ONE_SHOT    0        // testing will be done without auto reload (one-shot)
#define TEST_RELOAD      1         // testing will be done with auto reload

// led_gpio

#define GPIO_LED_IO_NUM  2

//key_gpio
#define GPIO_KEY_IO_S1  16
#define GPIO_KEY_IO_S2  5
#define GPIO_KEY_IO_S3  4
#define GPIO_KEY_IO_S4  0
//任务定义
void key_task(void *pvParameters);
void key_hw_timer_callback1(void *arg);
struct keys
{
        unsigned char judge_sta;        //判断按键按键按下的动作到了第几步
        unsigned char key_sta;                //如果按键被按下,为0
        unsigned char key_flag;        //如果确认被按下,为1
} ;
struct keys key[5]={0};
void user_init(void)
{
        //led
        gpio_config_t io_conf;
        io_conf.pin_bit_mask = (1ULL<<GPIO_LED_IO_NUM);
        io_conf.mode = GPIO_MODE_OUTPUT;
        io_conf.intr_type = GPIO_INTR_DISABLE;
        io_conf.pull_down_en = 0;
        io_conf.pull_up_en = 0;
        gpio_config(&io_conf);
        //key
        io_conf.pin_bit_mask = ( (1ULL<<GPIO_KEY_IO_S1) | (1ULL<<GPIO_KEY_IO_S2) | (1ULL<<GPIO_KEY_IO_S3) |(1ULL<<GPIO_KEY_IO_S4) );
        io_conf.mode = GPIO_MODE_INPUT;
        io_conf.intr_type = GPIO_INTR_DISABLE;
        io_conf.pull_down_en = 0;
        io_conf.pull_up_en = 1;
        gpio_config(&io_conf);
}




void app_main()
{
    printf("Hello world!\n");

        user_init();
        //timer
        hw_timer_init(key_hw_timer_callback1, NULL);
        hw_timer_alarm_us(10000, TEST_RELOAD);
        //task
        xTaskCreate(key_task,"key_task",512,NULL,10,NULL);
        printf("task end!\n");
        while(1)
        {
                gpio_set_level(GPIO_LED_IO_NUM,0);
                vTaskDelay(1000 / portTICK_PERIOD_MS);
                gpio_set_level(GPIO_LED_IO_NUM,1);
                vTaskDelay(1000 / portTICK_PERIOD_MS);
                vTaskDelay(1000 / portTICK_PERIOD_MS);
        }
        printf("while end!\n");
        fflush(stdout);
}

void key_task(void *pvParameters)
{
        printf("KET TASK CREATE\n");
        while(1)
        {
                if(key[1].key_flag)
                {
                        gpio_set_level(GPIO_LED_IO_NUM,0);
                        key[1].key_flag=0;
                }
                if(key[2].key_flag)
                {
                        gpio_set_level(GPIO_LED_IO_NUM,1);
                        key[2].key_flag=0;
                }
                if(key[3].key_flag)
                {
                        gpio_set_level(GPIO_LED_IO_NUM,0);
                        key[3].key_flag=0;
                }
                if(key[4].key_flag)
                {
                        gpio_set_level(GPIO_LED_IO_NUM,1);
                        key[4].key_flag=0;
                }
                vTaskDelay(10 / portTICK_PERIOD_MS);
        }
}


void key_hw_timer_callback1(void *arg)
{

    key[1].key_sta = gpio_get_level(GPIO_KEY_IO_S1);
    key[2].key_sta = gpio_get_level(GPIO_KEY_IO_S2);
    key[3].key_sta = gpio_get_level(GPIO_KEY_IO_S3);
    key[4].key_sta = gpio_get_level(GPIO_KEY_IO_S4);

    for(int i=1;i<=4;i++)
    {
            switch (key[i].judge_sta)
                {
                        case 0:
                        {
                                if(key[i].key_sta==0) key[i].judge_sta = 1; //第一次判断是否按下
                        }
                        break;
                        case 1:
                        {
                                if(key[i].key_sta==0) //进入下一次定时器扫描,按键还是按下状态,那么就确认为按下,以此来消抖
                                {
                                        key[i].judge_sta = 2;
                                        key[i].key_flag = 1;
                                }
                                else    //否则就是抖动,本次不算按键被按下
                                        key[i].judge_sta = 0;
                        }
                        break;
                        case 2:
                        {
                                if(key[i].key_sta==1) key[i].judge_sta = 0; //判断是否松手,松手后按键状态重置
                        }
                        break;
                }
    }

}

标签:sta,ESP8266,IO,void,RTOS,key,GPIO,gpio,SDK
From: https://blog.csdn.net/LUOkb_/article/details/144552798

相关文章

  • SDK与API
    1.1.SDK的定义SDK是SoftwareDevelopmentKit的缩写,翻译成中文是:软件开发工具包。SDK是一组工具、库、文档和示例代码的集合,旨在帮助开发者更轻松地创建应用程序或集成特定服务。SDK通常由硬件平台、操作系统或服务提供商提供,以便开发者能够利用其平台或服务的功能。1.2.SD......
  • freertos的基础(二)内存管理:堆和栈
    1. 堆(Heap)定义堆是FreeRTOS中用于动态内存分配的内存区域。FreeRTOS提供了多种堆管理方案(如heap_1、heap_2、heap_4等),开发者可以根据需求选择合适的内存管理策略。作用用于动态分配内存,例如创建任务、队列、信号量等内核对象时,从堆中分配内存。堆的大小由开发者......
  • 《浪漫沙加2:七英雄的复仇》游戏启动时报错提示“找不到facesdk.dll”文件的原因和处理
    对于众多游戏爱好者而言,《浪漫沙加2:七英雄的复仇》无疑是一款备受期待、渴望沉浸其中的佳作。然而,不少玩家在满心欢喜准备启动游戏时,却遭遇了令人沮丧的报错提示——“找不到facesdk.dll”文件,这一状况瞬间打破了游戏的美好憧憬,探寻背后原因与处理方案势在必行。报错提示......
  • 安装Unitree_sdk2
        unitree@ubuntu:~$unitree@ubuntu:~$unitree@ubuntu:~$unitree@ubuntu:~$unitree@ubuntu:~$unitree@ubuntu:~$unitree@ubuntu:~$unitree@ubuntu:~$unitree@ubuntu:~$cd/unitree/lib/unitree_slamunitree@ubuntu:/unitree/lib/unitree_slam$unit......
  • 树莓派-5-GPIO的应用实验之GPIO的编码方式和SDK介绍
    文章目录1GPIO编码方式1.1管脚信息1.2使用场合1.3I2C总线1.4SPI总线2RPI.GPIO2.1PWM脉冲宽度调制2.2静态函数2.2.1函数setmode()2.2.2函数setup()2.2.3函数output()2.2.4函数input()2.2.5捕捉引脚的电平改变2.2.5.1函数wait_for_e......
  • FreeRTOS-链表
    链表链表是freertos的一个重要数据结构,后面的任务调度等功能当中,都是基于链表这一项进行的。FreeRTOS的链表是指针指向的链表,一个链表下面有很多链表,每个链表项都有一个指向这个链表的指针。链表实现链表根节点一个链表的数据结构定义如下:typedefstructxLIST{listF......
  • FreeRTOS-内存管理
    内存管理方案介绍以及对比heap1该方案的实现是通过预先分配一个大的数组,然后申请的时候在这个数组当前创建一个新的内存块,每次的操作执行时间都是确定,但是此内存不支持释放,也不会产生内存碎片。该方案可以用于一些创建后就不会再删除的对象,直至程序的结束才会回收。heap2该......
  • 05_FreeRTOS相对延时与绝对延时
    目录1.FreeRTOS延时函数1.1相对延时-vTaskDelay1.2绝对延时-vTaskDelayUntil2.相对延时与绝对延时示例2.1系统启动函数2.2启动任务执行函数2.3任务12.4任务2硬件平台:STM32F103相关配置:FreeRTOS移植STM32F103:保姆级教程01_FreeRTOS任务的动态/静态创......
  • ESP8266及继电器电路图解析
    ESP8266及继电器介绍ESP8266概述:ESP8266是一款低成本、低功耗的Wi-Fi芯片,由乐鑫信息科技(EspressifSystems)开发。它集成了TCP/IP协议栈,能够实现串口与Wi-Fi之间的转换,广泛应用于物联网(IoT)领域,如智能家居、智能穿戴、工业控制等。特点:低功耗:在睡眠模式下功耗极低,适合......
  • 向日葵SDK集成 C#
    用向日葵官方的demo,运行远程桌面一直不行,不知道是我哪里操作有问题还是怎么的,后来找到下面老哥的文章,用他的demo试了就可以。一、前置条件前往向日葵开发平台注册开发者身份花生壳,向日葵,蒲公英软硬件嵌入,DDNS,远程控制,智能组网接入-贝锐(oray.com)创建应用,获取APPID和APP......