首页
友链
关于
搜索
1
ESP-IDF 编程笔记(一) Ubuntu20.04开发环境搭建
16 阅读
2
ESP32编程笔记(五)——WIFI
14 阅读
3
ESP32编辑笔记(6)——事件监听
10 阅读
4
ESP32编程笔记(二)新建一个ESP32工程,并输出Hello world
9 阅读
5
ESP32编程笔记(9)——Smartconfig
9 阅读
默认分类
嵌入式
GD32
ESP32
Web
Java
MySQL
其他
登录
/
注册
搜索
标签搜索
ESP32
ChencyCT
累计撰写
18
篇文章
累计收到
0
条评论
首页
栏目
默认分类
嵌入式
GD32
ESP32
Web
Java
MySQL
其他
页面
友链
关于
搜索到
9
篇与
的结果
2024-02-19
ESP32编程笔记(四)——GPIO基本输入输出
前言NodeMCU-32_V1.3 开发板 模组共接出 38 个接口,如管脚示意图,管脚功能定义表是接口定义。配置头文件components/driver/include/driver/gpio.h使用方式通过调用 gpio_config(const gpio_config_t *pGPIOConfig) 函数完成GPIO的初始化gpio_config(const gpio_config_t *pGPIOConfig) GPIO通用配置,配置 GPIO 的模式、上拉、下拉、输入类型。 返回值: ESP_OK成功 ESP_ERR_INVALID_ARG 参数错误 参数: gpio_config_t struct gpio_config_t{ uint64_t pin_bit_mask; gpio_mode_t mode; gpio_pullup_t pull_up_en; gpio_pulldown_t pull_down_en; gpio_int_type_t intr_type; } pin_bit_mask设置需要操作的GPIO引脚,例如我要设置GPIO16和GPIO21则pin_bit_mask应该设置为(1ULL << 1 | 1ULL << 33) mode用于设置gpio的模式 GPIO_MODE_INPUT 输入 GPIO_MODE_OUTPUT 输出 GPIO_MODE_OUTPUT_OD 开漏输出(如果外部或者内部不上拉电阻则无法输出高电平) GPIO_MODE_INPUT_OUTPUT_OD 开漏输入输出 GPIO_MODE_INPUT_OUTPUT 输入输出 pull_up_en用于设置是否上拉 pull_down_en用于设置是否下拉 gpio_int_type_t intr_type用于设置GPIO中断相关属性输出通过函数 gpio_set_level() 设置。esp_err_t gpio_set_level(gpio_num_t gpio_num, uint32_t level) 参数: gpio_num:输出引脚 level:输出方式 1:高电平 0:低电平 返回值: ESP_OK Success ESP_ERR_INVALID_ARG GPIO number error输入通过函数 gpio_get_level() 获取int gpio_get_level(gpio_num_t gpio_num) 参数: gpio_num:指定引脚 返回值: 0:输入为低电平 1:输入为高电平实例#include <stdio.h> #include "esp_system.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "nvs_flash.h" #include "esp_log.h" #include "driver/gpio.h" const static char *TAG = "GPIO"; static void System_Init(void); void app_main(){ ESP_LOGI(TAG,"System initializtion"); System_Init(); ESP_LOGI(TAG, "GPIO initializtion"); //配置GPIO16为输出 gpio_config_t gpio = { .intr_type = GPIO_INTR_DISABLE, //关闭中断 .mode = GPIO_MODE_OUTPUT, //输出模式 .pin_bit_mask = 1ULL << GPIO_NUM_16, //16引脚 .pull_down_en = GPIO_PULLDOWN_DISABLE, //关闭下拉 .pull_up_en = GPIO_PULLUP_ENABLE //开启上拉 }; gpio_config(&gpio); //配置GPIO为输入 gpio_config_t gpio_two = { .intr_type=GPIO_INTR_DISABLE, .mode=GPIO_MODE_INPUT, .pin_bit_mask = 1ULL << GPIO_NUM_21, .pull_down_en = GPIO_PULLDOWN_ENABLE, .pull_up_en =GPIO_PULLUP_DISABLE }; gpio_config(&gpio_two); int temp; while (1){ //设置输出 gpio_set_level(GPIO_NUM_16,1); //设置输入 temp = gpio_get_level(GPIO_NUM_21); ESP_LOGI(TAG,"gpio 16 level is %d",temp); vTaskDelay(500 / portTICK_PERIOD_MS); //延时 gpio_set_level(GPIO_NUM_16,0); temp = gpio_get_level(GPIO_NUM_21); ESP_LOGI(TAG,"gpio 16 level is %d",temp); vTaskDelay(500 / portTICK_PERIOD_MS); } } static void System_Init(void){ esp_err_t ret = nvs_flash_init(); if(ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND){ ESP_ERROR_CHECK(ret); ret = nvs_flash_init(); } ESP_ERROR_CHECK(ret); } 运行结果:
2024年02月19日
8 阅读
0 评论
0 点赞
2024-02-19
ESP32编程笔记(三)——FreeRTOS
前言ESP-IDF FreeRTOS 是基于 Vanilla FreeRTOS v10.4.3参考: 乐鑫 freeRTOS中文文档配置原版 FreeRTOS 允许端口和应用程序通过向 添加各种宏来配置内核。通过这些宏,可以启用或禁用内核的调度行为和各种内核功能。但是,在 ESP-IDF FreeRTOS 中,“FreeRTOSConfig.h”文件被视为私有文件,用户不得修改。向用户公开的任何 FreeRTOS 配置都将通过 menuconfig 完成。#define config...FreeRTOSConfig.hESP-IDF FreeRTOS 应用与 Vanilla FreeRTOS 不同,用户不得调用 vTaskStartScheduler() 。相反,ESP-IDF FreeRTOS 会自动启动。入口点是用户定义的函数。void app_main(void)通常,用户将从 生成其应用程序的其余任务。app_main允许该函数在任何时候(即,在应用程序终止之前)返回。app_main从任务调用该函数。app_main main该任务是 ESP-IDF 在启动时自动生成的多个任务之一。这些任务是:main任务接口头文件Components/FreeRTOS/include/FreeRTOS/task.h功能常用函数创建任务并将其添加到准备运行的任务列表中。static inline BaseType_t xTaskCreate(TaskFunction_t pvTaskCode, const char *const pcName, 常量 uint32_t usStackDepth, void *const pvParameters, UBaseType_t uxPriority, TaskHandle_t *const px创建任务)在内部,在 FreeRTOS 实施中,任务使用两个内存块。第一个块用于保存任务的数据结构。任务使用第二个块作为其堆栈。如果使用 xTaskCreate() 创建任务,则两个内存块都会在 xTaskCreate() 函数中自动动态分配。(见 https://www.FreeRTOS.org/a00111.html)。如果使用 xTaskCreateStatic() 创建任务,则应用程序编写器必须提供所需的内存。因此,xTaskCreateStatic() 允许在不使用任何动态内存分配的情况下创建任务。请参阅 xTaskCreateStatic() 了解不使用任何动态内存分配的版本。xTaskCreate() 只能用于创建对整个微控制器内存映射具有不受限制访问权限的任务。包含 MPU 支持的系统也可以使用 xTaskCreateRestricted() 创建 MPU 约束任务。参数pvTaskCode – 指向任务输入函数的指针。必须实现任务以永不返回(即连续循环),或者应使用 vTaskDelete 函数终止任务。pcName – 任务的描述性名称。这主要用于方便调试。configMAX_TASK_NAME_LEN定义的最大长度 - 默认值为 16。usStackDepth – 指定为字节数的任务堆栈的大小。请注意,这与原版 FreeRTOS 不同。pvParameters – 将用作正在创建的任务的参数的指针。uxPriority – 任务应运行的优先级。包含 MPU 支持的系统可以选择通过设置优先级参数的位portPRIVILEGE_BIT在特权(系统)模式下创建任务。例如,要创建优先级为 2 的特权任务,uxPriority 参数应设置为 ( 2 | portPRIVILEGE_BIT )。pxCreatedTask – 用于传回可以引用创建的任务的句柄。返回值pdPASS(如果任务已成功创建并添加到就绪列表中),否则在文件 projdefs.h 中定义错误代码用法示例:// Task to be created. void vTaskCode( void * pvParameters ) { for( ;; ) { // Task code goes here. } } // Function that creates a task. void vOtherFunction( void ) { static uint8_t ucParameterToPass; TaskHandle_t xHandle = NULL; // Create the task, storing the handle. Note that the passed parameter ucParameterToPass // must exist for the lifetime of the task, so in this case is declared static. If it was just an // an automatic stack variable it might no longer exist, or at least have been corrupted, by the time // the new task attempts to access it. xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle ); configASSERT( xHandle ); // Use the handle to delete the task. if( xHandle != NULL ) { vTaskDelete( xHandle ); } }注意如果程序使用线程局部变量(用“__thread”关键字指定的变量),那么它们的存储空间将在任务的堆栈上分配。延时函数void vTaskDelay(const TickType_t xTicksToDelay)延迟给定数量的即时报价的任务。任务保持阻塞状态的实际时间取决于刻度率。常数portTICK_PERIOD_MS可用于根据即时报价率实时计算 - 具有一个即时报价周期的分辨率。INCLUDE_vTaskDelay必须定义为 1 才能使用此函数。有关详细信息,请参阅配置部分。vTaskDelay() 指定任务希望取消阻止的时间相对于调用 vTaskDelay() 的时间。例如,指定 100 个时钟周期将导致任务在调用 vTaskDelay() 后取消阻止 100 个时钟周期。因此,vTaskDelay() 不能提供控制周期性任务频率的好方法,因为通过代码以及其他任务和中断活动的路径将影响调用 vTaskDelay() 的频率,从而影响任务下一次执行的时间。请参阅 xTaskDelayUntil() 了解旨在促进固定频率执行的替代 API 函数。它通过指定调用任务应取消阻止的绝对时间(而不是相对时间)来实现此目的。示例void vTaskFunction( void * pvParameters ) { // Block for 500ms. const TickType_t xDelay = 500 / portTICK_PERIOD_MS; for( ;; ) { // Simply toggle the LED every 500ms, blocking between each toggle. vToggleLED(); vTaskDelay( xDelay ); } }
2024年02月19日
7 阅读
0 评论
0 点赞
2024-02-16
ESP32编程笔记(二)新建一个ESP32工程,并输出Hello world
1.在esp-idf下新建一个目录esp32,esp32将用做开发工程的根目录。在该目录下新建hello_world文件夹2.进入hello_wold文件夹之后创建一个文件夹两个文件main文件夹:用来存放源码CMakeLists.txt:配置该工程。Makefile:2.1在CMakeLists.txt文件中添加如下内容cmake_minimum_required(VERSION 3.5) include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(hello_world)2.2在Makefile文件中添加如下内容PROJECT_NAME := hello_world include $(IDF_PATH)/make/project.mk2.3进入main文件新建三个文件main.c :源码CMakeLists.txt component.mk2.4 在CMakeLists.txt文件添加如下内容idf_component_register(SRCS "main.c" INCLUDE_DIRS "") #双引号内为编译的文件component.mk文件暂时不用添加。2.5 main.c文件#include "esp_system.h" #include <stdio.h> void app_main(void){ printf("hello world\n"); }注意这里的printf要加上\n否则串口不会输出。1.printf在系统中属于库缓存,printf只有遇到\n字符时或者库缓存写满了时,才会把内容写到内核中,内核才会输出。2.printf库缓存的大小只有1024字节。这里加上\n告诉系统缓存写入结束,可以输出。3.使用命令idf.py build flash moniotr编译烧录的同时打开监听器。如果烧录时遇到不能连接串口时的提示,执行如下命令sudo chmod 777 /dev/ttyUSB04.运行结果
2024年02月16日
9 阅读
0 评论
0 点赞
2024-02-14
ESP-IDF 编程笔记(一) Ubuntu20.04开发环境搭建
官网文档安装环境参考了安信可提供的博客,传送门安装相关依赖sudo apt-get install git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-01.1Python设置我的系统自带python3.6,将python更新即可 sudo apt-get upgrade python3默认python设置为python3sudo rm /usr/bin/pythonsudo ln -s /usr/bin/python3 /usr/bin/python2.创建一个esp文件夹,存放SDKmkdir esp cd esp3.获取源码3.1下载重定向脚本 esp-gitee-tools,运行以下指令:git clone https://gitee.com/EspressifSystems/esp-gitee-tools.git3.2 下载SDKgit clone https://gitee.com/EspressifSystems/esp-idf.git3.3使用esp-gitee-tools拉去自摸块cd esp-gitee-tools export EGT_PATH=$(pwd) cd .. cd esp-idf $EGT_PATH/submodule-update.sh3.4安装编译工具$EGT_PATH/install.sh3.5设置PATH在用户目录下的.bashrc文件里最后面添加如下代码,具体路径设置为自己的export PATH=/home/XXX/esp/esp-idf/3.6 设置编译环境. ./export.sh3.7 设置默认芯片idf.py set-target esp323.8 给串口赋权限查看串口号ls /dev/ttyUSB*执行以下命令,不然烧录不了sudo chmod 777 /dev/ttyUSB03.9进入ESP-IDF下的examples->get-start->hello-world执行以下命令即可编译烧录,同时打开实时监听器(串口),就可以看到串口输出 hello_worldidf.py build flash moniotr
2024年02月14日
16 阅读
0 评论
0 点赞
1
2