搜索
bottom↓
回复: 3

ESP32 IDF开发怎么通过寄存器操作IO的高低电平?

[复制链接]

出0入4汤圆

发表于 前天 22:40 | 显示全部楼层 |阅读模式
我设计程序,都是用的库函数进行功能的配置,但是进行IO高低电平  操作的时候如何用寄存器进行,因为涉及到快速的LED点阵的驱动,官方的API函数进行IO操作有点慢?  有这方面使用经验的大侠吗?

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入4汤圆

 楼主| 发表于 前天 23:24 | 显示全部楼层
求各位大神指点哈

出200入2554汤圆

发表于 昨天 00:42 | 显示全部楼层
看了下 Arduino 的操作,以 esp8266 为例,底层使用的是 NONOS 库开发。

Arduino 通过 digitalWrite 函数更改输出 IO 状态,在 core_esp8266_wiring_digital.cpp 当中可以找到:

  1. extern void IRAM_ATTR __digitalWrite(uint8_t pin, uint8_t val) {
  2.   stopWaveform(pin); // Disable any Tone or startWaveform on this pin
  3.   _stopPWM(pin);     // and any analogWrites (PWM)
  4.   if(pin < 16){
  5.     if(val) GPOS = (1 << pin);
  6.     else GPOC = (1 << pin);
  7.   } else if(pin == 16){
  8.     if(val) GP16O |= 1;
  9.     else GP16O &= ~1;
  10.   }
  11. }
复制代码


基本就看到了 GPOS、GPOC 这样的寄存器,继续找下去在 esp8266_peri.h 当中找到了定义,也是 C 指针形式:

  1. //GPIO (0-15) Control Registers
  2. #define GPO    ESP8266_REG(0x300) //GPIO_OUT R/W (Output Level)
  3. #define GPOS   ESP8266_REG(0x304) //GPIO_OUT_SET WO
  4. #define GPOC   ESP8266_REG(0x308) //GPIO_OUT_CLR WO
  5. #define GPE    ESP8266_REG(0x30C) //GPIO_ENABLE R/W (Enable)
  6. #define GPES   ESP8266_REG(0x310) //GPIO_ENABLE_SET WO
  7. #define GPEC   ESP8266_REG(0x314) //GPIO_ENABLE_CLR WO
  8. #define GPI    ESP8266_REG(0x318) //GPIO_IN RO (Read Input Level)
  9. #define GPIE   ESP8266_REG(0x31C) //GPIO_STATUS R/W (Interrupt Enable)
  10. #define GPIES  ESP8266_REG(0x320) //GPIO_STATUS_SET WO
  11. #define GPIEC  ESP8266_REG(0x324) //GPIO_STATUS_CLR WO
复制代码


具体也是相当复杂,想看的话代码传过来:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 昨天 10:30 | 显示全部楼层
需要将io口设置成分离IO,然后可以通过汇编来来控制,我去找下

// 配置 GPIO
const int bundleA_gpios[] = {0, 1};
gpio_config_t io_conf = {
    .mode = GPIO_MODE_OUTPUT,
};
for (int i = 0; i < sizeof(bundleA_gpios) / sizeof(bundleA_gpios[0]); i++) {
    io_conf.pin_bit_mask = 1ULL << bundleA_gpios[i];
    gpio_config(&io_conf);
}
// 创建 bundleA,仅输出
dedic_gpio_bundle_handle_t bundleA = NULL;
dedic_gpio_bundle_config_t bundleA_config = {
    .gpio_array = bundleA_gpios,
    .array_size = sizeof(bundleA_gpios) / sizeof(bundleA_gpios[0]),
    .flags = {
        .out_en = 1,
    },
};
ESP_ERROR_CHECK(dedic_gpio_new_bundle(&bundleA_config, &bundleA));
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-14 19:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表