3.5" inch TFT LCD Display Module 480X320 driven with FSMC.

TFT LCD Display Module 480X320 driven with FSMC

I have recently bought a 3.5" inch TFT LCD Touch Screen Display Module 480X320 with a www.mcufriend.com label on the back side. The display was equipped with an 8bit parallel interface. First I decided to test it with the UniGraphic library using the BUS_8 protocol. The display was very slow but improved when I switched to the PAR_8 protocol. Because I heard about the possibility to use a Flexible Static Memory Controller (FSMC), built into some STM MCU's, to drive LCD's (read/write to LCD's memory rather than to an external SRAM) I thought it would be a fun to try it out.

https://os.mbed.com/media/uploads/hudakz/lcd_3.5_tft_480x320_mcufriend_front.png

Below is the brief story of what I did:

  • Selected FSMC in the Connectivity category and configured it as below: https://os.mbed.com/media/uploads/hudakz/arch_max_fsmc_conf.png
  • Let the STM32CubeIDE generate the code (files).
  • Created a new program for the Seeed Arch Max target in the Mbed Online Compiler by selecting a mbed os blinky template.
  • Replaced the main.cpp with the main.c content of the STM32CubeIDE project.
  • Copy & Pasted the other files with codes from the STM32CubeIDE project to the online compiler project.
  • Renamed and modified:
    "stm32f4xx_it.h" to "stm32f4xx_it_msp.h"
    "stm32f4xx_it.c" to "stm32f4xx_it_msp.c"
  • Added the UniGraphic library to the online compiler project.
  • Extended the UniGraphic library with a FSMC_8 protocol and replaced the TFT::set_orientation(int orient) function with the one used by mcufriend for arduino.
  • Modified the main.cpp as needed.
https://os.mbed.com/media/uploads/hudakz/stm32f407vet6_st-link03.pnghttps://os.mbed.com/media/uploads/hudakz/lcd_3.5_tft_480x320_mcufriend_back.png


Wiring

STM32F407VETFT LCD module
+3.3V3V3
GNDGND
PB_12LCD_RST
GNDLCD_CS
PD_13 (RS)LCD_RS
PD_5 (WR)LCD_WR
PD_4 (RD)LCD_RD
PD_14 (DB00)LCD_D0
PD_15 (DB01)LCD_D1
PD_0 (DB02)LCD_D2
PD_1 (DB03)LCD_D3
PE_7 (DB04)LCD_D4
PE_8 (DB05)LCD_D5
PE_9 (DB06)LCD_D6
PE_10 (DB07)LCD_D7



Results
Execution times
Used protocolBUS_8FSMC_8
Operation \ Timemsms
Clear2283.98038.454
Plot192.06611.365
8bit BMP63.80541.338
Large Font163.8727.895
Sparce pixels2072.265/1458.05174.107/52.168
16bit BMP2288.58959.904
Committer:
hudakz
Date:
Sun May 10 10:44:31 2020 +0000
Revision:
0:fa952828e34c
Child:
1:47c996032a9e
3.5" inch TFT LCD Display Module 480X320 driven with FSMC.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:fa952828e34c 1
hudakz 0:fa952828e34c 2 /* USER CODE BEGIN Header */
hudakz 0:fa952828e34c 3
hudakz 0:fa952828e34c 4 /**
hudakz 0:fa952828e34c 5 ******************************************************************************
hudakz 0:fa952828e34c 6 * @file : main.c
hudakz 0:fa952828e34c 7 * @brief : Main program body
hudakz 0:fa952828e34c 8 ******************************************************************************
hudakz 0:fa952828e34c 9 * @attention
hudakz 0:fa952828e34c 10 *
hudakz 0:fa952828e34c 11 * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
hudakz 0:fa952828e34c 12 * All rights reserved.</center></h2>
hudakz 0:fa952828e34c 13 *
hudakz 0:fa952828e34c 14 * This software component is licensed by ST under BSD 3-Clause license,
hudakz 0:fa952828e34c 15 * the "License"; You may not use this file except in compliance with the
hudakz 0:fa952828e34c 16 * License. You may obtain a copy of the License at:
hudakz 0:fa952828e34c 17 * opensource.org/licenses/BSD-3-Clause
hudakz 0:fa952828e34c 18 *
hudakz 0:fa952828e34c 19 ******************************************************************************
hudakz 0:fa952828e34c 20 */
hudakz 0:fa952828e34c 21 /* USER CODE END Header */
hudakz 0:fa952828e34c 22 /* Includes ------------------------------------------------------------------*/
hudakz 0:fa952828e34c 23 #include "main.h"
hudakz 0:fa952828e34c 24
hudakz 0:fa952828e34c 25 /* Private includes ----------------------------------------------------------*/
hudakz 0:fa952828e34c 26
hudakz 0:fa952828e34c 27 /* USER CODE BEGIN Includes */
hudakz 0:fa952828e34c 28 #ifdef __MBED__
hudakz 0:fa952828e34c 29 #include "mbed.h"
hudakz 0:fa952828e34c 30 #include "string"
hudakz 0:fa952828e34c 31 #include "Arial12x12.h"
hudakz 0:fa952828e34c 32 #include "Arial24x23.h"
hudakz 0:fa952828e34c 33 #include "Terminal6x8.h"
hudakz 0:fa952828e34c 34 #include "Arial43x48_digits.h"
hudakz 0:fa952828e34c 35 #include "pict.h"
hudakz 0:fa952828e34c 36 #include "pavement_48x34.h"
hudakz 0:fa952828e34c 37 #include "TFT_MIPI.h"
hudakz 0:fa952828e34c 38 #endif
hudakz 0:fa952828e34c 39 /* USER CODE END Includes */
hudakz 0:fa952828e34c 40
hudakz 0:fa952828e34c 41 /* Private typedef -----------------------------------------------------------*/
hudakz 0:fa952828e34c 42 /* USER CODE BEGIN PTD */
hudakz 0:fa952828e34c 43 /* USER CODE END PTD */
hudakz 0:fa952828e34c 44 /* Private define ------------------------------------------------------------*/
hudakz 0:fa952828e34c 45 /* USER CODE BEGIN PD */
hudakz 0:fa952828e34c 46 TFT_MIPI * myLCD;
hudakz 0:fa952828e34c 47 Timer tmr;
hudakz 0:fa952828e34c 48 int time1;
hudakz 0:fa952828e34c 49 int time2;
hudakz 0:fa952828e34c 50 unsigned short backgroundColor = Black;
hudakz 0:fa952828e34c 51 unsigned short foregroundColor = White;
hudakz 0:fa952828e34c 52 uint8_t orient = 0;
hudakz 0:fa952828e34c 53
hudakz 0:fa952828e34c 54 /* USER CODE END PD */
hudakz 0:fa952828e34c 55 /* Private macro -------------------------------------------------------------*/
hudakz 0:fa952828e34c 56 /* USER CODE BEGIN PM */
hudakz 0:fa952828e34c 57 /* USER CODE END PM */
hudakz 0:fa952828e34c 58 /* Private variables ---------------------------------------------------------*/
hudakz 0:fa952828e34c 59 SRAM_HandleTypeDef hsram1;
hudakz 0:fa952828e34c 60
hudakz 0:fa952828e34c 61 /* USER CODE BEGIN PV */
hudakz 0:fa952828e34c 62 /* USER CODE END PV */
hudakz 0:fa952828e34c 63 /* Private function prototypes -----------------------------------------------*/
hudakz 0:fa952828e34c 64 //static void SystemClock_Config(void);
hudakz 0:fa952828e34c 65 static void MX_GPIO_Init(void);
hudakz 0:fa952828e34c 66 static void MX_FSMC_Init(void);
hudakz 0:fa952828e34c 67 /* USER CODE BEGIN PFP */
hudakz 0:fa952828e34c 68 /* USER CODE END PFP */
hudakz 0:fa952828e34c 69 /* Private user code ---------------------------------------------------------*/
hudakz 0:fa952828e34c 70
hudakz 0:fa952828e34c 71 /* USER CODE BEGIN 0 */
hudakz 0:fa952828e34c 72 uint16_t RGB(uint16_t r, uint16_t g, uint16_t b)
hudakz 0:fa952828e34c 73 {
hudakz 0:fa952828e34c 74 return(r << 16) | (g << 8) | b;
hudakz 0:fa952828e34c 75 }
hudakz 0:fa952828e34c 76
hudakz 0:fa952828e34c 77 /* USER CODE END 0 */
hudakz 0:fa952828e34c 78
hudakz 0:fa952828e34c 79 /**
hudakz 0:fa952828e34c 80 * @brief The application entry point.
hudakz 0:fa952828e34c 81 * @retval int
hudakz 0:fa952828e34c 82 */
hudakz 0:fa952828e34c 83 int main(void)
hudakz 0:fa952828e34c 84 {
hudakz 0:fa952828e34c 85 /* USER CODE BEGIN 1 */
hudakz 0:fa952828e34c 86
hudakz 0:fa952828e34c 87 /* USER CODE END 1 */
hudakz 0:fa952828e34c 88 /* MCU Configuration--------------------------------------------------------*/
hudakz 0:fa952828e34c 89 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
hudakz 0:fa952828e34c 90 // HAL_Init();
hudakz 0:fa952828e34c 91 /* USER CODE BEGIN Init */
hudakz 0:fa952828e34c 92 /* USER CODE END Init */
hudakz 0:fa952828e34c 93 /* Configure the system clock */
hudakz 0:fa952828e34c 94 // SystemClock_Config();
hudakz 0:fa952828e34c 95 /* USER CODE BEGIN SysInit */
hudakz 0:fa952828e34c 96 /* USER CODE END SysInit */
hudakz 0:fa952828e34c 97 /* Initialize all configured peripherals */
hudakz 0:fa952828e34c 98 MX_GPIO_Init();
hudakz 0:fa952828e34c 99 MX_FSMC_Init();
hudakz 0:fa952828e34c 100 /* USER CODE BEGIN 2 */
hudakz 0:fa952828e34c 101 // LCD_RST : PB_12 -> LCD_RST
hudakz 0:fa952828e34c 102 // FSMC_NE1: not used
hudakz 0:fa952828e34c 103 // GND -> LCD_CS
hudakz 0:fa952828e34c 104 // FSMC_A18: PD_13 -> LCD_RS
hudakz 0:fa952828e34c 105 // FSMC_NWE: PD_5 -> LCD_WR
hudakz 0:fa952828e34c 106 // FSMC_NOE: PD_4 -> LCD_RD
hudakz 0:fa952828e34c 107 // FSMC_D0 : PD_14 -> LCD_D0
hudakz 0:fa952828e34c 108 // FSMC_D1 : PD_15 -> LCD_D1
hudakz 0:fa952828e34c 109 // FSMC_D2 : PD_0 -> LCD_D2
hudakz 0:fa952828e34c 110 // FSMC_D3 : PD_1 -> LCD_D3
hudakz 0:fa952828e34c 111 // FSMC_D4 : PE_7 -> LCD_D4
hudakz 0:fa952828e34c 112 // FSMC_D5 : PE_8 -> LCD_D5
hudakz 0:fa952828e34c 113 // FSMC_D6 : PE_9 -> LCD_D6
hudakz 0:fa952828e34c 114 // FSMC_D7 : PE_10 -> LCD_D7
hudakz 0:fa952828e34c 115 //TFT_MIPI myLCD(BUS_8, buspins, PD_7, PB_12, PD_13, PD_5, PD_4, "myLCD", 320, 480); // CS, reset, DC, WR, RD
hudakz 0:fa952828e34c 116 // CS , RST, DC, WR, RD
hudakz 0:fa952828e34c 117 myLCD = new TFT_MIPI(FSMC_8, PB_12, "myLCD", 320, 480); // Protocol, Pin->LCD_RST, name , LCDSIZE_X, LCDSIZE_Y
hudakz 0:fa952828e34c 118 myLCD->set_orientation(1);
hudakz 0:fa952828e34c 119 myLCD->background(backgroundColor);
hudakz 0:fa952828e34c 120 myLCD->foreground(foregroundColor);
hudakz 0:fa952828e34c 121 printf("\n\nSystem Core Clock = %.3f MHZ\r\n", (float)SystemCoreClock / 1000000);
hudakz 0:fa952828e34c 122 printf("Target: %s\n", MBED_STRINGIFY(TARGET_NAME));
hudakz 0:fa952828e34c 123
hudakz 0:fa952828e34c 124 myLCD->cls();
hudakz 0:fa952828e34c 125 myLCD->locate(0, 30);
hudakz 0:fa952828e34c 126 myLCD->printf("Display ID: %.8X\r\n", myLCD->tftID);
hudakz 0:fa952828e34c 127 printf("Display ID: %.8X\r\n", myLCD->tftID);
hudakz 0:fa952828e34c 128
hudakz 0:fa952828e34c 129 tmr.start();
hudakz 0:fa952828e34c 130 /* USER CODE END 2 */
hudakz 0:fa952828e34c 131 /* Infinite loop */
hudakz 0:fa952828e34c 132 /* USER CODE BEGIN WHILE */
hudakz 0:fa952828e34c 133 while (1) {
hudakz 0:fa952828e34c 134 myLCD->set_orientation((++orient) % 4);
hudakz 0:fa952828e34c 135
hudakz 0:fa952828e34c 136 /* LCD memory write/read test */
hudakz 0:fa952828e34c 137 unsigned short readback;
hudakz 0:fa952828e34c 138 unsigned short colorstep = (0x10000 / myLCD->width());
hudakz 0:fa952828e34c 139
hudakz 0:fa952828e34c 140 for (unsigned short i = 0; i < myLCD->width(); i++) {
hudakz 0:fa952828e34c 141 myLCD->pixel(i, 0, i * colorstep);
hudakz 0:fa952828e34c 142 }
hudakz 0:fa952828e34c 143
hudakz 0:fa952828e34c 144 bool readerror = false;
hudakz 0:fa952828e34c 145
hudakz 0:fa952828e34c 146 for (unsigned short i = 0; i < myLCD->width(); i++) {
hudakz 0:fa952828e34c 147
hudakz 0:fa952828e34c 148 /* verify line */
hudakz 0:fa952828e34c 149 readback = myLCD->pixelread(i, 0);
hudakz 0:fa952828e34c 150 if (readback != i * colorstep) {
hudakz 0:fa952828e34c 151 readerror = true;
hudakz 0:fa952828e34c 152 printf("pix %.4X readback %.4X\r\n", i * colorstep, readback);
hudakz 0:fa952828e34c 153 }
hudakz 0:fa952828e34c 154 }
hudakz 0:fa952828e34c 155
hudakz 0:fa952828e34c 156 myLCD->locate(0, 10);
hudakz 0:fa952828e34c 157 myLCD->printf("Pixelread test %s\r\n", readerror ? "FAILED" : "PASSED");
hudakz 0:fa952828e34c 158 thread_sleep_for(2000);
hudakz 0:fa952828e34c 159
hudakz 0:fa952828e34c 160 /* Auto carriage return test */
hudakz 0:fa952828e34c 161 myLCD->cls();
hudakz 0:fa952828e34c 162 myLCD->set_font((unsigned char*)Arial12x12);
hudakz 0:fa952828e34c 163 myLCD->locate(0, 0);
hudakz 0:fa952828e34c 164 myLCD->printf("Display Test\r\nSome text just to see if auto carriage return works correctly");
hudakz 0:fa952828e34c 165 printf(" Display Test \r\n");
hudakz 0:fa952828e34c 166 thread_sleep_for(2000);
hudakz 0:fa952828e34c 167
hudakz 0:fa952828e34c 168 /* Clear screen test */
hudakz 0:fa952828e34c 169 tmr.reset();
hudakz 0:fa952828e34c 170 myLCD->cls();
hudakz 0:fa952828e34c 171 time1 = tmr.read_us();
hudakz 0:fa952828e34c 172 myLCD->locate(2, 75);
hudakz 0:fa952828e34c 173 myLCD->printf("cls: %.3fms", (float)time1 / 1000);
hudakz 0:fa952828e34c 174 printf("cls: %.3fms\r\n", (float)time1 / 1000);
hudakz 0:fa952828e34c 175 thread_sleep_for(2000);
hudakz 0:fa952828e34c 176
hudakz 0:fa952828e34c 177 myLCD->cls();
hudakz 0:fa952828e34c 178 tmr.reset();
hudakz 0:fa952828e34c 179
hudakz 0:fa952828e34c 180 /* Simple graphics test */
hudakz 0:fa952828e34c 181 myLCD->set_font((unsigned char*)Arial24x23);
hudakz 0:fa952828e34c 182 myLCD->locate(10, 10);
hudakz 0:fa952828e34c 183 myLCD->printf("Test");
hudakz 0:fa952828e34c 184 myLCD->line(0, 0, myLCD->width() - 1, 0, foregroundColor);
hudakz 0:fa952828e34c 185 myLCD->line(0, 0, 0, myLCD->height() - 1, foregroundColor);
hudakz 0:fa952828e34c 186 myLCD->line(0, 0, myLCD->width() - 1, myLCD->height() - 1, foregroundColor);
hudakz 0:fa952828e34c 187 myLCD->rect(10, 30, 50, 40, foregroundColor);
hudakz 0:fa952828e34c 188 myLCD->fillrect(60, 30, 100, 40, foregroundColor);
hudakz 0:fa952828e34c 189 myLCD->circle(150, 32, 30, foregroundColor);
hudakz 0:fa952828e34c 190 myLCD->fillcircle(140, 20, 10, foregroundColor);
hudakz 0:fa952828e34c 191
hudakz 0:fa952828e34c 192 double s;
hudakz 0:fa952828e34c 193
hudakz 0:fa952828e34c 194 for (unsigned short i = 0; i < myLCD->width(); i++) {
hudakz 0:fa952828e34c 195 s = 10 * sin((long double)i / 10);
hudakz 0:fa952828e34c 196 myLCD->pixel(i, 40 + (int)s, foregroundColor);
hudakz 0:fa952828e34c 197 }
hudakz 0:fa952828e34c 198
hudakz 0:fa952828e34c 199 time1 = tmr.read_us();
hudakz 0:fa952828e34c 200 myLCD->locate(2, 75);
hudakz 0:fa952828e34c 201 myLCD->set_font((unsigned char*)Arial12x12);
hudakz 0:fa952828e34c 202 myLCD->printf("plot: %.3fms", (float)time1 / 1000);
hudakz 0:fa952828e34c 203 printf("plot: %.3fms\r\n", (float)time1 / 1000);
hudakz 0:fa952828e34c 204 thread_sleep_for(2000);
hudakz 0:fa952828e34c 205
hudakz 0:fa952828e34c 206 /* Bitmap test */
hudakz 0:fa952828e34c 207 Bitmap_s bmp =
hudakz 0:fa952828e34c 208 {
hudakz 0:fa952828e34c 209 64, // XSize
hudakz 0:fa952828e34c 210 64, // YSize
hudakz 0:fa952828e34c 211 8, // Bytes in Line
hudakz 0:fa952828e34c 212 burp // Pointer to picture data
hudakz 0:fa952828e34c 213 };
hudakz 0:fa952828e34c 214
hudakz 0:fa952828e34c 215 tmr.reset();
hudakz 0:fa952828e34c 216 myLCD->cls();
hudakz 0:fa952828e34c 217 myLCD->Bitmap_BW(bmp, myLCD->width() - 64, 0);
hudakz 0:fa952828e34c 218 time1 = tmr.read_us();
hudakz 0:fa952828e34c 219 myLCD->locate(2, 75);
hudakz 0:fa952828e34c 220 myLCD->printf("bmp: %.3fms", (float)time1 / 1000);
hudakz 0:fa952828e34c 221 printf("bmp: %.3fms\r\n", (float)time1 / 1000);
hudakz 0:fa952828e34c 222 thread_sleep_for(2000);
hudakz 0:fa952828e34c 223
hudakz 0:fa952828e34c 224 /* Large font test */
hudakz 0:fa952828e34c 225 myLCD->cls();
hudakz 0:fa952828e34c 226 myLCD->set_font((unsigned char*)Arial43x48_digits, 46, 58, false); /* only digits, variable-width disabled */
hudakz 0:fa952828e34c 227 tmr.reset();
hudakz 0:fa952828e34c 228 myLCD->locate(0, 0);
hudakz 0:fa952828e34c 229 myLCD->printf("%d", 12345);
hudakz 0:fa952828e34c 230 time1 = tmr.read_us();
hudakz 0:fa952828e34c 231 myLCD->locate(2, 75);
hudakz 0:fa952828e34c 232 myLCD->set_font((unsigned char*)Arial12x12);
hudakz 0:fa952828e34c 233 myLCD->printf("Large Font: %.3fms", (float)time1 / 1000);
hudakz 0:fa952828e34c 234 printf("Large Font: %.3fms\r\n", (float)time1 / 1000);
hudakz 0:fa952828e34c 235 thread_sleep_for(2000);
hudakz 0:fa952828e34c 236
hudakz 0:fa952828e34c 237 /* Sparse pixels test */
hudakz 0:fa952828e34c 238 myLCD->cls();
hudakz 0:fa952828e34c 239 myLCD->FastWindow(false);
hudakz 0:fa952828e34c 240 tmr.reset();
hudakz 0:fa952828e34c 241 for (unsigned int i = 0; i < 20000; i++) {
hudakz 0:fa952828e34c 242 myLCD->pixel((i + (i * 89)) % myLCD->width(), (i + (i * 61)) % myLCD->height(), White);
hudakz 0:fa952828e34c 243 }
hudakz 0:fa952828e34c 244 time1 = tmr.read_us();
hudakz 0:fa952828e34c 245 thread_sleep_for(2000);
hudakz 0:fa952828e34c 246
hudakz 0:fa952828e34c 247 myLCD->cls();
hudakz 0:fa952828e34c 248 myLCD->FastWindow(true);
hudakz 0:fa952828e34c 249 tmr.reset();
hudakz 0:fa952828e34c 250 for (unsigned int i = 0; i < 20000; i++) {
hudakz 0:fa952828e34c 251 myLCD->pixel((i + (i * 89)) % myLCD->width(), (i + (i * 61)) % myLCD->height(), White);
hudakz 0:fa952828e34c 252 }
hudakz 0:fa952828e34c 253 time2 = tmr.read_us();
hudakz 0:fa952828e34c 254
hudakz 0:fa952828e34c 255 myLCD->cls();
hudakz 0:fa952828e34c 256 myLCD->locate(2, 75);
hudakz 0:fa952828e34c 257 myLCD->printf("std:%.3fms fastw:%.3fms", (float)time1 / 1000, (float)time2 / 1000);
hudakz 0:fa952828e34c 258 printf("std: %.3fms fastw: %.3fms\r\n", (float)time1 / 1000, (float)time2 / 1000);
hudakz 0:fa952828e34c 259 thread_sleep_for(2000);
hudakz 0:fa952828e34c 260
hudakz 0:fa952828e34c 261 /* Scroll test */
hudakz 0:fa952828e34c 262 myLCD->cls();
hudakz 0:fa952828e34c 263 myLCD->set_font((unsigned char*)Arial24x23);
hudakz 0:fa952828e34c 264 myLCD->locate(2, 10);
hudakz 0:fa952828e34c 265 myLCD->printf("Scrolling");
hudakz 0:fa952828e34c 266 myLCD->rect(0, 0, myLCD->width() - 1, myLCD->height() - 1, White);
hudakz 0:fa952828e34c 267 myLCD->rect(1, 1, myLCD->width() - 2, myLCD->height() - 2, Blue);
hudakz 0:fa952828e34c 268 myLCD->setscrollarea(0, myLCD->sizeY());
hudakz 0:fa952828e34c 269 thread_sleep_for(1000);
hudakz 0:fa952828e34c 270 myLCD->scroll(1); /* up 1 */
hudakz 0:fa952828e34c 271 thread_sleep_for(1000);
hudakz 0:fa952828e34c 272 myLCD->scroll(0); /* center */
hudakz 0:fa952828e34c 273 thread_sleep_for(1000);
hudakz 0:fa952828e34c 274 myLCD->scroll(myLCD->sizeY() - 1); /* down 1 */
hudakz 0:fa952828e34c 275 thread_sleep_for(1000);
hudakz 0:fa952828e34c 276 myLCD->scroll(myLCD->sizeY()); /* same as 0, center */
hudakz 0:fa952828e34c 277 thread_sleep_for(1000);
hudakz 0:fa952828e34c 278 myLCD->scroll(myLCD->sizeY() >> 1); /* half screen */
hudakz 0:fa952828e34c 279 thread_sleep_for(1000);
hudakz 0:fa952828e34c 280 myLCD->scrollreset(); /* center */
hudakz 0:fa952828e34c 281 thread_sleep_for(1000);
hudakz 0:fa952828e34c 282 for (unsigned short i = 1; i <= myLCD->sizeY(); i++) {
hudakz 0:fa952828e34c 283 myLCD->scroll(i);
hudakz 0:fa952828e34c 284 thread_sleep_for(2);
hudakz 0:fa952828e34c 285 }
hudakz 0:fa952828e34c 286 thread_sleep_for(2000);
hudakz 0:fa952828e34c 287
hudakz 0:fa952828e34c 288 /* Color inversion */
hudakz 0:fa952828e34c 289 for (unsigned short i = 0; i <= 8; i++) {
hudakz 0:fa952828e34c 290 myLCD->invert(i & 1);
hudakz 0:fa952828e34c 291 thread_sleep_for(200);
hudakz 0:fa952828e34c 292 }
hudakz 0:fa952828e34c 293 thread_sleep_for(2000);
hudakz 0:fa952828e34c 294
hudakz 0:fa952828e34c 295 /* 16bit bitmap test */
hudakz 0:fa952828e34c 296 myLCD->cls();
hudakz 0:fa952828e34c 297 tmr.reset();
hudakz 0:fa952828e34c 298 for (int y = 0; y < myLCD->height(); y += 34) {
hudakz 0:fa952828e34c 299 for (int x = 0; x < myLCD->width(); x += 48)
hudakz 0:fa952828e34c 300 myLCD->Bitmap(x, y, 48, 34, (unsigned char*)pavement_48x34);
hudakz 0:fa952828e34c 301 }
hudakz 0:fa952828e34c 302 time1 = tmr.read_us();
hudakz 0:fa952828e34c 303 myLCD->locate(2, 75);
hudakz 0:fa952828e34c 304 myLCD->set_font((unsigned char*)Arial12x12);
hudakz 0:fa952828e34c 305 myLCD->printf("16bit bitmap speed: %.3fms", (float)time1 / 1000);
hudakz 0:fa952828e34c 306 printf("16bit bitmap speed: %.3fms\r\n", (float)time1 / 1000);
hudakz 0:fa952828e34c 307 thread_sleep_for(2000);
hudakz 0:fa952828e34c 308
hudakz 0:fa952828e34c 309 /* Drawing random lines */
hudakz 0:fa952828e34c 310 for (int i = 0; i < 6000; i++) {
hudakz 0:fa952828e34c 311 int x1 = rand() % myLCD->width();
hudakz 0:fa952828e34c 312 int y1 = rand() % myLCD->height();
hudakz 0:fa952828e34c 313
hudakz 0:fa952828e34c 314 int x2 = rand() % myLCD->width();
hudakz 0:fa952828e34c 315 int y2 = rand() % myLCD->height();
hudakz 0:fa952828e34c 316
hudakz 0:fa952828e34c 317 int r = rand() % 0xff;
hudakz 0:fa952828e34c 318 int g = rand() % 0xff;
hudakz 0:fa952828e34c 319 int b = rand() % 0xff;
hudakz 0:fa952828e34c 320
hudakz 0:fa952828e34c 321 myLCD->line(x1, y1, x2, y2, RGB(r, g, b));
hudakz 0:fa952828e34c 322 }
hudakz 0:fa952828e34c 323
hudakz 0:fa952828e34c 324 /* Drawing text at random position */
hudakz 0:fa952828e34c 325 for (int i = 0; i < 3000; i++) {
hudakz 0:fa952828e34c 326 int x1 = rand() % myLCD->width();
hudakz 0:fa952828e34c 327 int y1 = rand() % myLCD->height();
hudakz 0:fa952828e34c 328
hudakz 0:fa952828e34c 329 int r = rand() % 0xff;
hudakz 0:fa952828e34c 330 int g = rand() % 0xff;
hudakz 0:fa952828e34c 331 int b = rand() % 0xff;
hudakz 0:fa952828e34c 332
hudakz 0:fa952828e34c 333 myLCD->locate(x1, y1);
hudakz 0:fa952828e34c 334 myLCD->foreground(RGB(r, g, b));
hudakz 0:fa952828e34c 335 myLCD->printf("Hello World");
hudakz 0:fa952828e34c 336 }
hudakz 0:fa952828e34c 337
hudakz 0:fa952828e34c 338 /* Drawing random pixels */
hudakz 0:fa952828e34c 339 for (int i = 0; i < 500000; i++) {
hudakz 0:fa952828e34c 340 int x1 = rand() % myLCD->width();
hudakz 0:fa952828e34c 341 int y1 = rand() % myLCD->height();
hudakz 0:fa952828e34c 342
hudakz 0:fa952828e34c 343 int r = rand() % 0xff;
hudakz 0:fa952828e34c 344 int g = rand() % 0xff;
hudakz 0:fa952828e34c 345 int b = rand() % 0xff;
hudakz 0:fa952828e34c 346
hudakz 0:fa952828e34c 347 myLCD->pixel(x1, y1, RGB(r, g, b));
hudakz 0:fa952828e34c 348 }
hudakz 0:fa952828e34c 349
hudakz 0:fa952828e34c 350 /* Drawing random rectangles */
hudakz 0:fa952828e34c 351 for (int i = 0; i < 500; i++) {
hudakz 0:fa952828e34c 352 int x1 = rand() % myLCD->width();
hudakz 0:fa952828e34c 353 int y1 = rand() % myLCD->height();
hudakz 0:fa952828e34c 354
hudakz 0:fa952828e34c 355 int x2 = rand() % myLCD->width();
hudakz 0:fa952828e34c 356 int y2 = rand() % myLCD->height();
hudakz 0:fa952828e34c 357
hudakz 0:fa952828e34c 358 int r = rand() % 0xff;
hudakz 0:fa952828e34c 359 int g = rand() % 0xff;
hudakz 0:fa952828e34c 360 int b = rand() % 0xff;
hudakz 0:fa952828e34c 361
hudakz 0:fa952828e34c 362 myLCD->fillrect(x1, y1, x2, y2, RGB(r, g, b));
hudakz 0:fa952828e34c 363 }
hudakz 0:fa952828e34c 364
hudakz 0:fa952828e34c 365 /* USER CODE END WHILE */
hudakz 0:fa952828e34c 366 /* USER CODE BEGIN 3 */
hudakz 0:fa952828e34c 367 }
hudakz 0:fa952828e34c 368
hudakz 0:fa952828e34c 369 /* USER CODE END 3 */
hudakz 0:fa952828e34c 370 }
hudakz 0:fa952828e34c 371
hudakz 0:fa952828e34c 372 /**
hudakz 0:fa952828e34c 373 * @brief System Clock Configuration
hudakz 0:fa952828e34c 374 * @retval None
hudakz 0:fa952828e34c 375 */
hudakz 0:fa952828e34c 376 //void SystemClock_Config(void)
hudakz 0:fa952828e34c 377 //{
hudakz 0:fa952828e34c 378 // RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };
hudakz 0:fa952828e34c 379 // RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };
hudakz 0:fa952828e34c 380 // RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
hudakz 0:fa952828e34c 381 // /** Configure the main internal regulator output voltage
hudakz 0:fa952828e34c 382 //*/
hudakz 0:fa952828e34c 383
hudakz 0:fa952828e34c 384 // __HAL_RCC_PWR_CLK_ENABLE();
hudakz 0:fa952828e34c 385 // __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
hudakz 0:fa952828e34c 386
hudakz 0:fa952828e34c 387 // /** Initializes the CPU, AHB and APB busses clocks
hudakz 0:fa952828e34c 388 //*/
hudakz 0:fa952828e34c 389 // RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
hudakz 0:fa952828e34c 390 // RCC_OscInitStruct.HSEState = RCC_HSE_ON;
hudakz 0:fa952828e34c 391 // RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
hudakz 0:fa952828e34c 392 // RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
hudakz 0:fa952828e34c 393 // RCC_OscInitStruct.PLL.PLLM = 8;
hudakz 0:fa952828e34c 394 // RCC_OscInitStruct.PLL.PLLN = 336;
hudakz 0:fa952828e34c 395 // RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
hudakz 0:fa952828e34c 396 // RCC_OscInitStruct.PLL.PLLQ = 7;
hudakz 0:fa952828e34c 397 // if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
hudakz 0:fa952828e34c 398 // Error_Handler();
hudakz 0:fa952828e34c 399 // }
hudakz 0:fa952828e34c 400
hudakz 0:fa952828e34c 401 // /** Initializes the CPU, AHB and APB busses clocks
hudakz 0:fa952828e34c 402 //*/
hudakz 0:fa952828e34c 403 // RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
hudakz 0:fa952828e34c 404 // RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
hudakz 0:fa952828e34c 405 // RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
hudakz 0:fa952828e34c 406 // RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
hudakz 0:fa952828e34c 407 // RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
hudakz 0:fa952828e34c 408 // if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {
hudakz 0:fa952828e34c 409 // Error_Handler();
hudakz 0:fa952828e34c 410 // }
hudakz 0:fa952828e34c 411
hudakz 0:fa952828e34c 412 // if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) {
hudakz 0:fa952828e34c 413 // Error_Handler();
hudakz 0:fa952828e34c 414 // }
hudakz 0:fa952828e34c 415 //}
hudakz 0:fa952828e34c 416
hudakz 0:fa952828e34c 417 /**
hudakz 0:fa952828e34c 418 * @brief GPIO Initialization Function
hudakz 0:fa952828e34c 419 * @param None
hudakz 0:fa952828e34c 420 * @retval None
hudakz 0:fa952828e34c 421 */
hudakz 0:fa952828e34c 422 static void MX_GPIO_Init(void)
hudakz 0:fa952828e34c 423 {
hudakz 0:fa952828e34c 424 /* GPIO Ports Clock Enable */
hudakz 0:fa952828e34c 425
hudakz 0:fa952828e34c 426 __HAL_RCC_GPIOB_CLK_ENABLE();
hudakz 0:fa952828e34c 427 __HAL_RCC_GPIOC_CLK_ENABLE();
hudakz 0:fa952828e34c 428 __HAL_RCC_GPIOD_CLK_ENABLE();
hudakz 0:fa952828e34c 429 __HAL_RCC_GPIOE_CLK_ENABLE();
hudakz 0:fa952828e34c 430 __HAL_RCC_GPIOH_CLK_ENABLE();
hudakz 0:fa952828e34c 431 }
hudakz 0:fa952828e34c 432
hudakz 0:fa952828e34c 433 /* FSMC initialization function */
hudakz 0:fa952828e34c 434 static void MX_FSMC_Init(void)
hudakz 0:fa952828e34c 435 {
hudakz 0:fa952828e34c 436 /* USER CODE BEGIN FSMC_Init 0 */
hudakz 0:fa952828e34c 437
hudakz 0:fa952828e34c 438 /* USER CODE END FSMC_Init 0 */
hudakz 0:fa952828e34c 439 FSMC_NORSRAM_TimingTypeDef Timing = { 0 };
hudakz 0:fa952828e34c 440
hudakz 0:fa952828e34c 441 /* USER CODE BEGIN FSMC_Init 1 */
hudakz 0:fa952828e34c 442
hudakz 0:fa952828e34c 443 /* USER CODE END FSMC_Init 1 */
hudakz 0:fa952828e34c 444 /** Perform the SRAM1 memory initialization sequence
hudakz 0:fa952828e34c 445 */
hudakz 0:fa952828e34c 446 hsram1.Instance = FSMC_NORSRAM_DEVICE;
hudakz 0:fa952828e34c 447 hsram1.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
hudakz 0:fa952828e34c 448
hudakz 0:fa952828e34c 449 /* hsram1.Init */
hudakz 0:fa952828e34c 450 hsram1.Init.NSBank = FSMC_NORSRAM_BANK1;
hudakz 0:fa952828e34c 451 hsram1.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
hudakz 0:fa952828e34c 452 hsram1.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
hudakz 0:fa952828e34c 453 hsram1.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_8;
hudakz 0:fa952828e34c 454 hsram1.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
hudakz 0:fa952828e34c 455 hsram1.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
hudakz 0:fa952828e34c 456 hsram1.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
hudakz 0:fa952828e34c 457 hsram1.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
hudakz 0:fa952828e34c 458 hsram1.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
hudakz 0:fa952828e34c 459 hsram1.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
hudakz 0:fa952828e34c 460 hsram1.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;
hudakz 0:fa952828e34c 461 hsram1.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
hudakz 0:fa952828e34c 462 hsram1.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
hudakz 0:fa952828e34c 463 hsram1.Init.PageSize = FSMC_PAGE_SIZE_NONE;
hudakz 0:fa952828e34c 464
hudakz 0:fa952828e34c 465 /* Timing */
hudakz 0:fa952828e34c 466 Timing.AddressSetupTime = 0;
hudakz 0:fa952828e34c 467 Timing.AddressHoldTime = 0;
hudakz 0:fa952828e34c 468 Timing.DataSetupTime = 12;
hudakz 0:fa952828e34c 469 Timing.BusTurnAroundDuration = 0;
hudakz 0:fa952828e34c 470 Timing.CLKDivision = 16;
hudakz 0:fa952828e34c 471 Timing.DataLatency = 17;
hudakz 0:fa952828e34c 472 Timing.AccessMode = FSMC_ACCESS_MODE_A;
hudakz 0:fa952828e34c 473
hudakz 0:fa952828e34c 474 /* ExtTiming */
hudakz 0:fa952828e34c 475 if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK) {
hudakz 0:fa952828e34c 476 Error_Handler();
hudakz 0:fa952828e34c 477 }
hudakz 0:fa952828e34c 478
hudakz 0:fa952828e34c 479 /* USER CODE BEGIN FSMC_Init 2 */
hudakz 0:fa952828e34c 480 /* USER CODE END FSMC_Init 2 */
hudakz 0:fa952828e34c 481 }
hudakz 0:fa952828e34c 482
hudakz 0:fa952828e34c 483 /* USER CODE BEGIN 4 */
hudakz 0:fa952828e34c 484 /* USER CODE END 4 */
hudakz 0:fa952828e34c 485
hudakz 0:fa952828e34c 486 /**
hudakz 0:fa952828e34c 487 * @brief This function is executed in case of error occurrence.
hudakz 0:fa952828e34c 488 * @retval None
hudakz 0:fa952828e34c 489 */
hudakz 0:fa952828e34c 490 void Error_Handler(void)
hudakz 0:fa952828e34c 491 {
hudakz 0:fa952828e34c 492 /* USER CODE BEGIN Error_Handler_Debug */
hudakz 0:fa952828e34c 493
hudakz 0:fa952828e34c 494 printf("Error_Handler called\r\n");
hudakz 0:fa952828e34c 495 while (true) { }
hudakz 0:fa952828e34c 496
hudakz 0:fa952828e34c 497 /* User can add his own implementation to report the HAL error return state */
hudakz 0:fa952828e34c 498 /* USER CODE END Error_Handler_Debug */
hudakz 0:fa952828e34c 499 }
hudakz 0:fa952828e34c 500
hudakz 0:fa952828e34c 501 #ifdef USE_FULL_ASSERT
hudakz 0:fa952828e34c 502
hudakz 0:fa952828e34c 503 /**
hudakz 0:fa952828e34c 504 * @brief Reports the name of the source file and the source line number
hudakz 0:fa952828e34c 505 * where the assert_param error has occurred.
hudakz 0:fa952828e34c 506 * @param file: pointer to the source file name
hudakz 0:fa952828e34c 507 * @param line: assert_param error line source number
hudakz 0:fa952828e34c 508 * @retval None
hudakz 0:fa952828e34c 509 */
hudakz 0:fa952828e34c 510 void assert_failed(uint8_t* file, uint32_t line)
hudakz 0:fa952828e34c 511 {
hudakz 0:fa952828e34c 512 /* USER CODE BEGIN 6 */
hudakz 0:fa952828e34c 513
hudakz 0:fa952828e34c 514 /* User can add his own implementation to report the file name and line number,
hudakz 0:fa952828e34c 515 tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
hudakz 0:fa952828e34c 516 /* USER CODE END 6 */
hudakz 0:fa952828e34c 517 }
hudakz 0:fa952828e34c 518 #endif /* USE_FULL_ASSERT */
hudakz 0:fa952828e34c 519
hudakz 0:fa952828e34c 520 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/