28天立创实力派开发板学习记录part1------DAY1-DAY8
- 前言
- [DAY1_2025.6.28 第02集-搭建ESP32开发环境](#DAY1_2025.6.28 第02集-搭建ESP32开发环境)
- DAY2_2025.6.29第03集-ESP32程序开发流程
- DAY3_2025.6.30第04集-按键驱动程序
- DAY4_20250701利用ESP32S3开发板、杜邦线、LED灯根据今日所学完成硬件最基础的入门必做实验"blink"
- DAY5_20250703第五集姿态传感器qmi8658_初始化
- [DAY6_20250705 第五集姿态传感器qmi8658_读写](#DAY6_20250705 第五集姿态传感器qmi8658_读写)
- DAY7_20250709第五集姿态传感器qmi8658_串口显示三轴数值
- DAY8_20250711第六集TF卡的使用
前言
学习IDF的原因,ESP32芯片的Arduino环境下的开发非常方便,但是在进行信号的高精度采集和浮点数据处理以及多阶滤波方面无法使用IDF中支持的FFT和浮点等操作;运行速度也较原生开发环境慢。ESP32在价格、性能和IOT方面有着STM32无法超越的优势。所以决定在暑假的前半段开始IDF的开发相关学习。旨在熟悉IDF开发的框架,基本开发方法。暑假的后半段会开始STM32的学习,到时候会使用F4系列的官方测试板和官方例程进行学习。
学习预期效果:
-
每天一个视频跟练,完成实战派的全部例程。
-
实现高阶FFT和中断方式的采样
**在线文档:**https://wiki.lckfb.com/zh-hans/szpi-esp32s3/
DAY1_2025.6.28 第02集-搭建ESP32开发环境
视频教程:第02集-搭建ESP32开发环境
日志:
- 跟随教程配置好了VS Code下的ESP_IDF开发环境
- 为了记录整个过程安装了Typora和pandoc插件,所有安装和creak文件均放入了tools文件夹
明日计划:
- 学习视频:第03集-ESP32程序开发流程
DAY2_2025.6.29第03集-ESP32程序开发流程
视频教程: 第03集-ESP32程序开发流程
日志:
-
新建工程一般都是复制一个例程在上面进行修改,选择官方例程
D:\esp\v5.1.6\esp-idf\examples\get-starte\hello_word -
复制到
D:\esp32s3(未来关于esp32s3的相关练习工程都会放在这里),删除.py和另外一个测试文件,变成最小结构 -
选择串口
-
选择目标芯片(在弹出的下载方式中选择带
briage的选项,这个代表usb转ttl) -
menuconfig(一个齿轮的符号)->serial flash config
-
编译下载(可以选额🔥图标,编译、下载、调试,一键三连,如果之前串口没选,这里会提示选择串口号和通讯方式
UART) -
bin文件下载方式,工具和文档下载地址:
-
flash_project_args: 这里会有flash下载方式所需的bin文件及他们的偏移地址,copy到烧录工具的bin文件夹下。DIO 80MHz 460800db(可以在vs code右下角列表中的python Tadk那一行查看vs code的下载速率做参考)
-
ctrl+]可以终止终端程序 -
如果先要看一些系统函数和预定义值需要在原官方例程所在目录下打开才可以
D:\esp\v5.1.6\esp-idf\examples\get-starte\hello_word
明日计划:
- 学习视频:第04集-按键驱动程序
DAY3_2025.6.30第04集-按键驱动程序
视频教程: 第04集-按键驱动程序
效果: 点击板载boot按键后,串口显示中显示按下
硬件:

日志:
-
复制
D:\esp\v5.1.6\esp-idf\examples\get-started\sample_project官方示例到D:\esp32s3 -
一级目录下cmakelist.txt文件中修改 project(main)为project(01_bootKey)
-
在main中修改main.c文件(因为需要参考IDF,所以在vscode中打开
D:\esp\v5.1.6\esp-idf的完整esp-idf文件夹) -
关于通用IO的设置例程在
..\esp-idf\examples\peripherals\gpio\generic_gpio\main中的gpio_example_main.c文件 -
复制
c++//zero-initialize the config structure. gpio_config_t io_conf = {}; //disable interrupt io_conf.intr_type = GPIO_INTR_DISABLE; //set as output mode io_conf.mode = GPIO_MODE_OUTPUT; //bit mask of the pins that you want to set,e.g.GPIO18/19 io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL; //disable pull-down mode io_conf.pull_down_en = 0; //disable pull-up mode io_conf.pull_up_en = 0; //configure GPIO with the given settings gpio_config(&io_conf); -
上述代码是非中断方式,所以要改为中断方式。引脚号、输入\输出、上拉/下拉也要调整
c++void app_main(void) { //初始化gpio结构体,完成关于引脚的基本设置. gpio_config_t io_conf = { .intr_type = GPIO_INTR_NEGEDGE, // 中断下降沿触发 .mode = GPIO_MODE_INPUT, // 方式: 输入 .pin_bit_mask = 1ULL<<GPIO_NUM_0, // 设置引脚为 BOOT key .pull_down_en = 0, // Disable pull-down .pull_up_en = 1 // enable pull-up }; gpio_config(&io_conf); // 配置GPIO } -
创建队列、任务、服务
c++//create a queue to handle gpio event from isr gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t)); //start gpio task xTaskCreate(gpio_task_example, "gpio_task_example", 2048, NULL, 10, NULL); //install gpio isr service gpio_install_isr_service(0); //hook isr handler for specific gpio pin gpio_isr_handler_add(GPIO_NUM_0, gpio_isr_handler, (void*) GPIO_NUM_0); -
添加队列、中断和任务的服务函数
c++static QueueHandle_t gpio_evt_queue = NULL; static void IRAM_ATTR gpio_isr_handler(void* arg) { uint32_t gpio_num = (uint32_t) arg; xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL); } static void gpio_task_example(void* arg) { uint32_t io_num; for(;;) { if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) { printf("GPIO[%"PRIu32"] intr, val: %d\n", io_num, gpio_get_level(io_num)); } } } -
复制全部头文件
c++#include <stdio.h> #include <string.h> #include <stdlib.h> #include <inttypes.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" #include "driver/gpio.h" -
完整
main.c代码c++#include <stdio.h> #include <string.h> #include <stdlib.h> #include <inttypes.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" #include "driver/gpio.h" static QueueHandle_t gpio_evt_queue = NULL; static void IRAM_ATTR gpio_isr_handler(void* arg) { uint32_t gpio_num = (uint32_t) arg; xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL); } static void gpio_task_example(void* arg) { uint32_t io_num; for(;;) { if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) { printf("GPIO[%"PRIu32"] intr, val: %d\n", io_num, gpio_get_level(io_num));//gpio_get_level:获取当前引脚电平,因为是下降沿,有可能1 ,有可能0 } } } void app_main(void) { //初始化gpio结构体,完成关于引脚的基本设置. gpio_config_t io_conf = { .intr_type = GPIO_INTR_NEGEDGE, // 中断下降沿触发 .mode = GPIO_MODE_INPUT, // 方式: 输入 .pin_bit_mask = 1ULL<<GPIO_NUM_0, // 设置引脚为 BOOT key .pull_down_en = 0, // Disable pull-down .pull_up_en = 1 // enable pull-up }; gpio_config(&io_conf); // 配置GPIO //create a queue to handle gpio event from isr gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t)); //start gpio task xTaskCreate(gpio_task_example, "gpio_task_example", 2048, NULL, 10, NULL); //install gpio isr service gpio_install_isr_service(0); //hook isr handler for specific gpio pin gpio_isr_handler_add(GPIO_NUM_0, gpio_isr_handler, (void*) GPIO_NUM_0); } -
选择串口、开发板型号、配置(16M内存)、一键三联小火花
-
在vs code的esp-idf环境底边工具栏中选择终端按键打开终端,输入
idf.py save-defconfig。可以生成sdkconfig.default文件
**碎碎念:**今天的学习不是很顺利,9点半做到座位前,按照视频一步步来,最后运行的时候报了8个bug。提示的很奇怪:找不到右边的")"、没有某个变量的定义、甚至简单的整数零也说没定义。
- 按照以往的思路把报错信息粘贴到GPT和浏览器都没有针对性的回答。
- 浏览器中搜索出来的相关信息少的可怜。例程的demo跑的就挺好的。没什么问题。
- 把demo的main.C全复制过来也不可以。中午休息,睡梦中都在想是什么原因。
- 但是因为对ESP-IDF不是很熟悉。视频里的ESP-IDF是5.1.4的,我现在vscode里的是5.1.6版本。版本不兼容?
下午四点的时候再次做到电脑桌前,重看视频,才发现是.pin_bit_mask = 1ULL<<GPIO_NUM_0,这句打错了写成了.pin_bit_mask = GPIO_NUM_0,这次终于搞定了。
反思: 虽然简单的gpio配置调这么久有点搞心态。但是这个过程中收获也很多
- 想起了老师那句名言"bug越邪门,原因越简单"。至理名言。
- 很久不调代码了,对于代码的敏感度下降很多。犯了新手才容易出现的错误。这个程序其实很早之前调试过一次,但是当时手头有代码工作,就很简单。没有出现错误。最近文档工作多。代码写的少。明显退步了。不能停。"不怕慢,就怕站"
**收获:**额外的调试虽然花费了时间,但是在摸索的过程中对整个结构更加清晰了。
- ESP-IDF工程可以改名字,一级目录的CMAKELISts.txt中的输出bin文件明也能改,且两者不用保持一致。只是更改后需要在vscode工程目录中将编译过生成的
.vscode和build两个目录删点,否则编译错误。
明日计划:
利用ESP32S3开发板、杜邦线、LED灯根据今日所学完成硬件最基础的入门必做实验"blink"
DAY4_20250701利用ESP32S3开发板、杜邦线、LED灯根据今日所学完成硬件最基础的入门必做实验"blink"
**学习目标:**利用ESP32S3开发板、杜邦线、LED灯根据今日所学完成硬件最基础的入门必做实验"blink"
资料搜集:
-
借助AI工具快速找到相关学习资料(这个提示词其实需要细化下,加上ESP32S3这个芯片类型会更好。这里之所以没加还能定位是因为这个对话之前的提问已经给过芯片型号了。DS会默认在同一语境下回答。)

-
点击上图
Getting Started Guide链接。https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/get-started/index.html。在左侧的菜单栏选择build Your First Project。然后在下图所示的右侧位置选择windows编译环境。打开详细教程。

-
在新的教程中发现,这个示例和视频里是一样的,都是用
hello_world来测试环境安装正确与否。但是官方说明明显更加细致,如下图,会特别标注ESP_IDF的工程路径是不支持空格的。

-
但是仔细阅读上述代码和详细过程,发现不太对。这个是用ESP-IDF原生的编译环境开发。和VS Code的不太一样。还好在这个文档的末尾给出了参考资料,其中有VS Code的使用教程。https://github.com/espressif/vscode-esp-idf-extension

-
但是看完发现只是关于Hello_world的详细较少。文档倒是清晰的很,比视频快捷。忘记的时候可以快速定位。忽然灵光一闪。这么重要的blink程序,官方例程没有么?好吧。。果然有。。。。。所以官方例程yyds~~测试成功。随便换了一块通用的ESP32S3的开发板运行很顺利。(实力派赠送的扩展线丢了。。测试不了外接灯。。嘿嘿,但是看下通用开发板的测试也是极好的。)
c++/* Blink 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 "driver/gpio.h" #include "esp_log.h" #include "led_strip.h" #include "sdkconfig.h" static const char *TAG = "example"; /* Use project configuration menu (idf.py menuconfig) to choose the GPIO to blink, or you can edit the following line and set a number here. */ #define BLINK_GPIO CONFIG_BLINK_GPIO static uint8_t s_led_state = 0; #ifdef CONFIG_BLINK_LED_RMT static led_strip_handle_t led_strip; static void blink_led(void) { /* If the addressable LED is enabled */ if (s_led_state) { /* Set the LED pixel using RGB from 0 (0%) to 255 (100%) for each color */ led_strip_set_pixel(led_strip, 0, 16, 16, 16); /* Refresh the strip to send data */ led_strip_refresh(led_strip); } else { /* Set all LED off to clear all pixels */ led_strip_clear(led_strip); } } static void configure_led(void) { ESP_LOGI(TAG, "Example configured to blink addressable LED!"); /* LED strip initialization with the GPIO and pixels number*/ led_strip_config_t strip_config = { .strip_gpio_num = BLINK_GPIO, .max_leds = 1, // at least one LED on board }; led_strip_rmt_config_t rmt_config = { .resolution_hz = 10 * 1000 * 1000, // 10MHz }; ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip)); /* Set all LED off to clear all pixels */ led_strip_clear(led_strip); } #elif CONFIG_BLINK_LED_GPIO static void blink_led(void) { /* Set the GPIO level according to the state (LOW or HIGH)*/ gpio_set_level(BLINK_GPIO, s_led_state); } static void configure_led(void) { ESP_LOGI(TAG, "Example configured to blink GPIO LED!"); gpio_reset_pin(BLINK_GPIO); /* Set the GPIO as a push/pull output */ gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT); } #endif void app_main(void) { /* Configure the peripheral according to the LED type */ configure_led(); while (1) { ESP_LOGI(TAG, "Turning the LED %s!", s_led_state == true ? "ON" : "OFF"); blink_led(); /* Toggle the LED state */ s_led_state = !s_led_state; vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS); } } -
通过提示词给到GPT 让他帮我详细讲解一下。因为之前都是使用Arduino编程。对这个不熟悉。AI很给力。

-
AI的讲解。这个时候哪里不会再继续提问就好了。这里就不详细记录了。

小尝试:
-
看懂代码后,发现其实这个代码中是预留了RTM的处理方式的,只是单纯的闪烁LED只需要简短的代码。更改并尝试如下。成功。
c++#include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" #include "esp_log.h" #include "led_strip.h" #include "sdkconfig.h" static const char *TAG = "wakakka "; #define BLINK_GPIO 2 //板子上的2号引脚 static uint8_t s_led_state = 0;//初始LED状态0 关 1 开 static void blink_led(void) { /* Set the GPIO level according to the state (LOW or HIGH)*/ gpio_set_level(BLINK_GPIO, s_led_state);//更新LED状态 } static void configure_led(void) { ESP_LOGI(TAG, "Example configured to blink GPIO LED!"); gpio_reset_pin(BLINK_GPIO); /* Set the GPIO as a push/pull output */ gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);//设置为输出 } void app_main(void) { /* Configure the peripheral according to the LED type */ configure_led(); while (1) { ESP_LOGI(TAG, "Turning the LED %s!", s_led_state == true ? "ON" : "OFF"); blink_led(); /* Toggle the LED state */ s_led_state = !s_led_state; vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS); } } -
一个小思考,这个代码只能实现亮灭同时间的,如果亮灭的时间要单独控制呢?比如亮1S灭3灭?上面的代码已经给出了给引脚赋值的函数
gpio_set_level(BLINK_GPIO, s_led_state)和设置时间延迟的函数vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);`。直接参考Arduino中的blink代码仿制一个吧~ 经实验证明也是正确的。c++/* Blink 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 "driver/gpio.h" #include "esp_log.h" #include "led_strip.h" #include "sdkconfig.h" static const char *TAG = "wakakka"; #define BLINK_GPIO 2 static void configure_led(void) { ESP_LOGI(TAG, "Example configured to blink GPIO LED!"); gpio_reset_pin(BLINK_GPIO); /* Set the GPIO as a push/pull output */ gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT); } void app_main(void) { /* Configure the peripheral according to the LED type */ configure_led(); while (1) { gpio_set_level(BLINK_GPIO, 1); ESP_LOGI(TAG, "Turning the LED %s!","ON" ); vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS); gpio_set_level(BLINK_GPIO, 0); ESP_LOGI(TAG, "Turning the LED %s!","OFF" ); vTaskDelay(CONFIG_BLINK_PERIOD*3 / portTICK_PERIOD_MS); } }
反思&收获:
-
官方例程yyds,可以看到Hello_World例程中使用的是结构体的方式来设置引脚。但是blink中则使用一些简单的函数直接更改某一两个关键设置,这个部分和Arduino的控制方式很像。
-
很多人吐槽Arduino幼稚,不高端。但是作为入门可以非常快的理清逻辑。借助Arduino中获得的逻辑。这里很容易就掌握了IDF中的新编程方式,并能灵活运用,指哪儿打哪儿。emmm~ 好好学了,没啥没用的。关键在态度。
-
AI一定要能用、善用。好的提示词事半功倍。如下图,当你指定了GPT的角色扮演,并详细的描述了你心目中老师的特质。他就会开始角色扮演,按照你指定的方式回答你哈。你的GPT会发表情包么?

**明日计划:**未来三天全天上班。不知道能不能有时间进行学习。如果没有时间的话,就暂停,整理下之前学习内容的思维导图和逻辑图
DAY5_20250703第五集姿态传感器qmi8658_初始化
视频教程: 第五集姿态传感器qmi8658
日志:
-
新建工程一般都是复制一个例程在上面进行修改,选择官方例程
D:\esp\v5.1.6\esp-idf\examples\get-starte\hello_word -
在
main目录下新建两个文件:esp_s3_szp.h、esp_s3_szp.c存放qmi8658的驱动 -
esp_s3_szp.h文件中添加#pragma once//这个头文件只编译一次 -
esp_s3_szp.c中include头文件esp_s3_szp.h -
参考官方例程初始化I2C外设
D:\esp\v5.1.6\esp-idf\examples\peripherals\i2c\i2c_simple\main\i2c_simple_main.c -
粘贴I2C初始化函数到
esp_s3_szp.cc++/** * @brief i2c master initialization */ static esp_err_t i2c_master_init(void) { int i2c_master_port = I2C_MASTER_NUM; i2c_config_t conf = { .mode = I2C_MODE_MASTER, .sda_io_num = I2C_MASTER_SDA_IO, .scl_io_num = I2C_MASTER_SCL_IO, .sda_pullup_en = GPIO_PULLUP_ENABLE, .scl_pullup_en = GPIO_PULLUP_ENABLE, .master.clk_speed = I2C_MASTER_FREQ_HZ, }; i2c_param_config(i2c_master_port, &conf); return i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0); } -
在
esp_s3_szp.h中添加#include "esp_err.h"头文件 -
将esp_s3_szp.c中的
int i2c_master_port = I2C_MASTER_NUM;去掉。直接用BSP_I2C_NUM宏定义代替。函数中相关变量进行替换。代码更改为:c++/** * @brief i2c master initialization */ static esp_err_t i2c_master_init(void) { i2c_config_t conf = { .mode = I2C_MODE_MASTER, .sda_io_num = I2C_MASTER_SDA_IO, .scl_io_num = I2C_MASTER_SCL_IO, .sda_pullup_en = GPIO_PULLUP_ENABLE, .scl_pullup_en = GPIO_PULLUP_ENABLE, .master.clk_speed = I2C_MASTER_FREQ_HZ, }; i2c_param_config(BSP_I2C_NUM, &conf); return i2c_driver_install(BSP_I2C_NUM, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0); } -
在
esp_s3_szp.h中添加#define BSP_I2C_NUM 0预定义 -
在
esp_s3_szp.c文件中将.sda_io_num = I2C_MASTER_SDA_IO, .scl_io_num = I2C_MASTER_SCL_IO,
更换为:
```c++
.sda_io_num = BSP_I2C_SDA,
.scl_io_num = BSP_I2C_SCL,
```
-
在
esp_s3_szp.h中添加#define#define BSP_I2C_SDA 1 #define BSP_I2C_SCL 2 -
在
esp_s3_szp.c文件中将return i2c_driver_install(BSP_I2C_NUM, conf.mode, 0, 0, 0);//倒数第2、3位为0代表不需要输入和输出的缓存。至此,完成I2C初始化函数。 -
为了可以在主函数中调用,需要将
static esp_err_t i2c_master_init(void)函数前面的类型static去掉,并声明到esp_s3_szp.h中。记得声明一定要加分号结尾。 -
mian.C代码
c++#include <stdio.h> #include "esp32_s3_szp.h" static const char *TAG = "main"; void app_main(void) { ESP_ERROR_CHECK(i2c_master_init()); ESP_LOGI(TAG, "I2C initialized successfully"); } -
esp32_s3_szp.h代码 这个代码中添加了log和i2c的头文件
#pragma once //这个头文件只编译一次 #include "esp_err.h" #include "esp_log.h" #include "driver/i2c.h" #define BSP_I2C_NUM 0 #define BSP_I2C_SDA 1 #define BSP_I2C_SCL 2 #define BSP_I2C_FREQ_HZ 100000 // 400Khz也可以 esp_err_t i2c_master_init(void); -
esp32_s3_szp.c代码
#include "esp32_s3_szp.h" /** * @brief i2c master initialization */ esp_err_t i2c_master_init(void) { i2c_config_t conf = { .mode = I2C_MODE_MASTER,//组件中已经定义了I2C_MODE_MASTER .sda_io_num = BSP_I2C_SDA, .scl_io_num = BSP_I2C_SCL, .sda_pullup_en = GPIO_PULLUP_ENABLE,//组件中已经定义了I2C_MODE_MASTER .scl_pullup_en = GPIO_PULLUP_ENABLE,//组件中已经定义了I2C_MODE_MASTER .master.clk_speed = BSP_I2C_FREQ_HZ, }; i2c_param_config(BSP_I2C_NUM, &conf); return i2c_driver_install(BSP_I2C_NUM, conf.mode, 0, 0, 0);//倒数第2、3位为0代表不需要输入和输出的缓存 } -
配置vscode进行烧录(此处很简单,只需要配置flash为16m即可),检测这部分代码是否正确。保证阶段性胜利。

小结:
- I2C芯片初始化需要确定频率、scl和sda三个参数,其余的参照例程ini函数照抄就ok
**明日计划:**完成视频5的I2C数据读写操作。第五集视频从12:09开始
DAY6_20250705 第五集姿态传感器qmi8658_读写
学习视频: 第05集qmi8658姿态传感器[12:09-20:26]
学习日志:
-
将例程中的I2C文件中的read和write函数复制到练习工程中。更改相关的传感器参数。其中芯片地址通过DataSheet进行查找即可。
-
视频演示中的此文件中ini代码段中,if应该改为while逻辑才对。0x00和ox05都是在数据手册中查找出来的固定值。
c++void qmi8658_init(void) { uint8_t id; qmi8658_register_read(0x00, &id, 1); //0x00是ID寄存器 while(id != 0x05) { //如果没有读取到正确的id则继续读 视频中这个位置的while写成了if逻辑不对。 vTaskDelay(1000 / portTICK_PERIOD_MS); // 延时1秒 qmi8658_register_read(0x00, &id, 1); //0x00是ID寄存器 } ESP_LOGI(TAG, "QMI8658 OK~"); }
DAY7_20250709第五集姿态传感器qmi8658_串口显示三轴数值
学习视频: 第05集qmi8658姿态传感器[20:26-结束]
学习日志:
-
这个部分不难。补全功能代码、清晰代码结构。之前都是使用Arduino现成的库。这次对自己写驱动程序库有了一点框架结构的认识。外接的视频不同的一点就是I2C地址需要改成
ox6b

-
外接了淘宝买的qmi8658芯片 ,接线如下图所示。

**小创意:**可以放置一个早期pad上的棍球球游戏。
DAY8_20250711第六集TF卡的使用
学习视频: 第06集-TF卡的使用
学习日志:
-
复制
D:\esp\v5.1.6\esp-idf\examples\get-started\sample_project官方示例到D:\esp32s3给名为micro_sd -
更改根目录cmakelists.txt
project(micro_sd) -
参考例程:
D:\esp\v5.1.6\esp-idf\examples\storage\sd_card\sdmmc -
很多定义都可以在官方例程中找到变量,右键"goto definition"跳转查找到。
-
menuconfig中除了设置内存为16M之外,还需要搜素
fat。在显示的最后一个设置default block size更改为4096 -
默认sd卡不支持长文件名。超过8个字符会产生错误,如果想要支持长文件名、文件名支持中文,文件内容支持中文,需要更改menuconfig
long filename buffer in heap&simple chinese 936



·
tips:
- 中途测试了下Arduino IDE环境下的编译,忽然提示找不到串口。回到IDF环境也找不到串口。按照网上的方式按下reset和boot然后在依次松手的方式,也不行。在设备管理器中,删掉原有设备,拔掉重插后解决。
反思:
过程中准备的不充分,测试发现SD卡挂载失败后才发现没有SD卡。买了一张在路上。休息两天吧。
。。。。之后就开始加班了。。。。。