如何基于 ESP-IDF SDK 为应用工程添加自定义的 menuconfig 编译条件设置?

news2024/11/25 23:18:07
  • 在工程的 main 目录下添加 Kconfig.projbuild 文件
  • 对需要添加自定义设置的参数进行定义
  • 在应用代码中使用自定义设置的参数
  • 编写 Kconfig.projbuild 文件

在工程的 main 目录下添加 Kconfig.projbuild 文件

接下来会基于 esp-idf/examples/peripherals/uart/uart_async_rxtxtasks/main 例程来进行测试

  • 可参考 esp-idf/examples/peripherals/uart/uart_echo/main/Kconfig.projbuild
  • 可以直接复制 esp-idf/examples/peripherals/uart/uart_echo/main/Kconfig.projbuild 文件到 esp-idf/examples/peripherals/uart/uart_async_rxtxtasks/main 目录下
    在这里插入图片描述

对需要添加自定义设置的参数进行定义

我们以 esp-idf/examples/peripherals/uart/uart_async_rxtxtasks 例程为例,来进行编写测试

  • 需要先在 main.c 文件中对待设置的参数进行定义,例如
#define UART_TXD_PIN    (CONFIG_EXAMPLE_UART_TXD)
#define UART_RXD_PIN    (CONFIG_EXAMPLE_UART_RXD)
#define UART_RTS_PIN    (CONFIG_EXAMPLE_UART_RTS)
#define UART_CTS_PIN    (CONFIG_EXAMPLE_UART_CTS)

#define UART_PORT_NUM    (CONFIG_EXAMPLE_UART_PORT_NUM)
#define UART_BAUD_RATE    (CONFIG_EXAMPLE_UART_BAUD_RATE)
#define TASK_STACK_SIZE    (CONFIG_EXAMPLE_TASK_STACK_SIZE)
  • UART_TXD_PINUART_RXD_PINUART_RXD_PINUART_RTS_PINUART_CTS_PINUART_PORT_NUMUART_BAUD_RATETASK_STACK_SIZE 为对应定义的参数

  • EXAMPLE_UART_TXDEXAMPLE_UART_RXDEXAMPLE_UART_RTSEXAMPLE_UART_CTSEXAMPLE_UART_PORT_NUMEXAMPLE_UART_BAUD_RATEEXAMPLE_TASK_STACK_SIZE 需要与 Kconfig.projbuild 文件中参数名称对应

在这里插入图片描述

在应用代码中使用自定义设置的参数

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_log.h"
#include "driver/uart.h"
#include "string.h"
#include "sdkconfig.h"
#include "driver/gpio.h"

//static const int RX_BUF_SIZE = 1024;

#define UART_TXD_PIN    (CONFIG_EXAMPLE_UART_TXD)
#define UART_RXD_PIN    (CONFIG_EXAMPLE_UART_RXD)
#define UART_RTS_PIN    (CONFIG_EXAMPLE_UART_RTS)
#define UART_CTS_PIN    (CONFIG_EXAMPLE_UART_CTS)

#define UART_PORT_NUM    (CONFIG_EXAMPLE_UART_PORT_NUM)
#define UART_BAUD_RATE    (CONFIG_EXAMPLE_UART_BAUD_RATE)
#define TASK_STACK_SIZE    (CONFIG_EXAMPLE_TASK_STACK_SIZE)

void init(void) {
    const uart_config_t uart_config = {
        .baud_rate = UART_BAUD_RATE,
        .data_bits = UART_DATA_8_BITS,
        .parity = UART_PARITY_DISABLE,
        .stop_bits = UART_STOP_BITS_1,
        .flow_ctrl = UART_HW_FLOWCTRL_CTS_RTS,
        .source_clk = UART_SCLK_DEFAULT,
    };
    // We won't use a buffer for sending data.
    uart_driver_install(UART_PORT_NUM, TASK_STACK_SIZE * 2, 0, 0, NULL, 0);
    uart_param_config(UART_PORT_NUM, &uart_config);
    uart_set_pin(UART_PORT_NUM, UART_TXD_PIN, UART_RXD_PIN, UART_RTS_PIN, UART_CTS_PIN);
}

int sendData(const char* logName, const char* data)
{
    const int len = strlen(data);
    const int txBytes = uart_write_bytes(UART_PORT_NUM, data, len);
    ESP_LOGI(logName, "Wrote %d bytes", txBytes);
    return txBytes;
}

static void tx_task(void *arg)
{
    static const char *TX_TASK_TAG = "TX_TASK";
    esp_log_level_set(TX_TASK_TAG, ESP_LOG_INFO);
    while (1) {
        sendData(TX_TASK_TAG, "Hello world");
        vTaskDelay(2000 / portTICK_PERIOD_MS);
    }
}

static void rx_task(void *arg)
{
    static const char *RX_TASK_TAG = "RX_TASK";
    esp_log_level_set(RX_TASK_TAG, ESP_LOG_INFO);
    uint8_t* data = (uint8_t*) malloc(TASK_STACK_SIZE+1);
    while (1) {
        const int rxBytes = uart_read_bytes(UART_PORT_NUM, data, TASK_STACK_SIZE, 1000 / portTICK_PERIOD_MS);
        if (rxBytes > 0) {
            data[rxBytes] = 0;
            ESP_LOGI(RX_TASK_TAG, "Read %d bytes: '%s'", rxBytes, data);
            ESP_LOG_BUFFER_HEXDUMP(RX_TASK_TAG, data, rxBytes, ESP_LOG_INFO);
        }
    }
    free(data);
}

void app_main(void)
{
    init();
    xTaskCreate(rx_task, "uart_rx_task", TASK_STACK_SIZE * 2 , NULL, configMAX_PRIORITIES, NULL);
    xTaskCreate(tx_task, "uart_tx_task", TASK_STACK_SIZE * 2 , NULL, configMAX_PRIORITIES-1, NULL);
}

在这里插入图片描述


编写 Kconfig.projbuild 文件

  • 参考 esp-idf/examples/peripherals/uart/uart_echo/main/Kconfig.projbuild 文件,我们对当前 Kconfig.projbuild 文件内容进行修改
menu "Example Configuration"

    orsource "$IDF_PATH/examples/common_components/env_caps/$IDF_TARGET/Kconfig.env_caps"

    config EXAMPLE_UART_PORT_NUM
        int "UART port number"
        range 0 2 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S3
        default 2 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S3
        range 0 1 if IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32C2 || IDF_TARGET_ESP32H2
        default 1 if IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32C2 || IDF_TARGET_ESP32H2
        help
            UART communication port number for the example.
            See UART documentation for available port numbers.

    config EXAMPLE_UART_BAUD_RATE
        int "UART communication speed"
        range 1200 115200
        default 115200
        help
            UART communication speed for Modbus example.

    config EXAMPLE_UART_RXD
        int "UART RXD pin number"
        range ENV_GPIO_RANGE_MIN ENV_GPIO_IN_RANGE_MAX
        default 22
        help
            GPIO number for UART RX pin. See UART documentation for more information
            about available pin numbers for UART.

    config EXAMPLE_UART_TXD
        int "UART TXD pin number"
        range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX
        default 23
        help
            GPIO number for UART TX pin. See UART documentation for more information
            about available pin numbers for UART.
    
    config EXAMPLE_UART_CTS
        int "UART CTS pin number"
        range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX
        default 18
        help
            GPIO number for UART CTS pin. See UART documentation for more information
            about available pin numbers for UART.
            
    config EXAMPLE_UART_RTS
        int "UART RTS pin number"
        range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX
        default 19
        help
            GPIO number for UART RTS pin. See UART documentation for more information
            about available pin numbers for UART.
           
    config EXAMPLE_TASK_STACK_SIZE
        int "UART example task stack size"
        range 1024 16384
        default 2048
        help
            Defines stack size for UART echo example. Insufficient stack size can cause crash.

endmenu
  • config EXAMPLE_UART_PORT_NUM 对应的是 #define UART_PORT_NUM (CONFIG_EXAMPLE_UART_PORT_NUM)CONFIG_EXAMPLE_UART_PORT_NUM 内容
  • int "UART port number" 中的 UART port numbermenuconfig 中对应的配置选项名称,可任意自定义

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

在这里插入图片描述

测试结果如下:

在这里插入图片描述

为方便测试,可将 TXD 与 RXD 短接CTS 与 RTS 短接

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/720788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python黑魔法揭秘:超强公共操作符和推导式的编程技巧

文章目录 前言公共操作1.运算符1) 合并操作2)* 复制操作in / not in 判断数据在 / 不在容器中 公共方法len()del / del()max()min()range()enumerate() 容器类型转换1)list() 将某个序列转化为列表tuple() 将某个序列转换为元组set() 将某个序…

OpenCloudOS社区开源,助力软件开发

早前红帽宣布限制源代码访问性的政策,并解释说RHEL相关源码仅通过CentOS Stream公开,付费客户和合作伙伴可通过Red Hat Customer Portal访问到源代码,由此也导致非客户获取源码越来越麻烦, 据了解,CentOS是红帽发行的…

效率为王!项目管理软件如何帮你提高效率?

对于任何商业组织及其客户来说,低效率的员工和浪费的时间都是一个问题。团队成员懈怠会对团队的整体效率产生负面影响。除了巨大的财务挫折之外,这些问题的混合还导致多次延误、工作质量差和客户不满意。 但有了正确的项目管理软件,企业就可…

Netty各组件执行流程及原理

目录 一、netty执行流程 二、EventLoop 1、事件循环对象EventLoop 2、事件循环对象组EventLoopGroup 3、io任务 4、分工细化 5、handler执行中如何换的group 三、Channel 1、常用方法 2、channelFuture 3、为什么要异步 四、Future & Promise 1、jdk future …

Linux13.文件(上)

1.文件 内容 属性。 2.在程序中创建一个文件,文件是进程创建的(跑起来才有),默认路径是进程的工作路径。 3. C语言中字符串以\0结尾,文件不是。 4.指令 >文件 :清空文件。 5.理解cat指令的实现方式。 6.使用位操作传递宏标记位 7.操…

C语言经典案例-2

今天继续给大家分享C语言学习的经典练手案例 记录在校学习第三天,继续加油 今日案例来源:csdn社区每日一练 1.商品优惠计算机 商品优惠计算器 使用if语句编程实现输入购货金额,输出实际付款金额。购货折扣率如下: 购货金额≤500元…

skywalking linux安装部署

SkyWalking APM tar 下载 结合自己的es版本下载对应的tar 地址:https://archive.apache.org/dist/skywalking/ 由于我使用的是es7所以下载对应版本 拷贝对应链接使用wget下载 wget https://archive.apache.org/dist/skywalking/8.7.0/apache-skywalking-apm-es7…

Neon入门以及常用函数

什么是neon, neon是arm架构下的一个simd的一种方案, 本质上是一些可以用于simd的寄存器 具体参考官方的图: 官方的图说明对于arm开发板, 有16个128bit的寄存器,或者也可以看作是32个64bit的寄存器 列一下常用的neon…

从零开发短视频电商 使用nimbus-jose-jwt进行对称签名和非对称签名的JWT实现

文章目录 什么是JSON Web Token何时使用JSON Web TokenJSON Web Token的结构是什么头部(Header)负载(Payload)签名(Signature)拼接起来 如何使用JSON Web Token工具库依赖流程对称签名非对称签名 总结 JWT的…

超实用攻略!GPT能玩的这么6,你居然还不知道?

开篇 自古以来,智者皆知学无止境,而在我们身边,正有一款奠基于这个原则的AI机器人—ChatGPT,他擅长从网络上学习各种知识,然后把这些知识用在他的对话中。没错,它就是天马行空的闲话家,无所不谈的取经者。可你知道怎样让它更加符合你的使用需求,适应你的工作节奏么?哦…

Qt Quick系列(9)—初识画布

🚀作者:CAccept 🎂专栏:Qt Quick 文章目录 前言代码示例1源码关键知识点 代码示例2源码关键知识点 总结 前言 画布元素的基本思想是使用上下文2D对象(ctx)渲染路径。上下文2D对象包含必要的图形功能&…

一文读懂FPC(12)- FPC的阻抗控制

FPC系列文章目录 1.什么是FPC 2.什么是R-FPC 3,FPC的基材 4.FPC基材压延铜和电解铜的区别 5,FPC的辅材 6,FPC常见的四种类型 7,FPC的生产流程简介 8,R-FPC的生产流程简介 9,FPC的发展及应用 10&a…

Vue :在 VSCode 中安装 yarn 并用 yarn 工具来控制 Vue 项目的详细过程

Ⅰ、 Yarn 工具简介: 1、什么是 yarn 工具: Yarn 是 facebook 发布的一款取代 npm 的资源包管理工具,是一个快速、可靠、安全的依赖管理工具,一款新的 JavaScript 资源包管理工具(吐槽下:最大的弊端是,要通过 npm 来…

java中的String使用注意事项、StringBuilder、StringBuffer、StringJoiner

String使用注意事项 这里第二次创造了0个对象是因为字符串常量池中已经有"abc" StringBuilder 注意StringBuilder支持链式编程 StringBuilder s new StringBuilder("abc"); s.append(666).append("acb" ).append(666); System.out.printl…

89、基于STM32单片机激光测距仪远距离倒车防撞报警器系统设计(程序+原理图+PCB源文件+参考论文+硬件设计资料+元器件清单等)

单片机主芯片选择方案 方案一:AT89C51是美国ATMEL公司生产的低电压,高性能CMOS型8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元&a…

操作系统8:存储器的层次结构及程序的装入和链接

目录 1、存储器的层次结构 (1)多层结构的存储器系统 1.1 - 存储器的多层结构 1.2 - 可执行存储器 (2)主存储器与寄存器 2.1 - 主存储器 2.2 - 寄存器 (3)高速缓存和磁盘缓存 3.1 - 高速缓存 3.2 …

使用wordpress搭建WebStack导航网站记录

0 序言 首先,我来介绍下,这个webstack导航网站实际上是被做成了wordpress的一个主题,具体这个主题的下载地址如下: WordPress 版 WebStack 导航主题https://github.com/owen0o0/WebStack 我们不需要使用git clone命令&…

【观察者模式】 ——每天一点小知识

💧 观察者模式 \color{#FF1493}{观察者模式} 观察者模式💧 🌷 仰望天空,妳我亦是行人.✨ 🦄 个人主页——微风撞见云的博客🎐 🐳 《数据结构与算法》专栏的文章图文并茂🦕…

uni-calendar 日历控件自定义点的颜色功能

增加自定义点的颜色功能,官方空间点的颜色是固定红色 1、修改的页面 uni-calendar-item 在uni-calendar-item页面中的这个标签中加上一个style属性,判断传过来的参数是否存在bgcolor背景颜色,有的话添加背景色,没有则不添加默认系…

【DBA课程-笔记】第 4 章:MongoDB数据库管理备份

课程大纲 MongoDB备份机制数据库的恢复数据库的导出数据库的导入MongoDB面试题 一、MongoDB备份机制 1. MongoDB备份方式 磁阵列文件系统快照 Filesystem Snapshots复制数据文件 CPmongodump 备份 和 mongorestore 恢复工具mongoimport 导入 和 mongoexport 导出工具MongoD…