I am trying to configure stm32f103c8t6 bluepill with ILI9341 display using the tft_espi library .
Connection
stm32 ILI9341
PB15 -> MOSI, T_MOSI
PB14 -> MISO, T_MISO
PB13 -> SCK, T_SCK
PC15 -> TFT_CS
PC14 -> RST
PC13 ->DC
PA0 -> TOUCH_CS
I have made some changes with tft_espi header files to configure the files with stm32f103.
github:https://github.com/Bodmer/TFT_eSPI
Changes
User_setup.h
i uncommented this statements
#define STM32
#define ILI9341_DRIVER
#define TFT_SPI_PORT 2 // SPI port 2 maximum clock rate is 27MHz
#define TFT_MOSI PB15
#define TFT_MISO PB14
#define TFT_SCLK PB13
User_setup_Select.h
i uncommented this statements
#include <User_Setups/Setup32_ILI9341_STM32F103.h> // Setup for "Blue/Black Pill"
Setup32_ILI9341_STM32F103.h
i change the pin number of CS,DC,RST,TOUCH_CS according to my connection
#define TFT_CS PC15 // Chip select control pin to TFT CS
#define TFT_DC PC13 // Data Command control pin to TFT DC (may be labelled RS = Register Select)
#define TFT_RST PC14 // Reset pin to TFT RST (or RESET)
#define TOUCH_CS PA0
i uploaded a example code TFT_graphicstest_one_lib
i am getting lot of error
\Users\Admin\Documents\Arduino\libraries\TFT_eSPI\Processors/TFT_eSPI_STM32.h47: error: 'HAL_SPI_Transmit' was not declared in this scope HAL_SPI_Transmit(&spiHal, spiBuffer, 1, 10); delayMicroseconds(1);}
do i need to make some changes in the header files? please help
ILI9341 display interfacing with stm32f103c8t6 with TFT_ESPI library
Re: ILI9341 display interfacing with stm32f103c8t6 with TFT_ESPI library
I guess you use Libmaple core while the library seems request STM32 core using HAL drivers.
Re: ILI9341 display interfacing with stm32f103c8t6 with TFT_ESPI library
how can i install this libmaple core? @fpiSTM
this is the code i am trying to upload
this is the code i am trying to upload
Code: Select all
/*
Adapted from the Adafruit graphicstest sketch, see original header at end
of sketch.
This sketch uses the GLCD font (font 1) only.
Make sure all the display driver and pin connections are correct by
editing the User_Setup.h file in the TFT_eSPI library folder.
#########################################################################
###### DON'T FORGET TO UPDATE THE User_Setup.h FILE IN THE LIBRARY ######
#########################################################################
*/
#include "SPI.h"
#include "TFT_eSPI.h"
TFT_eSPI tft = TFT_eSPI();
unsigned long total = 0;
unsigned long tn = 0;
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.println(""); Serial.println("");
Serial.println("TFT_eSPI library test!");
tft.init();
tn = micros();
tft.fillScreen(TFT_BLACK);
yield(); Serial.println(F("Benchmark Time (microseconds)"));
yield(); Serial.print(F("Screen fill "));
yield(); Serial.println(testFillScreen());
//total+=testFillScreen();
//delay(500);
yield(); Serial.print(F("Text "));
yield(); Serial.println(testText());
//total+=testText();
//delay(3000);
yield(); Serial.print(F("Lines "));
yield(); Serial.println(testLines(TFT_CYAN));
//total+=testLines(TFT_CYAN);
//delay(500);
yield(); Serial.print(F("Horiz/Vert Lines "));
yield(); Serial.println(testFastLines(TFT_RED, TFT_BLUE));
//total+=testFastLines(TFT_RED, TFT_BLUE);
//delay(500);
yield(); Serial.print(F("Rectangles (outline) "));
yield(); Serial.println(testRects(TFT_GREEN));
//total+=testRects(TFT_GREEN);
//delay(500);
yield(); Serial.print(F("Rectangles (filled) "));
yield(); Serial.println(testFilledRects(TFT_YELLOW, TFT_MAGENTA));
//total+=testFilledRects(TFT_YELLOW, TFT_MAGENTA);
//delay(500);
yield(); Serial.print(F("Circles (filled) "));
yield(); Serial.println(testFilledCircles(10, TFT_MAGENTA));
//total+= testFilledCircles(10, TFT_MAGENTA);
yield(); Serial.print(F("Circles (outline) "));
yield(); Serial.println(testCircles(10, TFT_WHITE));
//total+=testCircles(10, TFT_WHITE);
//delay(500);
yield(); Serial.print(F("Triangles (outline) "));
yield(); Serial.println(testTriangles());
//total+=testTriangles();
//delay(500);
yield(); Serial.print(F("Triangles (filled) "));
yield(); Serial.println(testFilledTriangles());
//total += testFilledTriangles();
//delay(500);
yield(); Serial.print(F("Rounded rects (outline) "));
yield(); Serial.println(testRoundRects());
//total+=testRoundRects();
//delay(500);
yield(); Serial.print(F("Rounded rects (filled) "));
yield(); Serial.println(testFilledRoundRects());
//total+=testFilledRoundRects();
//delay(500);
yield(); Serial.println(F("Done!")); yield();
//Serial.print(F("Total = ")); Serial.println(total);
//yield();Serial.println(millis()-tn);
}
void loop(void) {
for (uint8_t rotation = 0; rotation < 4; rotation++) {
tft.setRotation(rotation);
testText();
delay(2000);
}
}
unsigned long testFillScreen() {
unsigned long start = micros();
tft.fillScreen(TFT_BLACK);
tft.fillScreen(TFT_RED);
tft.fillScreen(TFT_GREEN);
tft.fillScreen(TFT_BLUE);
tft.fillScreen(TFT_BLACK);
return micros() - start;
}
unsigned long testText() {
tft.fillScreen(TFT_BLACK);
unsigned long start = micros();
tft.setCursor(0, 0);
tft.setTextColor(TFT_WHITE); tft.setTextSize(1);
tft.println("Hello World!");
tft.setTextColor(TFT_YELLOW); tft.setTextSize(2);
tft.println(1234.56);
tft.setTextColor(TFT_RED); tft.setTextSize(3);
tft.println(0xDEADBEEF, HEX);
tft.println();
tft.setTextColor(TFT_GREEN);
tft.setTextSize(5);
tft.println("Groop");
tft.setTextSize(2);
tft.println("I implore thee,");
//tft.setTextColor(TFT_GREEN,TFT_BLACK);
tft.setTextSize(1);
tft.println("my foonting turlingdromes.");
tft.println("And hooptiously drangle me");
tft.println("with crinkly bindlewurdles,");
tft.println("Or I will rend thee");
tft.println("in the gobberwarts");
tft.println("with my blurglecruncheon,");
tft.println("see if I don't!");
return micros() - start;
}
unsigned long testLines(uint16_t color) {
unsigned long start, t;
int x1, y1, x2, y2,
w = tft.width(),
h = tft.height();
tft.fillScreen(TFT_BLACK);
x1 = y1 = 0;
y2 = h - 1;
start = micros();
for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color);
x2 = w - 1;
for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color);
t = micros() - start; // fillScreen doesn't count against timing
tft.fillScreen(TFT_BLACK);
x1 = w - 1;
y1 = 0;
y2 = h - 1;
start = micros();
for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color);
x2 = 0;
for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color);
t += micros() - start;
tft.fillScreen(TFT_BLACK);
x1 = 0;
y1 = h - 1;
y2 = 0;
start = micros();
for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color);
x2 = w - 1;
for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color);
t += micros() - start;
tft.fillScreen(TFT_BLACK);
x1 = w - 1;
y1 = h - 1;
y2 = 0;
start = micros();
for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color);
x2 = 0;
for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color);
return micros() - start;
}
unsigned long testFastLines(uint16_t color1, uint16_t color2) {
unsigned long start;
int x, y, w = tft.width(), h = tft.height();
tft.fillScreen(TFT_BLACK);
start = micros();
for (y = 0; y < h; y += 5) tft.drawFastHLine(0, y, w, color1);
for (x = 0; x < w; x += 5) tft.drawFastVLine(x, 0, h, color2);
return micros() - start;
}
unsigned long testRects(uint16_t color) {
unsigned long start;
int n, i, i2,
cx = tft.width() / 2,
cy = tft.height() / 2;
tft.fillScreen(TFT_BLACK);
n = min(tft.width(), tft.height());
start = micros();
for (i = 2; i < n; i += 6) {
i2 = i / 2;
tft.drawRect(cx - i2, cy - i2, i, i, color);
}
return micros() - start;
}
unsigned long testFilledRects(uint16_t color1, uint16_t color2) {
unsigned long start, t = 0;
int n, i, i2,
cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;
tft.fillScreen(TFT_BLACK);
n = min(tft.width(), tft.height());
for (i = n - 1; i > 0; i -= 6) {
i2 = i / 2;
start = micros();
tft.fillRect(cx - i2, cy - i2, i, i, color1);
t += micros() - start;
// Outlines are not included in timing results
tft.drawRect(cx - i2, cy - i2, i, i, color2);
}
return t;
}
unsigned long testFilledCircles(uint8_t radius, uint16_t color) {
unsigned long start;
int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2;
tft.fillScreen(TFT_BLACK);
start = micros();
for (x = radius; x < w; x += r2) {
for (y = radius; y < h; y += r2) {
tft.fillCircle(x, y, radius, color);
}
}
return micros() - start;
}
unsigned long testCircles(uint8_t radius, uint16_t color) {
unsigned long start;
int x, y, r2 = radius * 2,
w = tft.width() + radius,
h = tft.height() + radius;
// Screen is not cleared for this one -- this is
// intentional and does not affect the reported time.
start = micros();
for (x = 0; x < w; x += r2) {
for (y = 0; y < h; y += r2) {
tft.drawCircle(x, y, radius, color);
}
}
return micros() - start;
}
unsigned long testTriangles() {
unsigned long start;
int n, i, cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;
tft.fillScreen(TFT_BLACK);
n = min(cx, cy);
start = micros();
for (i = 0; i < n; i += 5) {
tft.drawTriangle(
cx , cy - i, // peak
cx - i, cy + i, // bottom left
cx + i, cy + i, // bottom right
tft.color565(0, 0, i));
}
return micros() - start;
}
unsigned long testFilledTriangles() {
unsigned long start, t = 0;
int i, cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;
tft.fillScreen(TFT_BLACK);
start = micros();
for (i = min(cx, cy); i > 10; i -= 5) {
start = micros();
tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
tft.color565(0, i, i));
t += micros() - start;
tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
tft.color565(i, i, 0));
}
return t;
}
unsigned long testRoundRects() {
unsigned long start;
int w, i, i2,
cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;
tft.fillScreen(TFT_BLACK);
w = min(tft.width(), tft.height());
start = micros();
for (i = 0; i < w; i += 6) {
i2 = i / 2;
tft.drawRoundRect(cx - i2, cy - i2, i, i, i / 8, tft.color565(i, 0, 0));
}
return micros() - start;
}
unsigned long testFilledRoundRects() {
unsigned long start;
int i, i2,
cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;
tft.fillScreen(TFT_BLACK);
start = micros();
for (i = min(tft.width(), tft.height()); i > 20; i -= 6) {
i2 = i / 2;
tft.fillRoundRect(cx - i2, cy - i2, i, i, i / 8, tft.color565(0, i, 0));
}
return micros() - start;
}
/***************************************************
Original Adafruit text:
This is an example sketch for the Adafruit 2.2" SPI display.
This library works with the Adafruit 2.2" TFT Breakout w/SD card
----> http://www.adafruit.com/products/1480
Check out the links above for our tutorials and wiring diagrams
These displays use SPI to communicate, 4 or 5 pins are required to
interface (RST is optional)
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries.
MIT license, all text above must be included in any redistribution
****************************************************/
Re: ILI9341 display interfacing with stm32f103c8t6 with TFT_ESPI library
i've released a port of Adafruit ILI9341 lcd library here, you may like to try it out.
https://github.com/ag88/Adafruit_ILI9341_SPI_stm32duino
check your pin assignments, this one uses SPI 1. and you need to copy all those files (the library that is) into your sketch folder.
the graphics tests sketch is part of it.
https://github.com/ag88/Adafruit_ILI9341_SPI_stm32duino
check your pin assignments, this one uses SPI 1. and you need to copy all those files (the library that is) into your sketch folder.
the graphics tests sketch is part of it.
-
- Posts: 633
- Joined: Thu Dec 19, 2019 1:23 am
Re: ILI9341 display interfacing with stm32f103c8t6 with TFT_ESPI library
Please read this link:viewtopic.php?f=2&t=301
Nomenclature is critical when posting and Arduino has its share of terminology that must be assimilated... no different than any technology or other hobby/sport.
https://atadiat.com/en/e-arduino-core-s ... ing-steps/
Arduino core is the place where all built-in functions like: pinMode(), digitalWrite(), analogRead(), Serial.begin() …etc are defined. This article is an attempt to understand the Arduino core structure, and even building a clone. Moreover, it also discusses the building process of Arduino sketches.
Re: ILI9341 display interfacing with stm32f103c8t6 with TFT_ESPI library
I am getting this error.@ag123
graphicstest:234:6: error: 'class Adafruit_ILI9341_STM' has no member named 'readcommandx'
tft.readcommandx(cmdbuf, ILI9341_RDDID, 4);
C:\Users\Arduino15\packages\stm32duino\hardware\STM32F1\2021.5.31\libraries\Adafruit_GFX_AS\Adafruit_GFX_AS.cpp: In member function 'int16_t Adafruit_GFX_AS::drawUnicode(uint16_t, int16_t, int16_t, int16_t)':
C:\Users\Arduino15\packages\stm32duino\hardware\STM32F1\2021.5.31\libraries\Adafruit_GFX_AS\Adafruit_GFX_AS.cpp:142:9: error: 'textsize' was not declared in this scope
if (textsize == 1) drawFastHLine(x, pY, width+gap, textbgcolor);
^
how can i resolve this?
graphicstest:234:6: error: 'class Adafruit_ILI9341_STM' has no member named 'readcommandx'
tft.readcommandx(cmdbuf, ILI9341_RDDID, 4);
C:\Users\Arduino15\packages\stm32duino\hardware\STM32F1\2021.5.31\libraries\Adafruit_GFX_AS\Adafruit_GFX_AS.cpp: In member function 'int16_t Adafruit_GFX_AS::drawUnicode(uint16_t, int16_t, int16_t, int16_t)':
C:\Users\Arduino15\packages\stm32duino\hardware\STM32F1\2021.5.31\libraries\Adafruit_GFX_AS\Adafruit_GFX_AS.cpp:142:9: error: 'textsize' was not declared in this scope
if (textsize == 1) drawFastHLine(x, pY, width+gap, textbgcolor);
^
how can i resolve this?
Re: ILI9341 display interfacing with stm32f103c8t6 with TFT_ESPI library
you have included the Adafruit lcd library from your IDE, you need to *exclude* that.
and all the files in src should be copied into the sketch folder to build
https://github.com/ag88/Adafruit_ILI934 ... master/src
if you still don't know which core you are using the links provided by mrburnette is relevant
viewtopic.php?f=2&t=3
viewtopic.php?f=2&t=301
do review the documents to get familiar with the core that you are using
and all the files in src should be copied into the sketch folder to build
https://github.com/ag88/Adafruit_ILI934 ... master/src
if you still don't know which core you are using the links provided by mrburnette is relevant
viewtopic.php?f=2&t=3
viewtopic.php?f=2&t=301
do review the documents to get familiar with the core that you are using