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:
Fri Sep 25 14:52:27 2020 +0000
Revision:
1:47c996032a9e
Parent:
0:fa952828e34c
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 1:47c996032a9e 33 /* include "Terminal6x8.h" */
hudakz 1:47c996032a9e 34
hudakz 0:fa952828e34c 35 #include "Arial43x48_digits.h"
hudakz 0:fa952828e34c 36 #include "pict.h"
hudakz 0:fa952828e34c 37 #include "pavement_48x34.h"
hudakz 0:fa952828e34c 38 #include "TFT_MIPI.h"
hudakz 0:fa952828e34c 39 #endif
hudakz 0:fa952828e34c 40 /* USER CODE END Includes */
hudakz 0:fa952828e34c 41
hudakz 0:fa952828e34c 42 /* Private typedef -----------------------------------------------------------*/
hudakz 0:fa952828e34c 43 /* USER CODE BEGIN PTD */
hudakz 0:fa952828e34c 44 /* USER CODE END PTD */
hudakz 0:fa952828e34c 45 /* Private define ------------------------------------------------------------*/
hudakz 0:fa952828e34c 46 /* USER CODE BEGIN PD */
hudakz 0:fa952828e34c 47 TFT_MIPI * myLCD;
hudakz 0:fa952828e34c 48 Timer tmr;
hudakz 0:fa952828e34c 49 int time1;
hudakz 0:fa952828e34c 50 int time2;
hudakz 1:47c996032a9e 51 unsigned short backgroundcolor = Black;
hudakz 1:47c996032a9e 52 unsigned short foregroundcolor = White;
hudakz 1:47c996032a9e 53 char orient = 0;
hudakz 0:fa952828e34c 54
hudakz 0:fa952828e34c 55 /* USER CODE END PD */
hudakz 0:fa952828e34c 56 /* Private macro -------------------------------------------------------------*/
hudakz 0:fa952828e34c 57 /* USER CODE BEGIN PM */
hudakz 0:fa952828e34c 58 /* USER CODE END PM */
hudakz 0:fa952828e34c 59 /* Private variables ---------------------------------------------------------*/
hudakz 1:47c996032a9e 60 //I2S_HandleTypeDef hi2s3;
hudakz 1:47c996032a9e 61 //PCD_HandleTypeDef hpcd_USB_OTG_FS;
hudakz 0:fa952828e34c 62 SRAM_HandleTypeDef hsram1;
hudakz 0:fa952828e34c 63
hudakz 0:fa952828e34c 64 /* USER CODE BEGIN PV */
hudakz 0:fa952828e34c 65 /* USER CODE END PV */
hudakz 0:fa952828e34c 66 /* Private function prototypes -----------------------------------------------*/
hudakz 1:47c996032a9e 67 static void SystemClock_Config(void);
hudakz 0:fa952828e34c 68 static void MX_GPIO_Init(void);
hudakz 0:fa952828e34c 69 static void MX_FSMC_Init(void);
hudakz 1:47c996032a9e 70 //static void MX_I2S3_Init(void);
hudakz 1:47c996032a9e 71 //static void MX_USB_OTG_FS_PCD_Init(void);
hudakz 0:fa952828e34c 72 /* USER CODE BEGIN PFP */
hudakz 0:fa952828e34c 73 /* USER CODE END PFP */
hudakz 0:fa952828e34c 74 /* Private user code ---------------------------------------------------------*/
hudakz 0:fa952828e34c 75
hudakz 0:fa952828e34c 76 /* USER CODE BEGIN 0 */
hudakz 0:fa952828e34c 77 uint16_t RGB(uint16_t r, uint16_t g, uint16_t b)
hudakz 0:fa952828e34c 78 {
hudakz 1:47c996032a9e 79 return(r * 65536) + (g * 256) + b;
hudakz 0:fa952828e34c 80 }
hudakz 0:fa952828e34c 81 /* USER CODE END 0 */
hudakz 0:fa952828e34c 82
hudakz 0:fa952828e34c 83 /**
hudakz 0:fa952828e34c 84 * @brief The application entry point.
hudakz 0:fa952828e34c 85 * @retval int
hudakz 0:fa952828e34c 86 */
hudakz 0:fa952828e34c 87 int main(void)
hudakz 0:fa952828e34c 88 {
hudakz 0:fa952828e34c 89 /* USER CODE BEGIN 1 */
hudakz 0:fa952828e34c 90
hudakz 0:fa952828e34c 91 /* USER CODE END 1 */
hudakz 0:fa952828e34c 92 /* MCU Configuration--------------------------------------------------------*/
hudakz 0:fa952828e34c 93 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
hudakz 0:fa952828e34c 94 // HAL_Init();
hudakz 0:fa952828e34c 95 /* USER CODE BEGIN Init */
hudakz 0:fa952828e34c 96 /* USER CODE END Init */
hudakz 0:fa952828e34c 97 /* Configure the system clock */
hudakz 0:fa952828e34c 98 // SystemClock_Config();
hudakz 0:fa952828e34c 99 /* USER CODE BEGIN SysInit */
hudakz 0:fa952828e34c 100 /* USER CODE END SysInit */
hudakz 0:fa952828e34c 101 /* Initialize all configured peripherals */
hudakz 0:fa952828e34c 102 MX_GPIO_Init();
hudakz 0:fa952828e34c 103 MX_FSMC_Init();
hudakz 1:47c996032a9e 104
hudakz 1:47c996032a9e 105 // MX_I2S3_Init();
hudakz 1:47c996032a9e 106 // MX_USB_OTG_FS_PCD_Init();
hudakz 0:fa952828e34c 107 /* USER CODE BEGIN 2 */
hudakz 1:47c996032a9e 108 // PinName dataPins[] = { PD_14, PD_15, PD_0, PD_1, PE_7, PE_8, PE_9, PE_10 }; // FSMC [D0:D7] -> LCD [D0:D7]
hudakz 0:fa952828e34c 109 // LCD_RST : PB_12 -> LCD_RST
hudakz 1:47c996032a9e 110 // FSMC_NE1: PD_7 -> LCD_CS
hudakz 0:fa952828e34c 111 // FSMC_A18: PD_13 -> LCD_RS
hudakz 0:fa952828e34c 112 // FSMC_NWE: PD_5 -> LCD_WR
hudakz 0:fa952828e34c 113 // FSMC_NOE: PD_4 -> LCD_RD
hudakz 0:fa952828e34c 114 // FSMC_D0 : PD_14 -> LCD_D0
hudakz 0:fa952828e34c 115 // FSMC_D1 : PD_15 -> LCD_D1
hudakz 0:fa952828e34c 116 // FSMC_D2 : PD_0 -> LCD_D2
hudakz 0:fa952828e34c 117 // FSMC_D3 : PD_1 -> LCD_D3
hudakz 0:fa952828e34c 118 // FSMC_D4 : PE_7 -> LCD_D4
hudakz 0:fa952828e34c 119 // FSMC_D5 : PE_8 -> LCD_D5
hudakz 0:fa952828e34c 120 // FSMC_D6 : PE_9 -> LCD_D6
hudakz 0:fa952828e34c 121 // FSMC_D7 : PE_10 -> LCD_D7
hudakz 1:47c996032a9e 122 //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 123 // CS , RST, DC, WR, RD
hudakz 1:47c996032a9e 124 myLCD = new TFT_MIPI(FSMC_8, PB_12, "myLCD", 320, 480); // Protocol, Pin->LCD_RST, name , LCDSIZE_X = 320, LCDSIZE_Y = 480
hudakz 1:47c996032a9e 125 myLCD->set_orientation(orient);
hudakz 1:47c996032a9e 126 myLCD->background(backgroundcolor); /* set background to black */
hudakz 1:47c996032a9e 127 myLCD->foreground(foregroundcolor); /* set chars to white */
hudakz 0:fa952828e34c 128 printf("\n\nSystem Core Clock = %.3f MHZ\r\n", (float)SystemCoreClock / 1000000);
hudakz 1:47c996032a9e 129 tmr.start();
hudakz 1:47c996032a9e 130
hudakz 0:fa952828e34c 131 printf("Target: %s\n", MBED_STRINGIFY(TARGET_NAME));
hudakz 0:fa952828e34c 132
hudakz 0:fa952828e34c 133 /* USER CODE END 2 */
hudakz 0:fa952828e34c 134 /* Infinite loop */
hudakz 0:fa952828e34c 135 /* USER CODE BEGIN WHILE */
hudakz 0:fa952828e34c 136 while (1) {
hudakz 1:47c996032a9e 137
hudakz 0:fa952828e34c 138 myLCD->set_orientation((++orient) % 4);
hudakz 1:47c996032a9e 139 //myLCD->set_orientation(1);
hudakz 0:fa952828e34c 140
hudakz 1:47c996032a9e 141 /*
hudakz 1:47c996032a9e 142 * myLCD->set_orientation(2);
hudakz 1:47c996032a9e 143 */
hudakz 1:47c996032a9e 144 myLCD->cls(); /* clear the screen */
hudakz 1:47c996032a9e 145 myLCD->locate(0, 30);
hudakz 1:47c996032a9e 146 myLCD->printf("Display ID: %.8X\r\n", myLCD->tftID);
hudakz 1:47c996032a9e 147 printf("Display ID: %.8X\r\n", myLCD->tftID);
hudakz 1:47c996032a9e 148
hudakz 1:47c996032a9e 149 /* mem write/read test */
hudakz 0:fa952828e34c 150 unsigned short readback;
hudakz 0:fa952828e34c 151 unsigned short colorstep = (0x10000 / myLCD->width());
hudakz 0:fa952828e34c 152
hudakz 0:fa952828e34c 153 for (unsigned short i = 0; i < myLCD->width(); i++) {
hudakz 1:47c996032a9e 154 myLCD->pixel(i, 0, i * colorstep); /* write line */
hudakz 0:fa952828e34c 155 }
hudakz 0:fa952828e34c 156
hudakz 0:fa952828e34c 157 bool readerror = false;
hudakz 0:fa952828e34c 158
hudakz 0:fa952828e34c 159 for (unsigned short i = 0; i < myLCD->width(); i++) {
hudakz 0:fa952828e34c 160
hudakz 0:fa952828e34c 161 /* verify line */
hudakz 0:fa952828e34c 162 readback = myLCD->pixelread(i, 0);
hudakz 0:fa952828e34c 163 if (readback != i * colorstep) {
hudakz 0:fa952828e34c 164 readerror = true;
hudakz 0:fa952828e34c 165 printf("pix %.4X readback %.4X\r\n", i * colorstep, readback);
hudakz 0:fa952828e34c 166 }
hudakz 0:fa952828e34c 167 }
hudakz 0:fa952828e34c 168
hudakz 0:fa952828e34c 169 myLCD->locate(0, 10);
hudakz 1:47c996032a9e 170 myLCD->printf("pixelread test %s\r\n", readerror ? "FAIL" : "PASS");
hudakz 0:fa952828e34c 171
hudakz 1:47c996032a9e 172 ThisThread::sleep_for(2000);
hudakz 0:fa952828e34c 173 myLCD->cls();
hudakz 1:47c996032a9e 174 //myLCD->set_font((unsigned char*)Arial12x12, 32, 127, false); /* variable width disabled */
hudakz 0:fa952828e34c 175 myLCD->set_font((unsigned char*)Arial12x12);
hudakz 0:fa952828e34c 176 myLCD->locate(0, 0);
hudakz 0:fa952828e34c 177 myLCD->printf("Display Test\r\nSome text just to see if auto carriage return works correctly");
hudakz 1:47c996032a9e 178 printf("Display Test \r\n");
hudakz 0:fa952828e34c 179
hudakz 1:47c996032a9e 180 ThisThread::sleep_for(2000);
hudakz 0:fa952828e34c 181 tmr.reset();
hudakz 0:fa952828e34c 182 myLCD->cls();
hudakz 0:fa952828e34c 183 time1 = tmr.read_us();
hudakz 1:47c996032a9e 184 myLCD->locate(2, 55);
hudakz 0:fa952828e34c 185 myLCD->printf("cls: %.3fms", (float)time1 / 1000);
hudakz 0:fa952828e34c 186 printf("cls: %.3fms\r\n", (float)time1 / 1000);
hudakz 0:fa952828e34c 187
hudakz 1:47c996032a9e 188 ThisThread::sleep_for(2000);
hudakz 0:fa952828e34c 189 myLCD->cls();
hudakz 0:fa952828e34c 190 tmr.reset();
hudakz 0:fa952828e34c 191
hudakz 1:47c996032a9e 192 //draw some graphics ;
hudakz 0:fa952828e34c 193 myLCD->set_font((unsigned char*)Arial24x23);
hudakz 0:fa952828e34c 194 myLCD->locate(10, 10);
hudakz 0:fa952828e34c 195 myLCD->printf("Test");
hudakz 1:47c996032a9e 196
hudakz 1:47c996032a9e 197 myLCD->line(0, 0, myLCD->width() - 1, 0, foregroundcolor);
hudakz 1:47c996032a9e 198 myLCD->line(0, 0, 0, myLCD->height() - 1, foregroundcolor);
hudakz 1:47c996032a9e 199 myLCD->line(0, 0, myLCD->width() - 1, myLCD->height() - 1, foregroundcolor);
hudakz 1:47c996032a9e 200
hudakz 1:47c996032a9e 201 myLCD->rect(10, 30, 50, 40, foregroundcolor);
hudakz 1:47c996032a9e 202 myLCD->fillrect(60, 30, 100, 40, foregroundcolor);
hudakz 1:47c996032a9e 203
hudakz 1:47c996032a9e 204 myLCD->circle(150, 32, 30, foregroundcolor);
hudakz 1:47c996032a9e 205 myLCD->fillcircle(140, 20, 10, foregroundcolor);
hudakz 0:fa952828e34c 206
hudakz 0:fa952828e34c 207 double s;
hudakz 0:fa952828e34c 208
hudakz 0:fa952828e34c 209 for (unsigned short i = 0; i < myLCD->width(); i++) {
hudakz 0:fa952828e34c 210 s = 10 * sin((long double)i / 10);
hudakz 1:47c996032a9e 211 myLCD->pixel(i, 40 + (int)s, foregroundcolor);
hudakz 0:fa952828e34c 212 }
hudakz 0:fa952828e34c 213
hudakz 0:fa952828e34c 214 time1 = tmr.read_us();
hudakz 1:47c996032a9e 215 myLCD->locate(2, 55);
hudakz 0:fa952828e34c 216 myLCD->set_font((unsigned char*)Arial12x12);
hudakz 0:fa952828e34c 217 myLCD->printf("plot: %.3fms", (float)time1 / 1000);
hudakz 0:fa952828e34c 218 printf("plot: %.3fms\r\n", (float)time1 / 1000);
hudakz 1:47c996032a9e 219
hudakz 1:47c996032a9e 220 ThisThread::sleep_for(2000);
hudakz 1:47c996032a9e 221 myLCD->cls();
hudakz 1:47c996032a9e 222 tmr.reset();
hudakz 0:fa952828e34c 223
hudakz 1:47c996032a9e 224 Bitmap_s pic = { 64, // XSize
hudakz 1:47c996032a9e 225 64, // YSize
hudakz 1:47c996032a9e 226 8, // Bytes in Line
hudakz 1:47c996032a9e 227 burp // Pointer to picture data
hudakz 0:fa952828e34c 228 };
hudakz 0:fa952828e34c 229
hudakz 1:47c996032a9e 230 myLCD->Bitmap_BW(pic, myLCD->width() - 64, 0);
hudakz 0:fa952828e34c 231 time1 = tmr.read_us();
hudakz 1:47c996032a9e 232 myLCD->locate(2, 55);
hudakz 0:fa952828e34c 233 myLCD->printf("bmp: %.3fms", (float)time1 / 1000);
hudakz 0:fa952828e34c 234 printf("bmp: %.3fms\r\n", (float)time1 / 1000);
hudakz 0:fa952828e34c 235
hudakz 1:47c996032a9e 236 ThisThread::sleep_for(2000);
hudakz 0:fa952828e34c 237 myLCD->cls();
hudakz 1:47c996032a9e 238 myLCD->set_font((unsigned char*)Arial43x48_digits, 46, 58, false); /* only numbers, variable-width disabled */
hudakz 0:fa952828e34c 239 tmr.reset();
hudakz 1:47c996032a9e 240
hudakz 0:fa952828e34c 241 myLCD->locate(0, 0);
hudakz 0:fa952828e34c 242 myLCD->printf("%d", 12345);
hudakz 0:fa952828e34c 243 time1 = tmr.read_us();
hudakz 1:47c996032a9e 244 myLCD->locate(2, 55);
hudakz 0:fa952828e34c 245 myLCD->set_font((unsigned char*)Arial12x12);
hudakz 1:47c996032a9e 246 myLCD->printf("Big Font: %.3fms", (float)time1 / 1000);
hudakz 1:47c996032a9e 247 printf("Big Font: %.3fms\r\n", (float)time1 / 1000);
hudakz 0:fa952828e34c 248
hudakz 1:47c996032a9e 249 ThisThread::sleep_for(2000);
hudakz 1:47c996032a9e 250 /* sparse pixels test */
hudakz 0:fa952828e34c 251 myLCD->cls();
hudakz 0:fa952828e34c 252 myLCD->FastWindow(false);
hudakz 0:fa952828e34c 253 tmr.reset();
hudakz 1:47c996032a9e 254
hudakz 0:fa952828e34c 255 for (unsigned int i = 0; i < 20000; i++) {
hudakz 0:fa952828e34c 256 myLCD->pixel((i + (i * 89)) % myLCD->width(), (i + (i * 61)) % myLCD->height(), White);
hudakz 0:fa952828e34c 257 }
hudakz 1:47c996032a9e 258 myLCD->copy_to_lcd();
hudakz 0:fa952828e34c 259 time1 = tmr.read_us();
hudakz 0:fa952828e34c 260
hudakz 1:47c996032a9e 261 ThisThread::sleep_for(2000);
hudakz 0:fa952828e34c 262 myLCD->cls();
hudakz 0:fa952828e34c 263 myLCD->FastWindow(true);
hudakz 0:fa952828e34c 264 tmr.reset();
hudakz 1:47c996032a9e 265
hudakz 0:fa952828e34c 266 for (unsigned int i = 0; i < 20000; i++) {
hudakz 0:fa952828e34c 267 myLCD->pixel((i + (i * 89)) % myLCD->width(), (i + (i * 61)) % myLCD->height(), White);
hudakz 0:fa952828e34c 268 }
hudakz 1:47c996032a9e 269 myLCD->copy_to_lcd();
hudakz 0:fa952828e34c 270 time2 = tmr.read_us();
hudakz 0:fa952828e34c 271
hudakz 0:fa952828e34c 272 myLCD->cls();
hudakz 1:47c996032a9e 273 myLCD->locate(2, 55);
hudakz 0:fa952828e34c 274 myLCD->printf("std:%.3fms fastw:%.3fms", (float)time1 / 1000, (float)time2 / 1000);
hudakz 0:fa952828e34c 275 printf("std: %.3fms fastw: %.3fms\r\n", (float)time1 / 1000, (float)time2 / 1000);
hudakz 0:fa952828e34c 276
hudakz 1:47c996032a9e 277 ThisThread::sleep_for(2000);
hudakz 1:47c996032a9e 278 /* scroll test, only for TFT */
hudakz 0:fa952828e34c 279 myLCD->cls();
hudakz 0:fa952828e34c 280 myLCD->set_font((unsigned char*)Arial24x23);
hudakz 0:fa952828e34c 281 myLCD->locate(2, 10);
hudakz 0:fa952828e34c 282 myLCD->printf("Scrolling");
hudakz 0:fa952828e34c 283 myLCD->rect(0, 0, myLCD->width() - 1, myLCD->height() - 1, White);
hudakz 0:fa952828e34c 284 myLCD->rect(1, 1, myLCD->width() - 2, myLCD->height() - 2, Blue);
hudakz 0:fa952828e34c 285 myLCD->setscrollarea(0, myLCD->sizeY());
hudakz 1:47c996032a9e 286 ThisThread::sleep_for(1000);
hudakz 0:fa952828e34c 287 myLCD->scroll(1); /* up 1 */
hudakz 1:47c996032a9e 288 ThisThread::sleep_for(1000);
hudakz 0:fa952828e34c 289 myLCD->scroll(0); /* center */
hudakz 1:47c996032a9e 290 ThisThread::sleep_for(1000);
hudakz 0:fa952828e34c 291 myLCD->scroll(myLCD->sizeY() - 1); /* down 1 */
hudakz 1:47c996032a9e 292 ThisThread::sleep_for(1000);
hudakz 0:fa952828e34c 293 myLCD->scroll(myLCD->sizeY()); /* same as 0, center */
hudakz 1:47c996032a9e 294 ThisThread::sleep_for(1000);
hudakz 0:fa952828e34c 295 myLCD->scroll(myLCD->sizeY() >> 1); /* half screen */
hudakz 1:47c996032a9e 296 ThisThread::sleep_for(1000);
hudakz 0:fa952828e34c 297 myLCD->scrollreset(); /* center */
hudakz 1:47c996032a9e 298 ThisThread::sleep_for(1000);
hudakz 0:fa952828e34c 299 for (unsigned short i = 1; i <= myLCD->sizeY(); i++) {
hudakz 0:fa952828e34c 300 myLCD->scroll(i);
hudakz 1:47c996032a9e 301 ThisThread::sleep_for(2);
hudakz 0:fa952828e34c 302 }
hudakz 0:fa952828e34c 303
hudakz 1:47c996032a9e 304 ThisThread::sleep_for(2000);
hudakz 1:47c996032a9e 305 /* color inversion */
hudakz 0:fa952828e34c 306 for (unsigned short i = 0; i <= 8; i++) {
hudakz 0:fa952828e34c 307 myLCD->invert(i & 1);
hudakz 1:47c996032a9e 308 ThisThread::sleep_for(200);
hudakz 0:fa952828e34c 309 }
hudakz 0:fa952828e34c 310
hudakz 1:47c996032a9e 311 ThisThread::sleep_for(2000);
hudakz 1:47c996032a9e 312 /* bmp 16bit test */
hudakz 0:fa952828e34c 313 myLCD->cls();
hudakz 0:fa952828e34c 314 tmr.reset();
hudakz 0:fa952828e34c 315 for (int y = 0; y < myLCD->height(); y += 34) {
hudakz 0:fa952828e34c 316 for (int x = 0; x < myLCD->width(); x += 48)
hudakz 0:fa952828e34c 317 myLCD->Bitmap(x, y, 48, 34, (unsigned char*)pavement_48x34);
hudakz 0:fa952828e34c 318 }
hudakz 0:fa952828e34c 319 time1 = tmr.read_us();
hudakz 1:47c996032a9e 320 myLCD->locate(2, 55);
hudakz 0:fa952828e34c 321 myLCD->set_font((unsigned char*)Arial12x12);
hudakz 1:47c996032a9e 322 myLCD->printf("Bmp speed: %.3fms", (float)time1 / 1000);
hudakz 1:47c996032a9e 323 printf("Bmp speed: %.3fms\r\n", (float)time1 / 1000);
hudakz 0:fa952828e34c 324
hudakz 1:47c996032a9e 325 ThisThread::sleep_for(2000);
hudakz 1:47c996032a9e 326 for (int i = 0; i < 3000; i++) {
hudakz 0:fa952828e34c 327 int x1 = rand() % myLCD->width();
hudakz 0:fa952828e34c 328 int y1 = rand() % myLCD->height();
hudakz 0:fa952828e34c 329
hudakz 0:fa952828e34c 330 int x2 = rand() % myLCD->width();
hudakz 0:fa952828e34c 331 int y2 = rand() % myLCD->height();
hudakz 0:fa952828e34c 332
hudakz 0:fa952828e34c 333 int r = rand() % 0xff;
hudakz 0:fa952828e34c 334 int g = rand() % 0xff;
hudakz 0:fa952828e34c 335 int b = rand() % 0xff;
hudakz 0:fa952828e34c 336
hudakz 0:fa952828e34c 337 myLCD->line(x1, y1, x2, y2, RGB(r, g, b));
hudakz 0:fa952828e34c 338 }
hudakz 0:fa952828e34c 339
hudakz 0:fa952828e34c 340 for (int i = 0; i < 3000; i++) {
hudakz 0:fa952828e34c 341 int x1 = rand() % myLCD->width();
hudakz 0:fa952828e34c 342 int y1 = rand() % myLCD->height();
hudakz 0:fa952828e34c 343
hudakz 0:fa952828e34c 344 int r = rand() % 0xff;
hudakz 0:fa952828e34c 345 int g = rand() % 0xff;
hudakz 0:fa952828e34c 346 int b = rand() % 0xff;
hudakz 0:fa952828e34c 347
hudakz 0:fa952828e34c 348 myLCD->locate(x1, y1);
hudakz 0:fa952828e34c 349 myLCD->foreground(RGB(r, g, b));
hudakz 0:fa952828e34c 350 myLCD->printf("Hello World");
hudakz 0:fa952828e34c 351 }
hudakz 0:fa952828e34c 352
hudakz 1:47c996032a9e 353 for (unsigned int i = 0; i < 200000; i++) {
hudakz 0:fa952828e34c 354 int x1 = rand() % myLCD->width();
hudakz 0:fa952828e34c 355 int y1 = rand() % myLCD->height();
hudakz 0:fa952828e34c 356
hudakz 0:fa952828e34c 357 int r = rand() % 0xff;
hudakz 0:fa952828e34c 358 int g = rand() % 0xff;
hudakz 0:fa952828e34c 359 int b = rand() % 0xff;
hudakz 0:fa952828e34c 360
hudakz 0:fa952828e34c 361 myLCD->pixel(x1, y1, RGB(r, g, b));
hudakz 0:fa952828e34c 362 }
hudakz 0:fa952828e34c 363
hudakz 1:47c996032a9e 364 for (int i = 0; i < 1000; i++) {
hudakz 0:fa952828e34c 365 int x1 = rand() % myLCD->width();
hudakz 0:fa952828e34c 366 int y1 = rand() % myLCD->height();
hudakz 0:fa952828e34c 367
hudakz 0:fa952828e34c 368 int x2 = rand() % myLCD->width();
hudakz 0:fa952828e34c 369 int y2 = rand() % myLCD->height();
hudakz 0:fa952828e34c 370
hudakz 0:fa952828e34c 371 int r = rand() % 0xff;
hudakz 0:fa952828e34c 372 int g = rand() % 0xff;
hudakz 0:fa952828e34c 373 int b = rand() % 0xff;
hudakz 0:fa952828e34c 374
hudakz 1:47c996032a9e 375 //myLCD->rect(x1, y1, x2, y2, RGB(r, g, b));
hudakz 0:fa952828e34c 376 myLCD->fillrect(x1, y1, x2, y2, RGB(r, g, b));
hudakz 0:fa952828e34c 377 }
hudakz 0:fa952828e34c 378
hudakz 1:47c996032a9e 379 // for (int i = 0; i < 1500; i++) {
hudakz 1:47c996032a9e 380 // int x1 = rand() % myLCD->width();
hudakz 1:47c996032a9e 381 // int y1 = rand() % myLCD->height();
hudakz 1:47c996032a9e 382
hudakz 1:47c996032a9e 383 // int rad = rand() % myLCD->height() / 2;
hudakz 1:47c996032a9e 384
hudakz 1:47c996032a9e 385 // int r = rand() % 0xff;
hudakz 1:47c996032a9e 386 // int g = rand() % 0xff;
hudakz 1:47c996032a9e 387 // int b = rand() % 0xff;
hudakz 1:47c996032a9e 388
hudakz 1:47c996032a9e 389 // myLCD->circle(x1, y1, rad, RGB(r, g, b));
hudakz 1:47c996032a9e 390 // myLCD->fillcircle(x1, y1, rad, RGB(r, g, b));
hudakz 1:47c996032a9e 391 // }
hudakz 1:47c996032a9e 392
hudakz 0:fa952828e34c 393 /* USER CODE END WHILE */
hudakz 0:fa952828e34c 394 /* USER CODE BEGIN 3 */
hudakz 0:fa952828e34c 395 }
hudakz 0:fa952828e34c 396
hudakz 0:fa952828e34c 397 /* USER CODE END 3 */
hudakz 0:fa952828e34c 398 }
hudakz 0:fa952828e34c 399
hudakz 0:fa952828e34c 400 /**
hudakz 0:fa952828e34c 401 * @brief System Clock Configuration
hudakz 0:fa952828e34c 402 * @retval None
hudakz 0:fa952828e34c 403 */
hudakz 1:47c996032a9e 404 void SystemClock_Config(void)
hudakz 1:47c996032a9e 405 {
hudakz 1:47c996032a9e 406 RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };
hudakz 1:47c996032a9e 407 RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };
hudakz 1:47c996032a9e 408 RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };
hudakz 1:47c996032a9e 409 /** Configure the main internal regulator output voltage
hudakz 1:47c996032a9e 410 */
hudakz 1:47c996032a9e 411
hudakz 1:47c996032a9e 412 __HAL_RCC_PWR_CLK_ENABLE();
hudakz 1:47c996032a9e 413 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
hudakz 0:fa952828e34c 414
hudakz 1:47c996032a9e 415 /** Initializes the CPU, AHB and APB busses clocks
hudakz 1:47c996032a9e 416 */
hudakz 1:47c996032a9e 417 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
hudakz 1:47c996032a9e 418 RCC_OscInitStruct.HSEState = RCC_HSE_ON;
hudakz 1:47c996032a9e 419 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
hudakz 1:47c996032a9e 420 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
hudakz 1:47c996032a9e 421 RCC_OscInitStruct.PLL.PLLM = 8;
hudakz 1:47c996032a9e 422 RCC_OscInitStruct.PLL.PLLN = 336;
hudakz 1:47c996032a9e 423 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
hudakz 1:47c996032a9e 424 RCC_OscInitStruct.PLL.PLLQ = 7;
hudakz 1:47c996032a9e 425 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
hudakz 1:47c996032a9e 426 Error_Handler();
hudakz 1:47c996032a9e 427 }
hudakz 0:fa952828e34c 428
hudakz 1:47c996032a9e 429 /** Initializes the CPU, AHB and APB busses clocks
hudakz 1:47c996032a9e 430 */
hudakz 1:47c996032a9e 431 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
hudakz 1:47c996032a9e 432 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
hudakz 1:47c996032a9e 433 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
hudakz 1:47c996032a9e 434 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
hudakz 1:47c996032a9e 435 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
hudakz 1:47c996032a9e 436 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {
hudakz 1:47c996032a9e 437 Error_Handler();
hudakz 1:47c996032a9e 438 }
hudakz 1:47c996032a9e 439
hudakz 1:47c996032a9e 440 // PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2S;
hudakz 1:47c996032a9e 441 // PeriphClkInitStruct.PLLI2S.PLLI2SN = 316;
hudakz 1:47c996032a9e 442 // PeriphClkInitStruct.PLLI2S.PLLI2SR = 7;
hudakz 1:47c996032a9e 443 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) {
hudakz 1:47c996032a9e 444 Error_Handler();
hudakz 1:47c996032a9e 445 }
hudakz 1:47c996032a9e 446 }
hudakz 1:47c996032a9e 447
hudakz 1:47c996032a9e 448 /**
hudakz 1:47c996032a9e 449 * @brief I2S3 Initialization Function
hudakz 1:47c996032a9e 450 * @param None
hudakz 1:47c996032a9e 451 * @retval None
hudakz 1:47c996032a9e 452 */
hudakz 1:47c996032a9e 453 //static void MX_I2S3_Init(void)
hudakz 1:47c996032a9e 454 //{
hudakz 1:47c996032a9e 455 // /* USER CODE BEGIN I2S3_Init 0 */
hudakz 1:47c996032a9e 456 // /* USER CODE END I2S3_Init 0 */
hudakz 1:47c996032a9e 457 // /* USER CODE BEGIN I2S3_Init 1 */
hudakz 1:47c996032a9e 458 // /* USER CODE END I2S3_Init 1 */
hudakz 1:47c996032a9e 459 // hi2s3.Instance = SPI3;
hudakz 1:47c996032a9e 460 // hi2s3.Init.Mode = I2S_MODE_MASTER_TX;
hudakz 1:47c996032a9e 461 // hi2s3.Init.Standard = I2S_STANDARD_PHILIPS;
hudakz 1:47c996032a9e 462 // hi2s3.Init.DataFormat = I2S_DATAFORMAT_16B;
hudakz 1:47c996032a9e 463 // hi2s3.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE;
hudakz 1:47c996032a9e 464 // hi2s3.Init.AudioFreq = I2S_AUDIOFREQ_44K;
hudakz 1:47c996032a9e 465 // hi2s3.Init.CPOL = I2S_CPOL_LOW;
hudakz 1:47c996032a9e 466 // hi2s3.Init.ClockSource = I2S_CLOCK_PLL;
hudakz 1:47c996032a9e 467 // hi2s3.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_DISABLE;
hudakz 1:47c996032a9e 468 // if (HAL_I2S_Init(&hi2s3) != HAL_OK) {
hudakz 0:fa952828e34c 469 // Error_Handler();
hudakz 0:fa952828e34c 470 // }
hudakz 1:47c996032a9e 471 // /* USER CODE BEGIN I2S3_Init 2 */
hudakz 1:47c996032a9e 472 // /* USER CODE END I2S3_Init 2 */
hudakz 1:47c996032a9e 473 //}
hudakz 1:47c996032a9e 474 /**
hudakz 1:47c996032a9e 475 * @brief USB_OTG_FS Initialization Function
hudakz 1:47c996032a9e 476 * @param None
hudakz 1:47c996032a9e 477 * @retval None
hudakz 1:47c996032a9e 478 */
hudakz 1:47c996032a9e 479 //static void MX_USB_OTG_FS_PCD_Init(void)
hudakz 1:47c996032a9e 480 //{
hudakz 1:47c996032a9e 481 // /* USER CODE BEGIN USB_OTG_FS_Init 0 */
hudakz 1:47c996032a9e 482 // /* USER CODE END USB_OTG_FS_Init 0 */
hudakz 1:47c996032a9e 483 // /* USER CODE BEGIN USB_OTG_FS_Init 1 */
hudakz 1:47c996032a9e 484 // /* USER CODE END USB_OTG_FS_Init 1 */
hudakz 1:47c996032a9e 485 // hpcd_USB_OTG_FS.Instance = USB_OTG_FS;
hudakz 1:47c996032a9e 486 // hpcd_USB_OTG_FS.Init.dev_endpoints = 4;
hudakz 1:47c996032a9e 487 // hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL;
hudakz 1:47c996032a9e 488 // hpcd_USB_OTG_FS.Init.dma_enable = DISABLE;
hudakz 1:47c996032a9e 489 // hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED;
hudakz 1:47c996032a9e 490 // hpcd_USB_OTG_FS.Init.Sof_enable = DISABLE;
hudakz 1:47c996032a9e 491 // hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE;
hudakz 1:47c996032a9e 492 // hpcd_USB_OTG_FS.Init.lpm_enable = DISABLE;
hudakz 1:47c996032a9e 493 // hpcd_USB_OTG_FS.Init.vbus_sensing_enable = DISABLE;
hudakz 1:47c996032a9e 494 // hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = DISABLE;
hudakz 1:47c996032a9e 495 // if (HAL_PCD_Init(&hpcd_USB_OTG_FS) != HAL_OK) {
hudakz 0:fa952828e34c 496 // Error_Handler();
hudakz 0:fa952828e34c 497 // }
hudakz 1:47c996032a9e 498 // /* USER CODE BEGIN USB_OTG_FS_Init 2 */
hudakz 1:47c996032a9e 499 // /* USER CODE END USB_OTG_FS_Init 2 */
hudakz 0:fa952828e34c 500 //}
hudakz 0:fa952828e34c 501
hudakz 0:fa952828e34c 502 /**
hudakz 0:fa952828e34c 503 * @brief GPIO Initialization Function
hudakz 0:fa952828e34c 504 * @param None
hudakz 0:fa952828e34c 505 * @retval None
hudakz 0:fa952828e34c 506 */
hudakz 0:fa952828e34c 507 static void MX_GPIO_Init(void)
hudakz 0:fa952828e34c 508 {
hudakz 0:fa952828e34c 509 /* GPIO Ports Clock Enable */
hudakz 0:fa952828e34c 510
hudakz 0:fa952828e34c 511 __HAL_RCC_GPIOB_CLK_ENABLE();
hudakz 0:fa952828e34c 512 __HAL_RCC_GPIOC_CLK_ENABLE();
hudakz 0:fa952828e34c 513 __HAL_RCC_GPIOD_CLK_ENABLE();
hudakz 0:fa952828e34c 514 __HAL_RCC_GPIOE_CLK_ENABLE();
hudakz 0:fa952828e34c 515 __HAL_RCC_GPIOH_CLK_ENABLE();
hudakz 0:fa952828e34c 516 }
hudakz 0:fa952828e34c 517
hudakz 0:fa952828e34c 518 /* FSMC initialization function */
hudakz 0:fa952828e34c 519 static void MX_FSMC_Init(void)
hudakz 0:fa952828e34c 520 {
hudakz 0:fa952828e34c 521 /* USER CODE BEGIN FSMC_Init 0 */
hudakz 0:fa952828e34c 522
hudakz 0:fa952828e34c 523 /* USER CODE END FSMC_Init 0 */
hudakz 0:fa952828e34c 524 FSMC_NORSRAM_TimingTypeDef Timing = { 0 };
hudakz 0:fa952828e34c 525
hudakz 0:fa952828e34c 526 /* USER CODE BEGIN FSMC_Init 1 */
hudakz 0:fa952828e34c 527
hudakz 0:fa952828e34c 528 /* USER CODE END FSMC_Init 1 */
hudakz 0:fa952828e34c 529 /** Perform the SRAM1 memory initialization sequence
hudakz 0:fa952828e34c 530 */
hudakz 0:fa952828e34c 531 hsram1.Instance = FSMC_NORSRAM_DEVICE;
hudakz 0:fa952828e34c 532 hsram1.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
hudakz 0:fa952828e34c 533
hudakz 0:fa952828e34c 534 /* hsram1.Init */
hudakz 0:fa952828e34c 535 hsram1.Init.NSBank = FSMC_NORSRAM_BANK1;
hudakz 0:fa952828e34c 536 hsram1.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
hudakz 0:fa952828e34c 537 hsram1.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
hudakz 0:fa952828e34c 538 hsram1.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_8;
hudakz 0:fa952828e34c 539 hsram1.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
hudakz 0:fa952828e34c 540 hsram1.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
hudakz 0:fa952828e34c 541 hsram1.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
hudakz 0:fa952828e34c 542 hsram1.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
hudakz 0:fa952828e34c 543 hsram1.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
hudakz 0:fa952828e34c 544 hsram1.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
hudakz 0:fa952828e34c 545 hsram1.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;
hudakz 0:fa952828e34c 546 hsram1.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
hudakz 0:fa952828e34c 547 hsram1.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
hudakz 0:fa952828e34c 548 hsram1.Init.PageSize = FSMC_PAGE_SIZE_NONE;
hudakz 0:fa952828e34c 549
hudakz 0:fa952828e34c 550 /* Timing */
hudakz 0:fa952828e34c 551 Timing.AddressSetupTime = 0;
hudakz 0:fa952828e34c 552 Timing.AddressHoldTime = 0;
hudakz 0:fa952828e34c 553 Timing.DataSetupTime = 12;
hudakz 0:fa952828e34c 554 Timing.BusTurnAroundDuration = 0;
hudakz 0:fa952828e34c 555 Timing.CLKDivision = 16;
hudakz 0:fa952828e34c 556 Timing.DataLatency = 17;
hudakz 0:fa952828e34c 557 Timing.AccessMode = FSMC_ACCESS_MODE_A;
hudakz 0:fa952828e34c 558
hudakz 0:fa952828e34c 559 /* ExtTiming */
hudakz 0:fa952828e34c 560 if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK) {
hudakz 0:fa952828e34c 561 Error_Handler();
hudakz 0:fa952828e34c 562 }
hudakz 0:fa952828e34c 563
hudakz 0:fa952828e34c 564 /* USER CODE BEGIN FSMC_Init 2 */
hudakz 0:fa952828e34c 565 /* USER CODE END FSMC_Init 2 */
hudakz 0:fa952828e34c 566 }
hudakz 0:fa952828e34c 567
hudakz 0:fa952828e34c 568 /* USER CODE BEGIN 4 */
hudakz 0:fa952828e34c 569 /* USER CODE END 4 */
hudakz 0:fa952828e34c 570
hudakz 0:fa952828e34c 571 /**
hudakz 0:fa952828e34c 572 * @brief This function is executed in case of error occurrence.
hudakz 0:fa952828e34c 573 * @retval None
hudakz 0:fa952828e34c 574 */
hudakz 0:fa952828e34c 575 void Error_Handler(void)
hudakz 0:fa952828e34c 576 {
hudakz 0:fa952828e34c 577 /* USER CODE BEGIN Error_Handler_Debug */
hudakz 0:fa952828e34c 578
hudakz 0:fa952828e34c 579 printf("Error_Handler called\r\n");
hudakz 0:fa952828e34c 580 while (true) { }
hudakz 0:fa952828e34c 581
hudakz 0:fa952828e34c 582 /* User can add his own implementation to report the HAL error return state */
hudakz 0:fa952828e34c 583 /* USER CODE END Error_Handler_Debug */
hudakz 0:fa952828e34c 584 }
hudakz 0:fa952828e34c 585
hudakz 0:fa952828e34c 586 #ifdef USE_FULL_ASSERT
hudakz 0:fa952828e34c 587
hudakz 0:fa952828e34c 588 /**
hudakz 0:fa952828e34c 589 * @brief Reports the name of the source file and the source line number
hudakz 0:fa952828e34c 590 * where the assert_param error has occurred.
hudakz 0:fa952828e34c 591 * @param file: pointer to the source file name
hudakz 0:fa952828e34c 592 * @param line: assert_param error line source number
hudakz 0:fa952828e34c 593 * @retval None
hudakz 0:fa952828e34c 594 */
hudakz 0:fa952828e34c 595 void assert_failed(uint8_t* file, uint32_t line)
hudakz 0:fa952828e34c 596 {
hudakz 0:fa952828e34c 597 /* USER CODE BEGIN 6 */
hudakz 0:fa952828e34c 598
hudakz 0:fa952828e34c 599 /* User can add his own implementation to report the file name and line number,
hudakz 0:fa952828e34c 600 tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
hudakz 0:fa952828e34c 601 /* USER CODE END 6 */
hudakz 0:fa952828e34c 602 }
hudakz 0:fa952828e34c 603 #endif /* USE_FULL_ASSERT */
hudakz 0:fa952828e34c 604
hudakz 0:fa952828e34c 605 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/