Hallo
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?
Kai-R
November 17, 2024, 11:31am
4
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"
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.
Kai-R
November 30, 2024, 1:37pm
10
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:
Run IoT and embedded projects in your browser: ESP32, STM32, Arduino, Pi Pico, and more. No installation required!
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.
Kai-R
December 1, 2024, 6:31am
13
Stimmt. Da habe ich mich vom Simulator narren lassen... da geht es. In "Echt" aber nicht ...
Kai-R
December 1, 2024, 6:33am
14
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 Danke für deine Bemühungen!
Kai-R
December 1, 2024, 8:51am
16
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..