ESP32C3 > Pin Remap

Hallo :wink:
vielleicht kann mir ja hier jemand bei meinem Problem helfen?!
Und zwar möchte ich gerne Laut DB (Seite 165) das Signal "cpu_gpio_out5" an einen beliebigen anderen Pin mappen.

Bis jetzt leider alles ohne Erfolg.. Ist das überhaupt möglich? Das Datenblatt verwirrt mich ein wenig...

Ihr Thema wurde in den deutschen Bereich des Forums verschoben. Bitte verwenden Sie die englische Sprache in den englischen Kategorien des Forums.

Was verwirrt denn im Datenblatt?

Ich nehme mal an, es geht hier weiter:
https://www.mikrocontroller.net/topic/572864

Mir ist noch nicht so ganz klar wie das ganze genau funktionieren soll.
Es gibt da einmal den GPIO Multiplexer und dann noch den IO Mux..

Ich möchte zum testen erstmal (wenn es überhaupt möglich ist) einen gpiox an einen anderen "connecten"

Genau Inspector Watson :wink:

Und, schon probiert?

Ja aber es funktioniert nach wie vor nicht. Habe erstmal überprüft ob überhaupt die Werte in die Register geschrieben werden aber das passt jedoch.

Also so kannst Du das Signal an z.B. den GPIO-Pin 4 "mappen"

#include <Arduino.h>

#define GPIO_PIN                4

#define GPIO_BASE                0x60004000
#define GPIO_FUNCn_OUT_SEL_CFG_REG(n) (0x0554 + 4 * n)
#define gpioFunc4out *((volatile uint32_t*)(GPIO_BASE | GPIO_FUNCn_OUT_SEL_CFG_REG(GPIO_PIN)))
#define cpuGPIOOutReg *((volatile uint32_t*)(GPIO_BASE | GPIO_OUT_REG))
#define gpioEnableW1TCReg *((volatile uint32_t*)(GPIO_BASE | GPIO_ENABLE_W1TC_REG))
#define gpioEnableW1TSReg *((volatile uint32_t*)(GPIO_BASE | GPIO_ENABLE_W1TS_REG))

void setup() {
  gpioFunc4out &= 0xFFFFFF00;
  gpioFunc4out |= (GPIO_FUNC5_OEN_SEL | CPU_GPIO_OUT5_IDX);  // CPU_GPIO_OUT5 an GPIO PIN 4 binden
  cpuGPIOOutReg |= (1 << GPIO_PIN);                          // Setze PIN als Output
}

void loop() { 
  gpioEnableW1TSReg |= (1 << GPIO_PIN);
  delay(1000);
  gpioEnableW1TCReg |= (1 << GPIO_PIN);
  delay(1000);
}

Zum Anschauen:

cpuGPIOOutReg |= (1 << GPIO_PIN);

Muss denn nicht GPIO5 als Ausgang gesetzt werden?

Ich habe deinen Code mal auf meinem ESP32C3 Super Mini probiert.
An GPIO4 und GPIO5 tut sich leider nichts, gemessen mit einem LA.

Stimmt. Da habe ich mich vom Simulator narren lassen... da geht es. In "Echt" aber nicht ...

Nö. Es ist doch der Versuch nach Deinem Ausgangsposting

Ich wollte das Signal an Pin4 mappen. Aber da fehlt wohl noch ein bisschen, dieses überhaupt erst mal auszulösen.

Aber es geht schon mal in die richtige Richtung :wink: Danke für deine Bemühungen!

Einen Pin über die Register zu steuern funktioniert so schon:

#include <Arduino.h>

#define GPIO_PIN                      4
#define GPIO_BASE                     0x60004000
#define GPIO_FUNCn_OUT_SEL_CFG_REG(n) (0x0554 + 4 * n)
#define GPIO_ENABLE_REG_OFFS          0x0020
#define gpioEnableReg                 *((volatile uint32_t*)(GPIO_BASE | GPIO_ENABLE_REG_OFFS))
#define GPIO_OUT_REG_OFFS             0x0004
#define gpioOutReg                    *((volatile uint32_t*)(GPIO_BASE | GPIO_OUT_REG_OFFS))

// #define gpioFunc4out             *((volatile uint32_t*)(GPIO_BASE | GPIO_FUNCn_OUT_SEL_CFG_REG(GPIO_PIN)))
// #define cpuGPIOOutReg            *((volatile uint32_t*)(GPIO_BASE | GPIO_OUT_REG))

#define gpioEnableW1TCReg        *((volatile uint32_t*)(GPIO_BASE | GPIO_ENABLE_W1TC_REG))
#define gpioEnableW1TSReg        *((volatile uint32_t*)(GPIO_BASE | GPIO_ENABLE_W1TS_REG))

#define IO_MUX_BASE              0x60009000
#define IO_MUX_GPIOn_REG_OFFS(n) (0x0004 + n * 4)
#define iomuxGPIO4Reg            *((volatile uint32_t*)(IO_MUX_BASE | IO_MUX_GPIOn_REG_OFFS(GPIO_PIN)))
#define IO_MUX_PIN_FUNC_GPIO     1
#define IO_MUX_GPIOn_MCU_SEL     12
#define IO_MUX_GPIOn_FUN_DRV     10
#define IO_MUX_PIN_DRV_40mA      3

void setup() {
  Serial.begin(115200);
  Serial.println("Start...");

  // gpioFunc4out = gpioFunc4out & 0xFFFFFF00;
  // gpioFunc4out = gpioFunc4out | (GPIO_FUNC5_OEN_SEL | CPU_GPIO_OUT5_IDX);   // CPU_GPIO_OUT5 an GPIO PIN 4 binden
  iomuxGPIO4Reg = iomuxGPIO4Reg & ~(0x7 << IO_MUX_GPIOn_MCU_SEL);
  iomuxGPIO4Reg = iomuxGPIO4Reg | (IO_MUX_PIN_FUNC_GPIO << IO_MUX_GPIOn_MCU_SEL);
  iomuxGPIO4Reg = iomuxGPIO4Reg & ~(0x3 << IO_MUX_GPIOn_FUN_DRV);
  iomuxGPIO4Reg = iomuxGPIO4Reg | (IO_MUX_PIN_DRV_40mA << IO_MUX_GPIOn_FUN_DRV);
  // gpioEnableW1TSReg = gpioEnableW1TSReg | (0x1 << GPIO_PIN);   // Enable variant 1
  gpioEnableReg = gpioEnableReg | (1 << GPIO_PIN);             // Enable variant 2
}

void loop() {
  gpioOutReg = gpioOutReg ^ (1 << GPIO_PIN);
  delay(1000);
}

Aber das mit dem CPU_GPIO_OUTn Signal habe ich noch nicht geschnallt.

Du meinst einen GPIO über die Register zu setzen bzw. zu löschen? Ja das habe ich auch schon hin bekommen.
Man braucht aber gar nicht so viel konfiguieren wie Du es jetzt gemacht hast (es sein denn Du brauchst das unbedingt)
Nur das mit "GPIO MUX" und der "IO MUX" möchte einfach nicht..