当前位置: 首页 > news >正文

Zephyr下控制ESP32S3的GPIO口

1.关于esp32s3脚的定义

        下面以GPIO38为例介绍esp32s3GPIO控制参考ESP32S3-wroom-1规格关于GPIO38接口定义如下

上表可知GPIO38SPI复用引脚

2.查看esp32s3_devkitm对应的设备树定义

这里我选用esp32s3_devkitm/esp32s3/procpu因此查找关于这个boarddts定义如下所示

进入文件查看关于GPIO38SPI定义没有关于GPIO38定义SPI定义如下对应的SPI功能默认全部打开,需要将其禁用,让gpio功能开启

继续查找关于GPIO定义

关于"esp32s3_mini_n8.dtsi"里面定义了FlashRAM大小

关于esp32s3_devkitm-pinctrl.dtsi里面定义各个功能对应PIN脚

GPIO38用于SPI3CS

3.控制GPIO38对应的设备树

需要进一步获取系统关于GPIO定义可知esp32s3_devkitm底层引用了esp32s3_common.dtsi进一步查看

gpio0寄存器控制GPIO0-3132GPIO

gpio1寄存器控制GPIO32-5322GPIO

因此选用gpio1寄存器具体设备定义如下所示

#include <zephyr/dt-bindings/gpio/gpio.h>/ {aliases {led0 = &user_led; // 别名正确指向LED节点};leds {compatible = "gpio-leds";user_led: led_0 {gpios = <&gpio1 38 GPIO_ACTIVE_LOW>;status = "okay";};};
};&spi3 {status = "disabled"; //禁用spi3,释放对应io脚
};&gpio1 {status = "okay"; // gpio1控制器必须启用
};

4.控制GPIO38

下面控制GPIO38使其对应LED1s1s如下所示

#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>#define LED0_NODE DT_ALIAS(led0)
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);int main(void)
{int ret;bool current_state;if (!gpio_is_ready_dt(&led)) {printk("LED GPIO not ready\n");return 0;}// 配置为输出,初始高电平(灭,因GPIO_ACTIVE_LOW)ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT | GPIO_PUSH_PULL);if (ret != 0) {printk("Configure failed: %d\n", ret);return 0;}while (1) {ret = gpio_pin_set_dt(&led, 1); // 1对应高电平(因ACTIVE_LOW,此时LED应灭)if (ret != 0) {printk("Set high failed: %d\n", ret);}int level = gpio_pin_get_dt(&led);printk("After set high, level = %d\n", level); // 预期应为1k_msleep(1000);printk("Testing set low...\n");ret = gpio_pin_set_dt(&led, 0); // 0对应低电平(LED应亮)if (ret != 0) {printk("Set low failed: %d\n", ret);}level = gpio_pin_get_dt(&led);printk("After set low, level = %d\n", level); // 预期应为0k_msleep(1000);}return 0;
}

ESP32-S3 的部分 GPIO(尤其是 34~39 号引脚)默认配置为输入专用模式(无内部上拉 / 下拉电阻)。如果你的 LED 连接在这类引脚上,即使配置为输出,读取电平(输入操作)时可能无法正确获取输出状态,导致gpio_pin_get_dt始终返回 0。

5.控制GPIO0做按键

代码如下

#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>
#include <zephyr/device.h>
#include <zephyr/drivers/gpio.h>#define KEY_NODE DT_ALIAS(sw0)
static const struct gpio_dt_spec key = GPIO_DT_SPEC_GET (KEY_NODE, gpios);static int64_t last_mode_change;
volatile uint8_t pwm_mode = 1;static void change_mode(const struct device *dev, struct gpio_callback *cb, uint32_t pins)
{(void) dev;(void) cb;(void) pins;int64_t now = k_uptime_get();if (now - last_mode_change > 300) {pwm_mode = (pwm_mode)?0:1;last_mode_change = now;}
}int main(void)
{struct gpio_callback button_cb_data;int ret;if(!gpio_is_ready_dt(&key)) {printf("Error: GPIO device not ready!\n");return -1;}ret = gpio_pin_configure_dt(&key, GPIO_INPUT);if(ret != 0) {printf("Failed to configure.key (ret = %d)\n", ret);return -1;}gpio_pin_interrupt_configure_dt(&key, GPIO_INT_EDGE_RISING);gpio_init_callback(&button_cb_data, change_mode, BIT(key.pin));gpio_add_callback(key.port, &button_cb_data);while(1) {printk("pwm_mode = %d\n", pwm_mode);}return 0;
}

运行执行结果如下

http://www.dtcms.com/a/338002.html

相关文章:

  • RK3568 NPU RKNN(六):RKNPU2 SDK
  • FlycoTabLayout CommonTabLayout 支持Tab选中字体变大 选中tab的加粗效果首次无效的bug
  • 探索性测试:灵活找Bug的“人肉探测仪”
  • 前端 大文件分片下载上传
  • 宝塔面板多Python版本管理与项目部署
  • excel表格 Vue3(非插件)
  • day25|学习前端js
  • Linux: RAID(磁盘冗余阵列)配置全指南
  • 损失函数与反向传播 小土堆pytorch记录
  • FPGA-Vivado2017.4-建立AXI4用于单片机与FPGA之间数据互通
  • 计算机组成原理(9) - 整数的乘除法运算
  • js计算两个经纬度之间的角度
  • Python字符串连接与合并工程实践:从基础到高性能解决方案
  • 【笔记】位错的定义和分类
  • B站 韩顺平 笔记 (Day 22)
  • 【人工智能】2025年AI代理失控危机:构建安全壁垒,守护智能未来
  • 规避(EDR)安全检测--避免二进制文件落地
  • 面向对象爬虫进阶:类封装实现高复用爬虫框架​
  • DP-v2.1-mem-clean学习(3.6.9-3.6.12)
  • Python 爬虫实战:玩转 Playwright 跨浏览器自动化(Chromium/Firefox/WebKit 全支持)
  • 嵌入式第三十二课!!线程间的同步机制与进程间的通信(IPC机制)
  • PotPlayer使用AI生成字幕和API实时翻译
  • Redis中LRU与LFU的底层实现:字节级的精巧设计
  • 树莓派安装python第三方库如keras,tensorflow
  • day35-负载均衡
  • 智能化合同处理与知识应用平台:让合同从 “管得住” 到 “用得好”
  • C15T3
  • openssl加密里面的pem格式和rsa有什么区别?
  • 财务分析师如何提升自身专业能力:突破职业瓶颈的五年进阶规划
  • nestjs配置@nestjs/config 入门教程