本帖最后由 fantasyhpu 于 2025-2-7 17:46 编辑
记录一个同时控制数个ESP32S3引脚输出高低电平的arduino程序。利用重载和模板,既可以传递临时引脚编号数组,也可以传递实际引脚编号数组。
[C] 纯文本查看 复制代码 #include <Arduino.h>
#define DELAY 1000
int pins[] = {21, 43};
void digitalWritePins(std::initializer_list<int> pins, int byte)
{
uint32_t maskSet = 0;
uint32_t maskSet1 = 0;
uint32_t maskClear = 0;
uint32_t maskClear1 = 0;
int i = 0;
for (int pin : pins)
{
if (byte & (1 << i))
{
if (pin < 32)
{
maskSet |= (1 << pin);
}
else if (pin <= 48)
{
maskSet1 |= (1 << (pin - 32));
}
}
else
{
if (pin < 32)
{
maskClear |= (1 << pin);
}
else if (pin <= 48)
{
maskClear1 |= (1 << (pin - 32));
}
}
i++;
}
GPIO.out_w1ts |= maskSet;
GPIO.out1_w1ts.val |= maskSet1; // 使用 .val 访问寄存器
GPIO.out_w1tc |= maskClear;
GPIO.out1_w1tc.val |= maskClear1; // 使用 .val 访问寄存器
}
template<size_t N>
void digitalWritePins(int (&pins)[N], int byte)
{
uint32_t maskSet = 0;
uint32_t maskSet1 = 0;
uint32_t maskClear = 0;
uint32_t maskClear1 = 0;
for (int i = 0; i < N; i++)
{
int pin = pins[i];
if (byte & (1 << i))
{
if (pin < 32)
{
maskSet |= (1 << pin);
}
else if (pin <= 48)
{
maskSet1 |= (1 << (pin - 32));
}
}
else
{
if (pin < 32)
{
maskClear |= (1 << pin);
}
else if (pin <= 48)
{
maskClear1 |= (1 << (pin - 32));
}
}
}
GPIO.out_w1ts |= maskSet;
GPIO.out1_w1ts.val |= maskSet1;
GPIO.out_w1tc |= maskClear;
GPIO.out1_w1tc.val |= maskClear1;
}
void pinsMode(std::initializer_list<int> pins, int mode)
{
for (int pin : pins)
{
pinMode(pin, mode);
}
}
template<size_t N>
void pinsMode(int (&pins)[N], int mode)
{
for (int i = 0; i < N; i++)
{
int pin = pins[i];
pinMode(pin, mode);
}
}
void setup()
{
pinsMode({21, 43}, OUTPUT);
}
void loop()
{
digitalWritePins(pins, 0b01);
delay(DELAY);
digitalWritePins({21, 43}, 0b10);
delay(DELAY);
} |