ESP32开发路程——环境搭建、引脚、烧录、UART、ADC、WS2812、RFID、DAC、FreeRTOS、CJSON
目录
- 环境搭建
- 编译例程
- 引脚说明、模组烧录
- 常用操作
- 相关API详解
- UART
- ADC
- WS2812(RMT)
- RFID
- DAC(音频输出)
- FreeRTOS
- CJSON
- 完整工程
官方网站:ESPRESSIF
参考教程:史上最全的ESP32教程
官方编程指南:ESP-IDF编程指南
环境搭建
使用Arduino IDE开发起来会更快,但为了避免以后控制起来出现底层冲突,所以使用VSCODE+ESP-IDF开发环境。具体操作在参考教程链接。
(万事开头难,每次都要为配置环境这些破事挠掉几根头发,我真的会谢!)
如果没有USE EXISTING SETUP这个选项,就重启一下VSCODE!
编译例程
具体操作在参考教程链接。我的例程路径在 E:\Download\ESP-IDF\Espressif\frameworks\esp-idf-v4.4.2\examples(以防以后找不到)
烧录不成功的话,根据VSCODE的自动弹窗,把相应的需求安装配置好
引脚说明、模组烧录
ESP32引脚说明:ESP32引脚参考
ESP32模组烧录:如何为 ESP 系列模组烧录固件
常用操作
- 自己创建工程
- 查看-控制面板(ctrl+shift+p)
- 搜索:ESP-IDF:Create project from extersion template
- 选择路径
- 工程类型:template-app
- 打开文件
- 用文件夹的形式打开相应路径的template-app目录
- 自己添加.c .h文件
- 在main目录下,右键新建相应的.c .h文件。
- 在main文件夹下的 CMakeList.txt 中,添加.c路径,参考如下:
idf_component_register(SRCS "Uart.c" "main.c" "ADC.c"INCLUDE_DIRS ".")
- 自己添加 include 库文件夹
- 在 template-app 中新建一个 include/TFT(这里是自建的组件名称) 文件夹
- 将 template-app 中的 CMakeLists.txt 更改如下:
cmake_minimum_required(VERSION 3.5)set(EXTRA_COMPONENT_DIRS "./include")include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(template-app)
- 在 TFT 文件夹中包含所需的.c .h 和以下 CMakeLists.txt (其中的.c内容根据自己情况更改)
idf_component_register(SRCS "bitstream.c" "mmask.c" "mqrspec.c" "QR_Encode.c" "qrencode.c" "qrinput.c" "qrspec.c" "rscode.c" "split.c" "ST7735.c" "mask.c" INCLUDE_DIRS ".")
相关API详解
GPIO & RTC GPIO
UART
ADC
RMT
UART
- 初始化
void uart_1_init(void)
{const uart_config_t uart_config = {.baud_rate = UART_1_BAUD,.data_bits = UART_DATA_8_BITS,.parity = UART_PARITY_DISABLE,.stop_bits = UART_STOP_BITS_1,.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,.source_clk = UART_SCLK_APB,};uart_driver_install(UART_NUM_1, RX_BUF_SIZE * 2, 0, 0, NULL, 0);uart_param_config(UART_NUM_1, &uart_config);uart_set_pin(UART_NUM_1, UART_1_TXD_PIN, UART_1_RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
}
- printf 重定向
void uart_1_printf(const char *format,...)
{uint16_t len;va_list args; va_start(args, format);len = vsnprintf((char*)UartTxBuf, sizeof(UartTxBuf)+1, (char*)format, args);va_end(args);uart_write_bytes(UART_NUM_1, UartTxBuf, len);ESP_LOGI("Uart1Tx", "Wrote %d bytes", len);
}
ADC
参考:有关ESP32-ADC的使用介绍得比较全面简洁的一篇
ADC1支持8个通道(GPIO32-GPIO39),ADC2支持10个通道(GPIO0、GPIO2、GPIO4、GPIO12-GPIO15、GPIO25-GPIO27)注: GPIO0、GPIO2、GPIO15为芯片的Strapping 管脚;ADC2只能在WIFI功能未启动下使用。
- 初始化
#define ADC_1_CHANNEL (ADC1_CHANNEL_7)// 12位ADC 衰减11db(0-3.3V)
void adc_1_init(void)
{adc1_config_width(ADC_WIDTH_BIT_12);adc1_config_channel_atten(ADC_1_CHANNEL, ADC_ATTEN_DB_11);
}
- 获取ADC值
int adc_1_get(void)
{int value = adc1_get_raw(ADC_1_CHANNEL);return value;
}
WS2812(RMT)
- 初始化
void WS2812_1_init(void)
{// 使用默认参数填入rmt_config_t结构体rmt_config_t config = RMT_DEFAULT_CONFIG_TX(WS2812_1_PIN, RMT_TX_CHANNEL);// 将时钟设置为40MHzconfig.clk_div = 2;// 调用两个函数完成初始化ESP_ERROR_CHECK(rmt_config(&config));ESP_ERROR_CHECK(rmt_driver_install(config.channel, 0, 0));// install ws2812 driver 安装ws2812驱动led_strip_config_t strip_config = LED_STRIP_DEFAULT_CONFIG(WS2812_1_NUM, (led_strip_dev_t)config.channel);WS2812_1_strip = led_strip_new_rmt_ws2812(&strip_config);if (!WS2812_1_strip) {ESP_LOGE("WS2812", "install WS2812 driver failed");}// Clear LED strip (turn off all LEDs)关闭所有ws2812ESP_ERROR_CHECK(WS2812_1_strip->clear(WS2812_1_strip, 100));
}
- 点亮某颗灯珠
// 红ESP_ERROR_CHECK(WS2812_1_strip->set_pixel(WS2812_1_strip, 0, 255, 0, 0));ESP_ERROR_CHECK(WS2812_1_strip->refresh(WS2812_1_strip, 100));
RFID
- .h 内参数定义
// GPIO 相关
#define NFC_RST_GPIO_PIN GPIO_NUM_25
#define NFC_SPI_MISO_PIN GPIO_NUM_19
#define NFC_SPI_MOSI_PIN GPIO_NUM_23
#define NFC_SPI_SCLK_PIN GPIO_NUM_18
#define NFC_SPI_CS_PIN GPIO_NUM_5#define DMA_CHAN 2
- 初始化
void RFID_init(void)
{// GPIO初始化gpio_pad_select_gpio(NFC_RST_GPIO_PIN); // 选择一个GPIOgpio_set_direction(NFC_RST_GPIO_PIN, GPIO_MODE_OUTPUT); // 把这个GPIO作为输出NFC_GPIO_Write(NFC_RST_HIGH);gpio_pad_select_gpio(NFC_SPI_CS_PIN); // 选择一个GPIOgpio_set_direction(NFC_SPI_CS_PIN, GPIO_MODE_OUTPUT); // 把这个GPIO作为输出// SPI初始化esp_err_t ret;spi_bus_config_t spiBusConfig ={.miso_io_num = NFC_SPI_MISO_PIN, // MISO信号线.mosi_io_num = NFC_SPI_MOSI_PIN, // MOSI信号线.sclk_io_num = NFC_SPI_SCLK_PIN, // SCLK信号线.quadwp_io_num = -1, // WP信号线,专用于QSPI的D2.quadhd_io_num = -1, // HD信号线,专用于QSPI的D3.max_transfer_sz = 64 * 8, // 最大传输数据大小};spi_device_interface_config_t spiDeviceConfig ={.clock_speed_hz = SPI_MASTER_FREQ_10M, // Clock out at 10 MHz,.mode = 0, // SPI mode 0/** The timing requirements to read the busy signal from the EEPROM cannot be easily emulated* by SPI transactions. We need to control CS pin by SW to check the busy signal manually.*/.spics_io_num = -1,.queue_size = 7, // 传输队列大小,决定了等待传输数据的数量};//Initialize the SPI busret = spi_bus_initialize(SPI3_HOST, &spiBusConfig, DMA_CHAN);ESP_ERROR_CHECK(ret);ret = spi_bus_add_device(SPI3_HOST, &spiDeviceConfig, &s_spiHandle);ESP_ERROR_CHECK(ret);// RFID初始化pcdReset(); // 复位delayMs(5);ESP_LOGI(TAG, "reg: %02x" ,readRawRc(Status1Reg));ESP_LOGI(TAG, "reg: %02x" ,readRawRc(Status2Reg));ESP_LOGI(TAG, "reg: %02x" ,readRawRc(WaterLevelReg));pcdAntennaOn(); // 开启天线发射
}
- 使用RFID
static void RFID_task(void *arg)
{while(1){uint8_t card[4];MFRC522_ReadCardSerialNo(card);ESP_LOGI("RFID", "card: %02x%02x%02x%02x", card[0], card[1], card[2], card[3]);bsp_delay_ms(1000);}
}
DAC(音频输出)
官方例程
转化音频文件
FreeRTOS
基于ESP32-FreeRTOS学习笔记
- 信号量定义
SemaphoreHandle_t semphr_adc_1;
- 信号量创建
// 创建信号量semphr_adc_1 = xSemaphoreCreateBinary();
- 信号量释放
// 释放信号量xSemaphoreGive(semphr_adc_1);
- 信号量获得
// 获得信号量xSemaphoreTake(semphr_adc_1, portMAX_DELAY);//获得信号量
CJSON
参考:
cJSON使用
STM32快速使用CJSON(打包与解析)
- 打包
cJSON * usr;char *data;// 打包成json数据usr=cJSON_CreateObject(); //创建根数据对象cJSON_AddItemToObject(usr, "A", cJSON_CreateNumber(123)); //根节点下添加数字cJSON_AddItemToObject(usr, "B", cJSON_CreateString("hello")); //根节点下添加字符cJSON_AddItemToObject(usr, "C", cJSON_CreateString("你好")); //根节点下添加汉字data = cJSON_Print(usr); //将json形式打印成正常字符串形式(带有\r\n)// 串口发送数据uart_1_printf("%s",data);// 释放内存cJSON_Delete(usr);free(data);
打包后的数据:
{"A": 123,"B": "hello","C": "你好"
}
- 解析
cJSON *json,*json_one,*json_two,*json_three;json = cJSON_Parse(out); //将得到的字符串解析成json形式json_one = cJSON_GetObjectItem( json , "one" ); //从json获取键值内容json_two = cJSON_GetObjectItem( json , "two" );//从json获取键值内容json_three = cJSON_GetObjectItem( json , "three" );//从json获取键值内容printf("\r\none:%s two:%d three:%d",json_one->valuestring,json_two->valueint,json_three->valueint);cJSON_Delete(json); //释放内存
待解析数据:
{"one": "hello","two": "2","three": 8
}
解析结果:(json_two->valueint = 0 json_two->valuestring = 2)
one:hello two:0 three:8
完整工程
ESP32完整工程
ESP32开发路程——环境搭建、引脚、烧录、UART、ADC、WS2812、RFID、DAC、FreeRTOS、CJSON相关推荐
- 鸿蒙开发板怎么玩?Neptune开发教程---OpenHarmony开发体验-环境搭建-编译-烧录
目录 鸿蒙开发板(Neptune)开发教程-环境搭建-编译-烧录 Neptune简介 介绍特点 开发板参数 引脚 说明 开发环境搭建 linux编译环境搭建 python环境安装 hpm环境安装 wi ...
- 超级便宜的鸿蒙开发板环境搭建-编译-烧录
超级便宜的鸿蒙开发板环境搭建-编译-烧录 1.下载代码.编译工具和烧写工具 打开https://gitee.com/hihopeorg/Neptune-HarmonyOS-IOT下载代码 打开http ...
- ESP32开发1---ESP32环境搭建(ESP-IDF+VSCode)
ESP32环境搭建(ESP-IDF+VSCode) ESP32开发可以使用ESP-IDF 工具,其安装较为复杂需要,其需要许多必备的工具如Python.Git.交叉编译器.CMake和Ninja编译工 ...
- ESP32开发之旅——搭建MicroPython开发环境
ESP32开发之旅--搭建MicroPython开发环境 获取ESP32-MicroPython固件 写入固件 编译器配置 编写第一行代码--Hello World 结尾 获取ESP32-MicroP ...
- 【 RA4M2开发板环境搭建之串口下载1】
[ RA4M2开发板环境搭建1] 1. 前言 1.1 活动来源 1.2 开发环境 1.3 RA4M2开发板 2. MDK环境准备 2.1 keil 5下载安装 2.2 安装RA4M2的软件支持包 2. ...
- esp32 linux内核,【小狂系列】跟着小狂玩ESP32之编译环境搭建篇
本帖最后由 3guoyangyang7 于 2016-11-3 18:41 编辑 趁热要打铁,昨天发了ESP32的预告贴,今天小狂就带大家刷一刷ESP32的编译环境搭建.怎么说的,ESP32可以在多平 ...
- 泰凌微ble mesh蓝牙模组天猫精灵学习之旅 ① 小白也痴迷,如何在 Linux环境搭建编译烧录 安信可TB02,点亮一盏LED灯;
本<泰凌微ble mesh蓝牙模组天猫精灵学习之旅>系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1.小 ...
- HarmonyOS(鸿蒙系统)物联网开发教程——环境搭建
HarmonyOS(鸿蒙系统)物联网开发教程--环境搭建 目录 HarmonyOS(鸿蒙系统)物联网开发教程--环境搭建 前言 1 HarmonyOS简介 2 开发环境搭建 2.1 简洁版环境搭建(使 ...
- BI报表开发之环境搭建(二)
上一篇<BI报表开发之环境搭建(一)>中详细描述了SQL SERVER R2 的安装步骤,本篇将继续描述BI报表开发的环境搭建部分-- Orale数据库安装. <1>下载ora ...
- auto.js id为参数滑动_【Autojs教程】02Autojs PC端开发调试环境搭建
[Autojs教程]02-Autojs PC端开发调试环境搭建 写在前面 本篇教程算是保姆级教程了,希望以此能吸引更多感兴趣的同学学习Autojs,也希望大家能因此碰撞出更多的奇思妙想 关注微信公众号 ...
最新文章
- 需求分析的过程是什么?_7大需求分析方法与5大分析过程
- 使用vscode删除markdown空行
- oracle中调试存储过程,详解Oracle调试存储过程
- python_求1-2+3-4+......-100的值
- R^2 score is not well-defined with less than two samples
- jsp-include 写法
- 整点小浪漫~Python27行代码绘制一幅满天星
- ibm服务器修改ide,IBM刀片服务器配置IDE RAID的方法
- 如何删除服务中不存在在服务
- 架构 BitTorrent BT服务器
- 那些在一个公司死磕了5-10年的人,最后都怎么样了?
- 微信公众平台开发基础
- 宝塔如何安装多版本php,安装Lnmp(多PHP版本与宝塔)
- 计算机基本操作知识课本内容阅读,计算机基础知识及基本操作
- 通常IT创业可以有7种盈利方式
- vue3解读—reactivity响应式实现
- php pthread nts,PHP的线程库:pthreads
- broadlink智能插座设置问题
- 远程连接服务器软件——十大常见的服务器管理软件
- FMD辉芒微FT61F133A-RB SOP16 ADC/PWM型单片机MCU