Verbinden eines resistiven Vierdraht-Touchscreens mit STM32F429DISCOVERY

Ich versuche, einen resistiven 4-Draht-Touchscreen an ein STM32F429-Discovery-Board anzuschließen, kann aber nicht herausfinden, wie es funktioniert. Ich möchte, dass die MCU eine Berührung erkennt, also habe ich die 4 Pins wie folgt konfiguriert:

X+ --> input w/pullup connected to EXTI external interrupt 
X- --> input floating (tristated)
Y+ --> input floating (tristated)
Y- --> output to GND

In dieser Konfiguration sollte ich in der Lage sein, eine Berührung zu erkennen und einen Interrupt auf der EXTI-Leitung auszulösen, damit ich eine ISR eingeben und die x- und y-Werte mit dem ADC abtasten kann. Aber wenn ich den X-Pin anschließe, geht der X+-Pin in die Nähe von GND. Es scheint, als ob Strom zwischen X + und X- fließt (also ist X- nicht tristated?). Hier ist der Code, den ich verwende, um die GPIO-Pins zu konfigurieren:

GPIO_InitTypeDef gpio;
gpio.Pin = GPIO_PIN_2 | GPIO_PIN_1;
gpio.Mode = GPIO_MODE_INPUT;
gpio.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &gpio);

gpio.Pin = GPIO_PIN_0;
gpio.Mode = GPIO_MODE_INPUT;
gpio.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &gpio);

gpio.Pin = GPIO_PIN_5;
gpio.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(GPIOA, &gpio);

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);

/* initialization using registers, works the same as above */

//  /* Xr and Yu open (input floating) */
//  GPIOA->MODER &= ~(GPIO_MODER_MODE2 | GPIO_MODER_MODE1);
//  GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPD2 | GPIO_PUPDR_PUPD1);
//
//  /* Xl input with pull-up */
//  GPIOA->MODER &= ~GPIO_MODER_MODE0;
//  GPIOA->PUPDR |= GPIO_PUPDR_PUPD0_0;
//
//  /* Yd to GND (output set to 0) */
//  GPIOA->MODER |= GPIO_MODER_MODE5_0;
//  GPIOA->ODR &= ~GPIO_ODR_OD5;

Ich kann nicht verstehen, was ich falsch mache oder wie ich die Tristate-Pins richtig konfiguriere, damit sie den X + -Pin nicht herunterziehen.

Antworten (1)

Auf der STM32F429 Discovery-Platine sind PA1 und PA2 direkt mit den Interrupt-Ausgängen des L3GD20- Bewegungssensorchips verbunden, die standardmäßig aktiv hoch sind. Das heißt, sie sollten ein logisch niedriges Signal ausgeben, bis ein (programmierbares) Ereignis eintritt. Was, da das Teil vermutlich nicht initialisiert ist, nie passiert.

Die Pins X+ und X- eines resistiven Touchscreens sind mit einem Widerstand verbunden, typischerweise mit einem Wert unter 1kΩ. Das Verbinden von X+ mit PA0 und X- mit einem Low-Level-Ausgang erzeugte effektiv einen 1-kΩ-Pulldown auf PA0.

PA0 ist ebenfalls über einen 220k-Pulldown-Widerstand (Teil der Entprellschaltung des blauen Tasters) auf dem Discovery Board mit Masse verbunden, daher ist es auch keine gute Wahl für eine analoge Verbindung.

Sie können PA0 freigeben, indem Sie irgendwo eine Lötbrücke durchtrennen, aber PA1 und PA2 sind anscheinend direkt mit dem Bewegungssensor verdrahtet.

Sie sollten das Benutzerhandbuch Ihres Boards konsultieren und 4 unbenutzte Pins finden, von denen zwei als ADC-Kanäle verwendbar sein müssen. Leider nimmt das Onboard-LCD die meisten ADC-Pins ein, aber es sind noch einige übrig, nämlich PA5, PC3 und PF6. Wählen Sie zwei davon für die Analog-Digital-Wandlung und finden Sie zwei unbenutzte Pins für die anderen beiden Anschlüsse. Das Öffnen des vordefinierten STM32F429-Discovery-Projekts in STM32CubeMX ist vielleicht der einfachste Weg, um die verwendbaren Pins zu finden.

danke, jetzt verhalten sich die Pins so, wie sie sollten. Ich habe nie überprüft, ob diese Stifte an etwas anderem befestigt waren (auch wenn mir dieser Gedanke kam). Ich habe mir zwei Tage lang den Kopf zerbrochen, danke, Sir, Sie haben mich gerettet!