IoTESP32 Arduino GPIO 使用简析

Posted 产品人卫朋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IoTESP32 Arduino GPIO 使用简析相关的知识,希望对你有一定的参考价值。

一、GPIO 中断使用简析

1、中断触发方式

ESP32 Arduino 有以下四种触发方式:

 LOW              低电平触发
 CHANGE       电平变化
 RISING         上升沿触发
 FALLING       下降沿触发
 HIGH             高电平触发

2、配置中断

在定义中断函数后,需要在 setup 函数配置中断函数

// interrupt=中断通道编号,function=中断函数,mode=中断触发模式
attachInterrupt(interrupt, function, mode); 

// pin=中断引脚,function=中断函数,mode=中断触发模式
attachInterrupt(pin, function, mode);

如果在程序运行过程不需要使用外部中断了,可以用中断分离函数来取消这一中断设置:

detachInterrupt(interrupt); 
detachInterrupt(Pin);。

3、示例

void setup()

  // 初始化日志打印串口
  Serial.begin(115200);
  
  // 配置中断引脚
  pinMode(26, INPUT|PULLUP );

  // 检测到引脚 26 下降沿,触发中断函数 blink
  attachInterrupt(26, blink, FALLING);

  Serial.println("\\nstart irq test");


void loop()




// 中断函数
void blink()

  Serial.println("IRQ");

二、IIC 使用简析

示例:

#include <Wire.h>

void setup() 
  // 启动 i2c 总线
  Wire.begin();

  // 初始化串口
  Serial.begin(9600);


int reading = 0;

void loop() 
  // step 1: 启动与从设备 #112 0x70 的数据交互
  Wire.beginTransmission(112);

  // 发送数据
  Wire.write(byte(0x00));
  Wire.write(byte(0x50));

  // 结束通信
  Wire.endTransmission();

  // step 2: 等待读数据
  delay(70);

  // step 3: 读取指定寄存器
  Wire.beginTransmission(112);
  Wire.write(byte(0x02));
  Wire.endTransmission();

  // step 4: 请求读 2 字节数据
  Wire.requestFrom(112, 2);

  // step 5: 接收数据
  if (2 <= Wire.available()) 
    reading = Wire.read();
    reading = reading << 8;
    reading |= Wire.read();
    Serial.println(reading);
  

  delay(250);


三、SPI 使用简析

示例:



/* The ESP32 has four SPi buses, however as of right now only two of
 * them are available to use, HSPI and VSPI. Simply using the SPI API 
 * as illustrated in Arduino examples will use HSPI, leaving VSPI unused.
 * 
 * However if we simply intialise two instance of the SPI class for both
 * of these buses both can be used. However when just using these the Arduino
 * way only will actually be outputting at a time.
 * 
 * Logic analyser capture is in the same folder as this example as
 * "multiple_bus_output.png"
 * 
 * created 30/04/2018 by Alistair Symonds
 */
#include <SPI.h>

static const int spiClk = 1000000; // 1 MHz

//uninitalised pointers to SPI objects
SPIClass * vspi = NULL;
SPIClass * hspi = NULL;

void setup() 
  // 初始化 SPI 实例 VSPI、HSPI
  vspi = new SPIClass(VSPI);
  hspi = new SPIClass(HSPI);
  
  //clock miso mosi ss

  //使用默认 VSPI 引脚:SCLK = 18, MISO = 19, MOSI = 23, SS = 5
  vspi->begin();
  
  // alternatively route through GPIO pins of your choice
  //vspi->begin(0, 2, 4, 33); // SCLK, MISO, MOSI, SS
  
  //使用默认引脚初始化 HSPI
  //SCLK = 14, MISO = 12, MOSI = 13, SS = 15
  hspi->begin(); 

  //alternatively route through GPIO pins
  //hspi->begin(25, 26, 27, 32); //SCLK, MISO, MOSI, SS
  
  // 初始化 ss 片选引脚,默认为低电平
  pinMode(5, OUTPUT); //VSPI SS
  pinMode(15, OUTPUT); //HSPI SS



// the loop function runs over and over again until power down or reset
void loop() 
  //use the SPI buses
  vspiCommand();
  hspiCommand();
  delay(100);


void vspiCommand() 
  // 模拟数据
  byte data = 0b01010101;

  // 启动 VSPI 传输
  vspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0));
  digitalWrite(5, LOW);
  vspi->transfer(data);  
  digitalWrite(5, HIGH);
  vspi->endTransaction();


void hspiCommand() 
  byte stuff = 0b11001100;
  
  hspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0));
  digitalWrite(15, LOW);
  hspi->transfer(stuff);
  digitalWrite(15, HIGH);
  hspi->endTransaction();

 

以上是关于IoTESP32 Arduino GPIO 使用简析的主要内容,如果未能解决你的问题,请参考以下文章

Arduino ESP32:测试GPIO中断功能二

STM32G070RBT6基于Arduino框架GPIO输入输出模式

STM32G070RBT6基于Arduino框架GPIO外部中断

Arduino ESP32自带触摸传感器功能测试

Arduino ESP32配置静态IP并通过网页控制GPIO引脚

Arduino ESP32 读写查看SD信息示例