ST7735 tft with a Bluepill STM32F103C8T6

Post here first, or if you can't find a relevant section!
010gamer4life
Posts: 7
Joined: Tue Jun 22, 2021 6:20 pm

ST7735 tft with a Bluepill STM32F103C8T6

Post by 010gamer4life »

Hello,
this is my second topic about these 2 components. A few months back I managed to get my little project working, but I want to rebuild it and it does not seem to work anymore.

I wrote my connections down and I didn't change my code. But after a few days now of trying I can't get it to work again.

I am using a STM32F103C8T6 "Bluepill" with a ST7735s 128x60 tft display. The display has these connections: GND, VCC, SCL, SDA, RES, DC, CS and BL.
My current setup is this:

Code: Select all

GND - GND
VCC - 5V
SCL - PA5
SDA - I wrote down PA6 but I think I ment PA7 but I tried both
RES - PA0
DC - PA1
CS - PA2
BL - N/C (sometimes on 3.3V, I dont use it)
I am using the up to date version of stm32core (STM32CORE) and I have updated all my libraries. I use the arduino IDE btw.
This is the code I used:

Code: Select all

#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>

#define TFT_CS  PA2
#define TFT_DC  PA1
#define TFT_RST PA0

// For 1.44" and 1.8" TFT with ST7735 use:
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

float p = 3.1415926;

void setup(void) {
  Serial.begin(9600);
  delay(1000);
  Serial.println("Hello!");
  
  tft.initR(INITR_GREENTAB); //with offset
  //tft.initR(INITR_BLACKTAB); //without offset

  delay(1000);
  tft.fillScreen(ST77XX_BLACK);
  Serial.println("Initialized");
  uint16_t time = millis();
  time = millis() - time;
  delay(1000);
}

void loop() {
  // large block of text
  tft.fillScreen(ST77XX_BLACK);
  testdrawtext("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ", ST77XX_WHITE);
  delay(1000);

  // tft print function!
  tftPrintTest();
  delay(4000);

  // a single pixel
  tft.drawPixel(tft.width() / 2, tft.height() / 2, ST77XX_GREEN);
  delay(500);

  // line draw test
  testlines(ST77XX_YELLOW);
  delay(500);

  // optimized lines
  testfastlines(ST77XX_RED, ST77XX_BLUE);
  delay(500);

  testdrawrects(ST77XX_GREEN);
  delay(500);

  testfillrects(ST77XX_YELLOW, ST77XX_MAGENTA);
  delay(500);

  tft.fillScreen(ST77XX_BLACK);
  testfillcircles(10, ST77XX_BLUE);
  testdrawcircles(10, ST77XX_WHITE);
  delay(500);

  testroundrects();
  delay(500);

  testtriangles();
  delay(500);

  mediabuttons();
  delay(500);
  
}

void testlines(uint16_t color) {
  tft.fillScreen(ST77XX_BLACK);
  for (int16_t x = 0; x < tft.width(); x += 6) {
    tft.drawLine(0, 0, x, tft.height() - 1, color);
    delay(0);
  }
  for (int16_t y = 0; y < tft.height(); y += 6) {
    tft.drawLine(0, 0, tft.width() - 1, y, color);
    delay(0);
  }

  tft.fillScreen(ST77XX_BLACK);
  for (int16_t x = 0; x < tft.width(); x += 6) {
    tft.drawLine(tft.width() - 1, 0, x, tft.height() - 1, color);
    delay(0);
  }
  for (int16_t y = 0; y < tft.height(); y += 6) {
    tft.drawLine(tft.width() - 1, 0, 0, y, color);
    delay(0);
  }

  tft.fillScreen(ST77XX_BLACK);
  for (int16_t x = 0; x < tft.width(); x += 6) {
    tft.drawLine(0, tft.height() - 1, x, 0, color);
    delay(0);
  }
  for (int16_t y = 0; y < tft.height(); y += 6) {
    tft.drawLine(0, tft.height() - 1, tft.width() - 1, y, color);
    delay(0);
  }

  tft.fillScreen(ST77XX_BLACK);
  for (int16_t x = 0; x < tft.width(); x += 6) {
    tft.drawLine(tft.width() - 1, tft.height() - 1, x, 0, color);
    delay(0);
  }
  for (int16_t y = 0; y < tft.height(); y += 6) {
    tft.drawLine(tft.width() - 1, tft.height() - 1, 0, y, color);
    delay(0);
  }
}

void testdrawtext(char *text, uint16_t color) {
  tft.setCursor(0, 0);
  tft.setTextColor(color);
  tft.setTextWrap(true);
  tft.print(text);
}

void testfastlines(uint16_t color1, uint16_t color2) {
  tft.fillScreen(ST77XX_BLACK);
  for (int16_t y = 0; y < tft.height(); y += 5) {
    tft.drawFastHLine(0, y, tft.width(), color1);
  }
  for (int16_t x = 0; x < tft.width(); x += 5) {
    tft.drawFastVLine(x, 0, tft.height(), color2);
  }
}

void testdrawrects(uint16_t color) {
  tft.fillScreen(ST77XX_BLACK);
  for (int16_t x = 0; x < tft.width(); x += 6) {
    tft.drawRect(tft.width() / 2 - x / 2, tft.height() / 2 - x / 2 , x, x, color);
  }
}

void testfillrects(uint16_t color1, uint16_t color2) {
  tft.fillScreen(ST77XX_BLACK);
  for (int16_t x = tft.width() - 1; x > 6; x -= 6) {
    tft.fillRect(tft.width() / 2 - x / 2, tft.height() / 2 - x / 2 , x, x, color1);
    tft.drawRect(tft.width() / 2 - x / 2, tft.height() / 2 - x / 2 , x, x, color2);
  }
}

void testfillcircles(uint8_t radius, uint16_t color) {
  for (int16_t x = radius; x < tft.width(); x += radius * 2) {
    for (int16_t y = radius; y < tft.height(); y += radius * 2) {
      tft.fillCircle(x, y, radius, color);
    }
  }
}

void testdrawcircles(uint8_t radius, uint16_t color) {
  for (int16_t x = 0; x < tft.width() + radius; x += radius * 2) {
    for (int16_t y = 0; y < tft.height() + radius; y += radius * 2) {
      tft.drawCircle(x, y, radius, color);
    }
  }
}

void testtriangles() {
  tft.fillScreen(ST77XX_BLACK);
  uint16_t color = 0xF800;
  int t;
  int w = tft.width() / 2;
  int x = tft.height() - 1;
  int y = 0;
  int z = tft.width();
  for (t = 0 ; t <= 15; t++) {
    tft.drawTriangle(w, y, y, x, z, x, color);
    x -= 4;
    y += 4;
    z -= 4;
    color += 100;
  }
}

void testroundrects() {
  tft.fillScreen(ST77XX_BLACK);
  uint16_t color = 100;
  int i;
  int t;
  for (t = 0 ; t <= 4; t += 1) {
    int x = 0;
    int y = 0;
    int w = tft.width() - 2;
    int h = tft.height() - 2;
    for (i = 0 ; i <= 16; i += 1) {
      tft.drawRoundRect(x, y, w, h, 5, color);
      x += 2;
      y += 3;
      w -= 4;
      h -= 6;
      color += 1100;
    }
    color += 100;
  }
}

void tftPrintTest() {
  tft.setTextWrap(false);
  tft.fillScreen(ST77XX_BLACK);
  tft.setCursor(0, 30);
  tft.setTextColor(ST77XX_RED);
  tft.setTextSize(1);
  tft.println("Hello World!");
  tft.setTextColor(ST77XX_YELLOW);
  tft.setTextSize(2);
  tft.println("Hello World!");
  tft.setTextColor(ST77XX_GREEN);
  tft.setTextSize(3);
  tft.println("Hello World!");
  tft.setTextColor(ST77XX_BLUE);
  tft.setTextSize(4);
  tft.print(1234.567);
  delay(1500);
  tft.setCursor(0, 0);
  tft.fillScreen(ST77XX_BLACK);
  tft.setTextColor(ST77XX_WHITE);
  tft.setTextSize(0);
  tft.println("Hello World!");
  tft.setTextSize(1);
  tft.setTextColor(ST77XX_GREEN);
  tft.print(p, 6);
  tft.println(" Want pi?");
  tft.println(" ");
  tft.print(8675309, HEX); // print 8,675,309 out in HEX!
  tft.println(" Print HEX!");
  tft.println(" ");
  tft.setTextColor(ST77XX_WHITE);
  tft.println("Sketch has been");
  tft.println("running for: ");
  tft.setTextColor(ST77XX_MAGENTA);
  tft.print(millis() / 1000);
  tft.setTextColor(ST77XX_WHITE);
  tft.print(" seconds.");
}

void mediabuttons() {
  // play
  tft.fillScreen(ST77XX_BLACK);
  tft.fillRoundRect(25, 10, 78, 60, 8, ST77XX_WHITE);
  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_RED);
  delay(500);
  // pause
  tft.fillRoundRect(25, 90, 78, 60, 8, ST77XX_WHITE);
  tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_GREEN);
  tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_GREEN);
  delay(500);
  // play color
  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_BLUE);
  delay(50);
  // pause color
  tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_RED);
  tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_RED);
  // play color
  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_GREEN);
}
Here are some pictures if that helps :D
Image
Image

Thanks for any help
hobbya
Posts: 49
Joined: Thu Dec 19, 2019 3:27 pm
Answers: 1

Re: ST7735 tft with a Bluepill STM32F103C8T6

Post by hobbya »

I tried your sketch and my TFT did not work until I connected the BL pin to HIGH.
By the way I cannot see your images and I am unsure what has failed on your TFT.
For me it is just the BL pin cannot be left open.
010gamer4life
Posts: 7
Joined: Tue Jun 22, 2021 6:20 pm

Re: ST7735 tft with a Bluepill STM32F103C8T6

Post by 010gamer4life »

hobbya wrote: Sat Jun 26, 2021 9:15 am I tried your sketch and my TFT did not work until I connected the BL pin to HIGH.
By the way I cannot see your images and I am unsure what has failed on your TFT.
For me it is just the BL pin cannot be left open.
Define "it works" when you connect the BL pin? do you see white or do you see the actual program doing its thing?
Ill try to reupload the pictures
hobbya
Posts: 49
Joined: Thu Dec 19, 2019 3:27 pm
Answers: 1

Re: ST7735 tft with a Bluepill STM32F103C8T6

Post by hobbya »

I meant the graphics test ran properly on my TFT.
Before I connected the BL pin to HIGH, the screen was all black but logic analyzer told me the SPI was running properly.
I recall the BL pin of some TFT's can be left open but some not.
TFTLCDCyg
Posts: 26
Joined: Tue Jan 07, 2020 9:50 pm
Answers: 1

Re: ST7735 tft with a Bluepill STM32F103C8T6

Post by TFTLCDCyg »

I don't have an F103C on hand, but I do have an F103ZE.

Test without putting jumpers on the drip head.

That TFT ST7735 you want to connect, it is a SPI screen, it is not an I2C screen, so SCL is SPI-SCK, and SDA is SPI-MOSI.

The wiring you should use is:

Code: Select all

TFT_CS  PA4 (spi1 NSS)
TFT_RST PA0
TFT_DC  PA1
SCL     PA5 (spi1 SCK)
SDA     PA7 (spi1 MOSI)
VCC = 3.3V, GND, led or blk = 3.3V

Official kernel version STM32 = 2.0.0
Adafruit GFX version = 1.7.5
Adafruit ST7735 / ST7789 version = 1.6.0

Updates from github of these libraries do not go with the new version of kernel 2.0.0.

Attached the versions that work correctly and the example that works.

https://www.mediafire.com/file/86n3xqxv ... 0.zip/file
010gamer4life
Posts: 7
Joined: Tue Jun 22, 2021 6:20 pm

Re: ST7735 tft with a Bluepill STM32F103C8T6

Post by 010gamer4life »

I dont have time right now, but i will test this for myself later today, thank you so much
Last edited by 010gamer4life on Mon Jun 28, 2021 10:26 am, edited 1 time in total.
010gamer4life
Posts: 7
Joined: Tue Jun 22, 2021 6:20 pm

Re: ST7735 tft with a Bluepill STM32F103C8T6

Post by 010gamer4life »

TFTLCDCyg wrote: Sun Jun 27, 2021 5:20 am I don't have an F103C on hand, but I do have an F103ZE.

Test without putting jumpers on the drip head.

That TFT ST7735 you want to connect, it is a SPI screen, it is not an I2C screen, so SCL is SPI-SCK, and SDA is SPI-MOSI.

The wiring you should use is:

Code: Select all

TFT_CS  PA4 (spi1 NSS)
TFT_RST PA0
TFT_DC  PA1
SCL     PA5 (spi1 SCK)
SDA     PA7 (spi1 MOSI)
VCC = 3.3V, GND, led or blk = 3.3V

Official kernel version STM32 = 2.0.0
Adafruit GFX version = 1.7.5
Adafruit ST7735 / ST7789 version = 1.6.0

Updates from github of these libraries do not go with the new version of kernel 2.0.0.

Attached the versions that work correctly and the example that works.

https://www.mediafire.com/file/86n3xqxv ... 0.zip/file
Hmm the first time i tried this this morning it worked, but now i cant get it to work anymore? i am doing the same thing as 5 minutes ago but it doesn't seem to work the second time? any idea what i am doing wrong? because your awnser did work for me but when i uploaded it again it just doesn't anymore (it stays white) :(

And what do you mean with "Test without putting jumpers on the drip head."?
TFTLCDCyg
Posts: 26
Joined: Tue Jan 07, 2020 9:50 pm
Answers: 1

Re: ST7735 tft with a Bluepill STM32F103C8T6

Post by TFTLCDCyg »

It should be working smoothly. I located a STM32F103VET6 board, similar to the F103C8T6. The programming head has no jumpers, I use a generic STLinkV-2 programmer, with the TFT-MCU wiring indicated above.

My suggestion is that you try to get away from the prototype cables and weld everything with wires as short as possible on a perforated plate. Join strand by strand carefully, the arrangement you have it should work smoothly

https://www.mediafire.com/view/cih6glgleo57423
010gamer4life
Posts: 7
Joined: Tue Jun 22, 2021 6:20 pm

Re: ST7735 tft with a Bluepill STM32F103C8T6

Post by 010gamer4life »

TFTLCDCyg wrote: Mon Jun 28, 2021 7:16 pm It should be working smoothly. I located a STM32F103VET6 board, similar to the F103C8T6. The programming head has no jumpers, I use a generic STLinkV-2 programmer, with the TFT-MCU wiring indicated above.

My suggestion is that you try to get away from the prototype cables and weld everything with wires as short as possible on a perforated plate. Join strand by strand carefully, the arrangement you have it should work smoothly

https://www.mediafire.com/view/cih6glgleo57423
Yep thank you i was planning on doing that!

I see your picture, that is the exact same thing i am trying to achieve, how would i also use a sd card reader? Can i just use PA4 for the SS again? If you would be so kind to share your pinout and basics of your code? I am trying to make a file browser that can open text files
fredbox
Posts: 125
Joined: Thu Dec 19, 2019 3:05 am
Answers: 2

Re: ST7735 tft with a Bluepill STM32F103C8T6

Post by fredbox »

My suggestion is that you try to get away from the prototype cables and weld everything with wires as short as possible on a perforated plate. Join strand by strand carefully, the arrangement you have it should work smoothly
An old fashioned wire-wrap tool makes a much better connection that Dupont pins. I've made thousands of connections with mine over the years.

A spool of multicolored wire makes keeping track of connections fairly easy.
Post Reply

Return to “General discussion”