67-LCD_ILI9341_SPI-Library (STM32F4)

diese Library dient zum ansteuern eines Grafik LC-Displays mit einem ILI9341-Chip.
(240 x 320 Pixel und 16bit Farbe)

das Display wird per SPI angesteuert (aus dem Grund wird auch noch die SPI-Library benötigt)

in der Library ist das löschen vom Bildschirm und das setzen von Punkten, zeichnen von Linien und Kreisen dabei.

weil das ganze nur über SPI angesteuert wird, ist es nicht gerade sehr schnell aber dafür braucht man nur 4 Leitungen.

MISO wird nicht benötigt, Reset muss an Vcc und die LED-Hintergrundbeleuchtung kann man per Vorwiderstand auch an Vcc klemmen.

Hinweis zur Benutzung der Textausgabe :
Es können die Zeichensätze der Font-Library benutzt werden, allerdings muss der Include Pfad in den Font.c Files angepasst werden.

Bild von der Display Rückseite :

ili9341_spi

Benutzte Pins :

1
2
3
4
5
PB11 : CS   (ChipSelect)
PB12 : D/C  (DATA/CMD)
PB13 : SPI_CLK
PB14 : SPI_MISO (MISO / SDO) [nicht notwendig]
PB15 : SPI_MOSI (MOSI / SDI)

Funktionen :

1
2
3
4
5
6
7
8
ErrorStatus UB_LCD_Init(void);                                                          // init vom LCD
void UB_LCD_FillScreen(uint16_t color);                                                 // füllt den Screen mit einer Farbe
void UB_LCD_SetWindow(uint16_t xstart, uint16_t ystart, uint16_t xend, uint16_t yend);  // setzt ein Window zum zeichnen
void UB_LCD_DrawPixel(int16_t xpos, int16_t ypos, uint16_t color);                      // zum zeichnen eines Pixels
void UB_LCD_DrawLine(int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color);   // zum zeichnen einer Linie
void UB_LCD_DrawCircle(int16_t x0, int16_t y0, int16_t radius, uint16_t color);         // zum zeichnen eines Kreises
void UB_Font_DrawChar(uint16_t x, uint16_t y, uint8_t ascii, UB_Font *font, uint16_t vg, uint16_t bg);  // zum schreiben eines Buchstabens
void UB_Font_DrawString(uint16_t x, uint16_t y,char *ptr, UB_Font *font, uint16_t vg, uint16_t bg);     // zum schreiben eines Strings

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
//--------------------------------------------------------------
// File     : main.c
// Datum    : 23.11.2013
// Version  : 1.0
// Autor    : UB
// EMail    : mc-4u(@)t-online.de
// Web      : www.mikrocontroller-4u.de
// CPU      : STM32F4
// IDE      : CooCox CoIDE 1.7.4
// GCC      : 4.7 2012q4
// Module   : CMSIS_BOOT, M4_CMSIS_CORE
// Funktion : Demo der LCD-ILI9341 Library
// Hinweis  : Diese zwei Files muessen auf 8MHz stehen
//              "cmsis_boot/stm32f4xx.h"
//              "cmsis_boot/system_stm32f4xx.c"
//--------------------------------------------------------------
 
#include "main.h"
#include "stm32_ub_lcd_ili9341_spi.h"
 
int main(void)
{
  SystemInit(); // Quarz Einstellungen aktivieren
 
  // init vom LCD
  UB_LCD_Init();
 
  // LCD mit grün löschen
  UB_LCD_FillScreen(RGB_COL_GREEN);
 
  // einen Blauen Kreis zeichnen
  UB_LCD_DrawCircle(120,160,60,RGB_COL_BLUE);
 
  while(1)
  {
 
  }
}

Hier die Library zum Download :

ub_stm32f4_lcd_ili9341_spi_v101

Hier der komplette CooCox-Projektordner zum Download :

Demo_67_LCD_ILI9341


17 Antworten auf 67-LCD_ILI9341_SPI-Library (STM32F4)

  1. Cortex-Einsteiger sagt:

    klasse!
    Da werd ich das alte Display doch nochmal aus Schublade rauskramen.
    Ein TFT mit 4 Leitungen ansteuern macht einen fliegenden Laboraufbau viel einfacher, bei den anderen Beispielen musste man immer schauen ob sich nicht doch irgendwo eine der 20 Leitungen gelöst hatte.

  2. Cortex-Einsteiger sagt:

    funktioniert gut,
    aber die Geschwindigkeit ist leider mies, beim Bildschirmfüllen fällt es extrem auf, für Linien oder Kreise ist es allerdings ok,
    leider ist die Font-Lib nicht kompatibel, da bekomme ich wegen dem fehlenden Display-Mode sowie LCD-RAM Fehlermeldungen

    • admin_ub sagt:

      das ist kein Problem. Füge einfach eine Variable ein und setz sie fest auf einen Wert

      1
      
      uint32_t LCD_DISPLAY_MODE=PORTRAIT;

      und ersetze alle stellen in denen ins RAM geschrieben wird, z.B.

      1
      2
      
      // LCD_RAM = bg;  // alt
      UB_LCD_DrawPixel(xn+x,yn+y,bg); // neu

      für die X/Y-Adressen musst du dir den Code ansehen wie die berechnet werden und “UB_LCD_SetCursor2Draw” braucht man gar nicht mehr.

      den Speed kannst du event. etwas verbessern, in dem du in der SPI-Lib den SPI-Vorteiler kleiner einstellst…bis das Display nicht mehr reagiert. Ich denke 10MHz sollte das Display noch mittmachen.

      • Cortex-Einsteiger sagt:

        Habe nach deiner Anleitung den Code an allen nötigen Stellen geändert, nun läuft die Textanzeige auch, danke für die schnelle Hilfe.

        Mein Display läuft mit 21MHz SPI-Takt zuverlässig, da hätte ich auch selbst drauf kommen können… man sieht zwar den Bildaufbau noch aber man hat keine “Wartezeit” mehr

      • kai sagt:

        Hallo,

        kann man die Font Lib für das Display verwenden. Ich habe es versucht, allerdings meckert der Compiler, dass einige Funktionen doppelt definiert sind. Es gibt die Headerdatei für das Display ili9341 und für das Display st7783. Beide zusammen stören sich. Wo muss ich denn welche Headerdateien einbinden, damit ich die Font Lib benutzen kann?

        Gruß
        Kai

        • kai sagt:

          Hat sich erledigt. Habe es hinbekommen.

  3. kai sagt:

    Hallo,

    ich habe von adafruit ein Display mit dem ili9340.
    Kann man die Library auch dafür verwenden.

    Gruß
    Kai

    • Joerg sagt:

      Wahrscheinlich benutzt adafruit nur ein anderes Breakout, letztendlich wirst du es einfach mal probieren müssen.

      • Kai sagt:

        Es funktioniert. Ich habe es aber an SPI3 gehängt.

  4. Malte sagt:

    Guten Tag,
    Ich versuche ein Display mit dem ili9340 anzusteuern.
    Wir haben alle Pins zu (SPI1) umbenannt aber es funktioniert nicht.
    Der Versuch alle SPI2 namen in SPI1 umzuschreiben hat uns auch nicht weitergebracht.

    Gibt es eventuell eine einfache Möglichkeit, unser Display über SPI1 zum Laufen, zu bekommen?
    Liebe Grüße,
    Malte

    • admin_ub sagt:

      wenn du statt SPI2 den SPI1 benutzen willst :
      1.)
      musst du zuerst die zwei Files : “stm32_ub_spi2.c” und “stm32_ub_spi2.h” löschen und durch die zwei files “stm32_ub_spi1.c” und “stm32_ub_spi1.h” ersetzen.
      (Diese Files finden sich in der Library “15-SPI_LoLevel”)
      2.)
      Im “stm32_ub_spi1.c” sind die benötigten SPI-Pins der CPU eingetragen.
      3.)
      Im File “stm32_ub_lcd_ili9341_spi.h” muss der Include auf die neue “stm32_ub_spi1.h” geändert werden.
      4.)
      Und alle Funktionen in der “stm32_ub_lcd_ili9341_spi.c” die “SPI2″ enthalten müssen auf “SPI1″ umbenannt werden.
      5.)
      Das compilieren darf keine Fehler melden

      • Malte sagt:

        Sehr vielen Dank für die Hilfe :)

  5. Klemen sagt:

    Nice work!
    LCD works great!
    Is possible to display string? Is there any library? I searching for Discovery board and no luck …

    Best regards,
    Klemen

    • admin_ub sagt:

      please download Version 1.1 and try “UB_Font_DrawString”. You also need Font-Files included here : http://mikrocontroller.bplaced.net/wordpress/?page_id=527. And you have to change the include path in the font.c files to “stm32_ub_lcd_ili9341_spi.h”

  6. Christian sagt:

    Erst mal Klasse, dass Du dein Wissen mit anderen teilst und den Einstieg mit dem ili9431 enorm unterstützt!

    Jedoch wollte ich gerne das Display rotoeren lassen bzw. von “PORTRAIT auf LANDSCAPE ändern. Jedoch finde ich keine Funktion zum Modus…hast DU da einen Tip für mich oder muß ich das datasheet nochmal büffeln?

    Nochmals, coole Leistung!
    Christian

    • admin_ub sagt:

      das muss im Datenblatt irgendwo stehen.

  7. Christian Julius sagt:

    Hallo,

    das Display wird deutlich schneller, wenn man die SPI mit der DMA fütttert. Der Speicherplatz reicht zwar nur für 1 Page aber die passt auch noch so eben rein. Dann kann man auf der Page arbeiten. Ok, die CPU muss ständig den internen Bus freigeben so dass sie auch langsamer rechnet aber den Faktor 10 kriegt man schon hin.


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