15-Touch_STMPE811-Library (STM32F429)

diese Library dient zum auswerten eines 4Wire-Touch mit einem STMPE811-Chip
(das ist der Chip, der auf dem STM32F429 Discovery-Board eingebaut ist)

der Controller hängt am I2C-Bus (I2C3) also wird diese I2C-Library zusätzlich benötigt.

der Touch scheint mir besser zu funktionieren wie der auf meinem STM32F407-Board (aber probiert es selbst mal aus)

Beispielbild :

touch_f429

Benutzte Pins :

1
2
SCL = PA8
SDA = PC9

Globale Struktur :

1
2
3
4
5
6
typedef struct {
  Touch_Status_t status; // [TOUCH_PRESSED, TOUCH_RELEASED]
  uint16_t xp;           // [0...239]
  uint16_t yp;           // [0...319]
}Touch_Data_t;
Touch_Data_t Touch_Data;

Funktionen :

1
2
ErrorStatus UB_Touch_Init(void); // zum init und check vom Touch
ErrorStatus UB_Touch_Read(void); // um die Touch Daten auszulesen

Beispiel :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//--------------------------------------------------------------
// File     : main.c
// Datum    : 03.11.2013
// Version  : 1.1
// Autor    : UB
// EMail    : mc-4u(@)t-online.de
// Web      : www.mikrocontroller-4u.de
// CPU      : STM32F429
// IDE      : CooCox CoIDE 1.7.4
// GCC      : 4.7 2012q4
// Module   : CMSIS_BOOT, M4_CMSIS_CORE
// Funktion : Demo der Touch-Library
// Hinweis  : Diese zwei Files muessen auf 8MHz stehen
//              "cmsis_boot/stm32f4xx.h"
//              "cmsis_boot/system_stm32f4xx.c"
// In Configuration diese Define hinzufügen :
// "STM32F429_439xx" , "__ASSEMBLY__" , "USE_STDPERIPH_DRIVER"
//--------------------------------------------------------------
 
#include "main.h"
#include "stm32_ub_lcd_ili9341.h"
#include "stm32_ub_font.h"
#include "stm32_ub_touch_stmpe811.h"
#include <stdio.h>
 
int main(void)
{
  uint16_t xp,yp;
  char buf[30];
 
  SystemInit(); // Quarz Einstellungen aktivieren
 
  // Init vom LCD
  UB_LCD_Init();
  // Init der Layer
  UB_LCD_LayerInit_Fullscreen();
  // auf Hintergrund schalten
  UB_LCD_SetLayer_1();
  // Hintergrund komplett mit einer Farbe füllen
  UB_LCD_FillLayer(RGB_COL_WHITE);
  // auf Vordergrund schalten
  UB_LCD_SetLayer_2();
  // Vordergrund komplett mit einer Farbe füllen
  UB_LCD_FillLayer(RGB_COL_GREEN);
 
  // Ueberschrift
  UB_Font_DrawString(10,10,"Demo_15 :     ",&Arial_11x18,RGB_COL_WHITE,RGB_COL_RED);
  UB_Font_DrawString(10,30,"Touch STMPE811",&Arial_11x18,RGB_COL_WHITE,RGB_COL_RED);
 
  // init und Check vom Touch
  if(UB_Touch_Init()!=SUCCESS) {
    UB_Font_DrawString(10,70,"Error",&Arial_11x18,RGB_COL_WHITE,RGB_COL_RED);
    while(1);
  }
 
  while(1)
  {
    // Touch auslesen
    UB_Touch_Read();
    if(Touch_Data.status==TOUCH_PRESSED) {
      UB_Font_DrawString(10,70,"Pressed ",&Arial_11x18,RGB_COL_BLACK,RGB_COL_GREEN);
      xp=Touch_Data.xp;
      yp=Touch_Data.yp;
      // XY-Koordinaten anzeigen
      sprintf(buf,"X=%4d",xp);
      UB_Font_DrawString(10,90,buf,&Arial_11x18,RGB_COL_BLACK,RGB_COL_GREEN);
      sprintf(buf,"Y=%4d",yp);
      UB_Font_DrawString(10,110,buf,&Arial_11x18,RGB_COL_BLACK,RGB_COL_GREEN);
      // einen Punkt an XY-Koordinate zeichnen
      UB_LCD_SetCursor2Draw(xp,yp);
      UB_LCD_DrawPixel(RGB_COL_BLACK);
    }
    else {
      UB_Font_DrawString(10,70,"Released",&Arial_11x18,RGB_COL_BLACK,RGB_COL_GREEN);
      UB_Font_DrawString(10,90,"       ",&Arial_11x18,RGB_COL_BLACK,RGB_COL_GREEN);
      UB_Font_DrawString(10,110,"       ",&Arial_11x18,RGB_COL_BLACK,RGB_COL_GREEN);
    }
  }
}

Hier die Library zum Download :

touch_stmpe811_f429_v100

Hier der komplette CooCox-Projektordner zum Download :

Demo_F429_15


8 Antworten auf 15-Touch_STMPE811-Library (STM32F429)

  1. Burkhard sagt:

    Bekomme ganz oft die Werte X=239 Y=0 obwohl ich nicht mal in der Nähe bin. Hast du eine Erklärung dafür? Kann den Fehler nicht finden.

    • admin_ub sagt:

      Ja, das Problem kenne ich. Scheint ein BUG vom Touch zu sein (oder von der Kalibrierung). Ich hab als “Workaround” meist eine Valid-Abfrage.

      1
      2
      3
      
      if((x>0 && x<239) && (y>0 && y<319)) {
        // touch-data valid
      }

      • Burkhard sagt:

        Bei der UB_Touch_Init() bleibt er sehr oft mit “Error” hängen(ca. 20%), dann muss ich das Board komplett vom Strom trennen damit es wieder läuft. Der Resetbutton reicht nicht. Ist das bei dir auch so? VG Burkhard

        • admin_ub sagt:

          nein, er bleib zwar ab und zu hängen, aber nicht so oft. Vlt einmal bei 100 mal PowerOn. Versuch mal nach dem PowerOn eine Pause einzubauen (100ms) vor dem init vom Touch.

    • Flo sagt:

      Ich habe mir das Modul umgeschrieben, um nur bei Interrupts vom TSC die Koordinaten auszulesen. Da hatte ich auch oft { 239, 0 }. Das passiert scheinbar dann, wenn ein Touch erkannt wird, die Register TSC_DATA_X/Y aber noch nicht beschrieben sind. Bei mir hat es geholfen, nach dem Touch-Interrupt 3 ms zu warten, bevor ich die Koordinaten auslese. Zu lange darf man allerdings nicht warten, sonst sind die Werte { 0, 0 }.

      Ein Tippfehler ist mir in der Library noch aufgefallen:

      #define TOUCH_IO_ALL (uint32_t)(IO_Pin_1 | IO_Pin_2 | IO_Pin_3 | IO_Pin_4)

      sollte wohl heißen:

      #define TOUCH_IO_ALL (uint32_t)(IO_Pin_0 | IO_Pin_1 | IO_Pin_2 | IO_Pin_3)

      • admin_ub sagt:

        ja, da scheint noch mehr nicht zu stimmen. TOUCH_XD liegt z.B. nicht auf IO_Pin_2. Diese defines werden aber im Programm nicht benutzt.

  2. Ryan sagt:

    How can I change the resolution of touch screen?

    • admin_ub sagt:

      You must change the “P_Touch_Read_X” and “P_Touch_Read_Y” functions.
      Check in Debug-Mode the Raw-Data from the Sensor and adjust the calculation for the pixel-position.


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert