XIAO-ESP32C6 gpio register bit-banging - Success

Hi there,
So that’s excellent, Glad you got it going.

Let me assist in using the code tags above, “</>” make reading and using it easier :+1: Just paste it in there.

// Use register gpio register ops to control six LEDs

// Pin mapping: BUILT-IN LED = GPIO15, D3 = GPIO21, D4 = GPIO22, D5 = GPIO23, D6 = GPIO16

#include <stdint.h>

#define GPIO_OUT_REG 0x60091004
#define GPIO_OUT_W1TS_REG 0x60091008
#define GPIO_OUT_W1TC_REG 0x6009100C
#define GPIO_ENABLE_W1TS_REG 0x60091024
#define GPIO_ENABLE_W1TC_REG 0x60091028
#define GPIO_IN_REG 0x6009103C
#define GPIO_PIN1_ESP32 15 // BUILT-IN LED
#define GPIO_PIN2_ESP32 21 // D3
#define GPIO_PIN3_ESP32 22 // D4
#define GPIO_PIN4_ESP32 23 // D5
#define GPIO_PIN5_ESP32 16 // D6
#define GPIO_PIN6_ESP32 17 // D7
#define delayMs 150 // LED on time (ms)

volatile uint32_t* gpio_enable_w1ts_reg = (volatile uint32_t*) GPIO_ENABLE_W1TS_REG;
volatile uint32_t* gpio_out_w1ts_reg = (volatile uint32_t*) GPIO_OUT_W1TS_REG;
volatile uint32_t* gpio_out_w1tc_reg = (volatile uint32_t*) GPIO_OUT_W1TC_REG;
volatile uint32_t* gpio_out_reg = (volatile uint32_t*) GPIO_OUT_REG;
volatile uint32_t* gpio_in_reg = (volatile uint32_t*) GPIO_IN_REG;

void setup() {
pinMode(GPIO_PIN1_ESP32, OUTPUT); // Sets the IO_MUX correctly
pinMode(GPIO_PIN2_ESP32, OUTPUT);
pinMode(GPIO_PIN3_ESP32, OUTPUT);
pinMode(GPIO_PIN4_ESP32, OUTPUT);
pinMode(GPIO_PIN5_ESP32, OUTPUT);
pinMode(GPIO_PIN6_ESP32, OUTPUT);

*gpio_enable_w1ts_reg = (1 << GPIO_PIN1_ESP32); // Enable GPIO21 (BUILT_IN LED) as an output
*gpio_enable_w1ts_reg = (1 << GPIO_PIN2_ESP32); // Enable GPIO21 (D3) as an output
*gpio_enable_w1ts_reg = (1 << GPIO_PIN3_ESP32); // Enable GPIO21 (D4) as an output
*gpio_enable_w1ts_reg = (1 << GPIO_PIN4_ESP32); // Enable GPIO21 (D5) as an output
*gpio_enable_w1ts_reg = (1 << GPIO_PIN5_ESP32); // Enable GPIO21 (D6) as an output
*gpio_enable_w1ts_reg = (1 << GPIO_PIN6_ESP32); // Enable GPIO21 (D7) as an output
}

void loop() {
// Set gpio bits high to turn on LED
*gpio_out_w1ts_reg = (1 << GPIO_PIN1_ESP32); // Set the bit
delay(delayMs);
*gpio_out_w1ts_reg = (1 << GPIO_PIN2_ESP32); // Set the bit
delay(delayMs);
*gpio_out_w1ts_reg = (1 << GPIO_PIN3_ESP32); // Set the bit
delay(delayMs);
*gpio_out_w1ts_reg = (1 << GPIO_PIN4_ESP32); // Set the bit
delay(delayMs);
*gpio_out_w1ts_reg = (1 << GPIO_PIN5_ESP32); // Set the bit
delay(delayMs);
*gpio_out_w1ts_reg = (1 << GPIO_PIN6_ESP32); // Set the bit
delay(delayMs);

// Set gpio bits low to turn off LED
*gpio_out_w1tc_reg = (1 << GPIO_PIN6_ESP32); // Clear the bit
delay(delayMs);
*gpio_out_w1tc_reg = (1 << GPIO_PIN5_ESP32); // Clear the bit
delay(delayMs);
*gpio_out_w1tc_reg = (1 << GPIO_PIN4_ESP32); // Clear the bit
delay(delayMs);
*gpio_out_w1tc_reg = (1 << GPIO_PIN3_ESP32); // Clear the bit
delay(delayMs);
*gpio_out_w1tc_reg = (1 << GPIO_PIN2_ESP32); // Clear the bit
delay(delayMs);
*gpio_out_w1tc_reg = (1 << GPIO_PIN1_ESP32); // Clear the bit
delay(delayMs);
}

HTH
GL :slight_smile: PJ :v:

Ps do mark the old thread and post as the solution so others can find it also. :+1:

1 Like