MKS_Robin_Nano_V1.1(1.2) и дисплей LCD-TFT35-ROBIN

Пытаюсь от 3d принтера flying bear ghost 5 запустить штатные материнскую плату и дисплей с помощью Arduino Ide. На плате стоит МК STM32F103VET6, на дисплее ILI9488, соединение параллельное FSMC 16 линий.
Плату можно использовать для своих проектов. На плате есть все, кто имеет 3д принтер , знает: 4 выхода с мосфетами, 5 выходов для шаговиков с гнёздами для драйверов, входа для датчиков и тп, гнездо для Wi-Fi модуля, слот для sd карты и тп. Прошивается просто с помощью stlink, разъёмы для него есть.
Никто не не пробовал запускать данную плату с дисплеем через Ардуино иде?
Код мой компилируется, загружается, только нет изображения, светодиоды дисплея только горят, пытался вывести цветные полосы.
`
/* Подключение:
ILI9488 STM32 (FSMC)
D0-D15 PD14, PD15, PD0, PD1, PE7-PE15, PD8-PD10
RS (A0) PD11 (FSMC_A0)
WR PD5 (FSMC_NWE)
RD PD4 (FSMC_NOE)
RESET PC6
LED PWM (PD13)
*/

#include <Arduino.h>

// Настройка адресов FSMC для ILI9488
#define FSMC_BASE ((uint32_t)0x60000000) // Bank1 NOR/PSRAM
#define CMD_ADDRESS (FSMC_BASE) // Команда (RS=0)
#define DATA_ADDRESS (FSMC_BASE | 0x00008000) // Данные (RS=1, A16=1)
#define TFT_RST_PIN PC6
#define TFT_BL_PIN PD13

// Цвета в формате RGB565
#define RGB565(r,g,b) ((((r) & 0xF8) << 8) | (((g) & 0xFC) << 3) | ((b) >> 3))
#define ILI9486_BLACK RGB565(0, 0, 0)
#define ILI9486_WHITE RGB565(255, 255, 255)
#define ILI9486_RED RGB565(255, 0, 0)
#define ILI9486_GREEN RGB565(0, 255, 0)
#define ILI9486_BLUE RGB565(0, 0, 255)

void init_FSMC();
void init_ILI9488();
void write_command(uint8_t cmd);
void write_data(uint16_t data);
void set_window(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);

void setup() {
pinMode(TFT_RST_PIN, OUTPUT);

// Сброс дисплея
digitalWrite(TFT_RST_PIN, LOW);
delay(100);
digitalWrite(TFT_RST_PIN, HIGH);
delay(100);

// Инициализация FSMC и дисплея
init_FSMC();
init_ILI9488();

// Включение подсветки
pinMode(TFT_BL_PIN, OUTPUT);
digitalWrite(TFT_BL_PIN, HIGH);

set_window(0, 0, 479, 319);
for (uint16_t y = 0; y < 320; y++) {
for (uint16_t x = 0; x < 480; x++) {
uint16_t color;
if (x < 160) color = RGB565(255, 0, 0); // Красный
else if (x < 320) color = RGB565(0, 255, 0); // Зеленый
else color = RGB565(0, 0, 255); // Синий
write_data(color);
}
}

}

void loop() {
}

// Инициализация FSMC
void init_FSMC() {
// Включаем тактирование FSMC и GPIO
RCC->AHBENR |= RCC_AHBENR_FSMCEN;
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPDEN | RCC_APB2ENR_IOPEEN | RCC_APB2ENR_IOPCEN;

// Настройка GPIO для данных (D0-D15)
// PD0, PD1, PD8-D10, PD14-D15, PE7-PE15
GPIOD->CRL = 0x44444444; // PD0, PD1 как альтернативная функция
GPIOD->CRH = 0xBBBB444B; // PD8-PD10, PD14-PD15 как альтернативная функция
GPIOE->CRH = 0xBBBBBBBB; // PE8-PE15 как альтернативная функция
GPIOE->CRL = 0xB0000000; // PE7 как альтернативная функция

// Управляющие сигналы
// PD4: NOE (RD), PD5: NWE (WR), PD7: NE4 (CS)
GPIOD->CRL &= ~(GPIO_CRL_MODE4 | GPIO_CRL_MODE5 | GPIO_CRL_MODE7);
GPIOD->CRL |= (0x0B << (4 * 4)) | (0x0B << (5 * 4)) | (0x0B << (7 * 4)); // AF push-pull 50MHz

// Адресная линия A0 (RS) - PD11
GPIOD->CRH &= ~GPIO_CRH_CNF11;
GPIOD->CRH |= GPIO_CRH_CNF11_1; // AF push-pull
GPIOD->CRH |= GPIO_CRH_MODE11; // 50MHz

// Настройка FSMC Bank1 для NE4 (PD7)
FSMC_Bank1->BTCR[4] = 0x00001091; // FSMC_BCR1_MBKEN | FSMC_BCR1_MWID_0 | FSMC_BCR1_WREN | FSMC_BCR1_EXTMOD
FSMC_Bank1->BTCR[5] = 0x00100B00; // FSMC_BTR1_ADDSET(1) | FSMC_BTR1_DATAST(11)
FSMC_Bank1E->BWTR[4] = 0x00100B00; // Extended timing
}

// Инициализация дисплея ILI9488
void init_ILI9488() {
delay(120); // Ждем после сброса

//----- Gamma Correction -----
write_command(0xE0); // Positive Gamma
write_data(0x00);
write_data(0x03);
write_data(0x09);
write_data(0x08);
write_data(0x16);
write_data(0x0A);
write_data(0x3F);
write_data(0x78);
write_data(0x4C);
write_data(0x09);
write_data(0x0A);
write_data(0x08);
write_data(0x16);
write_data(0x1A);
write_data(0x0F);

write_command(0xE1); // Negative Gamma
write_data(0x00);
write_data(0x16);
write_data(0x19);
write_data(0x03);
write_data(0x0F);
write_data(0x05);
write_data(0x32);
write_data(0x45);
write_data(0x46);
write_data(0x04);
write_data(0x0E);
write_data(0x0D);
write_data(0x35);
write_data(0x37);
write_data(0x0F);

//----- Power Control -----
write_command(0xC0); // Power Control 1
write_data(0x17); // Vreg1out
write_data(0x15); // Vreg2out

write_command(0xC1); // Power Control 2
write_data(0x41); // VGH/VGL

write_command(0xC5); // VCOM Control
write_data(0x00);
write_data(0x12); // VCOM
write_data(0x80);

//----- Display Settings -----
write_command(0x36); // Memory Access Control
write_data(0x48); // BGR order, landscape (попробуйте 0xE8 если не работает)

write_command(0x3A); // Pixel Format
write_data(0x55); // 16-bit RGB565

write_command(0xB0); // Interface Mode
write_data(0x00); // SDO not used

write_command(0xB1); // Frame Rate
write_data(0xA0); // 60Hz

write_command(0xB4); // Display Inversion
write_data(0x02); // 2-dot inversion

write_command(0xB6); // Display Function
write_data(0x02); // Scan direction: top to bottom
write_data(0x02); // 320 lines
write_data(0x3B); //

write_command(0xE9); // Set Image Function
write_data(0x00); // Disable 24-bit data

//----- Exit Sleep Mode -----
write_command(0x11); // Sleep Out
delay(150); // Обязательная задержка!

//----- Display On -----
write_command(0x29); // Display On
delay(25);
}
// Запись команды
void write_command(uint8_t cmd) {
(volatile uint16_t)CMD_ADDRESS = cmd;
}
// Запись данных
void write_data(uint16_t data) {
(volatile uint16_t)DATA_ADDRESS = data;
}

// Установка окна
void set_window(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
write_command(0x2A);
write_data(x0 >> 8);
write_data(x0 & 0xFF);
write_data(x1 >> 8);
write_data(x1 & 0xFF);

write_command(0x2B);
write_data(y0 >> 8);
write_data(y0 & 0xFF);
write_data(y1 >> 8);
write_data(y1 & 0xFF);

write_command(0x2C);
}
`

Вопрос не имеет никакого отношения к Ардуино ИДЕ. У вас и код вряд ли можно назвать ардуиновским - чистые СТМ32 регистры.

То что, у вас код компилируется - говорит о том, что синтаксических ошибок в нем нет. А то что дисплей не зажигается - скорее всего потому, что ининицализируете вы его неправильно.
Откуда вы взяли последовательность байт, что в функции void init_ILI9488() ? - она точно от вашего дисплея?

Возьми исходник прошивки. Там есть процедура инициализации дисплея.

Последовательность байт, что в функции void init_ILI9488() подправил, взял из прошивки Марлин, там эта плата с этим дисплеем запускается. Но у меня нет.

#include <Arduino.h>
#include <stm32f1xx.h>

// Адреса FSMC
#define LCD_CMD      (*((volatile uint16_t*)0x60000000))  // RS=0
#define LCD_DATA     (*((volatile uint16_t*)0x60020000))  // RS=1 (A16)

// Управляющие пины
#define LCD_RESET_PIN PC6
#define LCD_LED_PIN   PD13

// Константы FSMC для STM32F1
#define FSMC_BCR_MBKEN  (1 << 0)
#define FSMC_BCR_MWID_16BITS  (0x1 << 4)
#define FSMC_BCR_WREN   (1 << 12)
//#define FSMC_BCR_MTYP_SRAM  (0x0 << 2)
//#define FSMC_BCR_MTYP_NOR_FLASH (0x2 << 2)

// Инициализация FSMC
void initFSMC() {
  // Включение тактирования
  RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN |
                  RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDEN |
                  RCC_APB2ENR_IOPEEN | RCC_APB2ENR_AFIOEN;
  RCC->AHBENR  |= RCC_AHBENR_FSMCEN;

  // Конфигурация портов в режиме альтернативной функции Push-Pull
  // PD0,PD1,PD4,PD5,PD7,PD8,PD9,PD10,PD11,PD14,PD15
  GPIOD->CRL = 0xBB44BB44; 
  GPIOD->CRH = 0xBBBBBBBB;
  
  // PE7-PE15
  GPIOE->CRL = 0x44BBBBBB; 
  GPIOE->CRH = 0xBBBBBBBB;

  // Настройка FSMC Bank1
//  FSMC_Bank1->BTCR[0] = FSMC_BCR_MBKEN | FSMC_BCR_MWID_16BITS | FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM;
//  FSMC_Bank1->BTCR[0] = FSMC_BCR_MBKEN | FSMC_BCR_MWID_16BITS | FSMC_BCR_WREN | FSMC_BCR_MTYP_NOR_FLASH;
    FSMC_Bank1->BTCR[0] = FSMC_BCR_MBKEN | FSMC_BCR_MWID_16BITS | FSMC_BCR_WREN;
    FSMC_Bank1->BTCR[1] = (15 << 8) | (15);  // ADDSET=15, DATAST=15
}

// Запись команды
void LCD_WriteCmd(uint16_t cmd) {
  LCD_CMD = cmd;
}

// Запись данных
void LCD_WriteData(uint16_t data) {
  LCD_DATA = data;
}

// Сброс дисплея
void LCD_Reset() {
  digitalWrite(LCD_RESET_PIN, LOW);
  delay(5);
  digitalWrite(LCD_RESET_PIN, HIGH);
  delay(150);
}

// Инициализация дисплея ILI9488
void LCD_Init() {
  pinMode(LCD_RESET_PIN, OUTPUT);
  pinMode(LCD_LED_PIN, OUTPUT);
  digitalWrite(LCD_LED_PIN, HIGH);  // Включить подсветку
  
  LCD_Reset();
  delay(120);
  
 // LCD_WriteCmd(0x01); // Software Reset
//  delay(120);
  
  LCD_WriteCmd(0x11);  // Exit Sleep
  delay(20);

  LCD_WriteCmd(0x36);  // Memory Access Control
  LCD_WriteData(0xE8); // Orientation: BGR, MX, MV, MY 

  LCD_WriteCmd(0x3A);  // Interface Pixel Format
  LCD_WriteData(0x55); // 16 bits per pixel
  

  
 // LCD_WriteCmd(0xB0);  // Interface Mode Control
 // LCD_WriteData(0x00); 
  
  LCD_WriteCmd(0xB1);  // Frame Rate Control
  LCD_WriteData(0xA0); 
  
  LCD_WriteCmd(0xB4);  // Display Inversion Control
  LCD_WriteData(0x02); 
  
  LCD_WriteCmd(0xB6);  // Display Function Control
  LCD_WriteData(0x02); 
  LCD_WriteData(0x02); 
 
  LCD_WriteCmd(0xC0);  // Power Control 1
  LCD_WriteData(0x15); 
  LCD_WriteData(0x17);  
  
  LCD_WriteCmd(0xC1);  // Power Control 2
  LCD_WriteData(0x41); 
  
  LCD_WriteCmd(0xC5);  // VCOM Control
  LCD_WriteData(0x00); 
  LCD_WriteData(0x12);
  LCD_WriteData(0x80);  

  LCD_WriteCmd(0xE9);  // Set Image Function
  LCD_WriteData(0x00);
  
  LCD_WriteCmd(0xF7);  // Adjust Control 3
  LCD_WriteData(0xA9); 
  LCD_WriteData(0x51);
  LCD_WriteData(0x2C);    
  LCD_WriteData(0x82); 
  
  LCD_WriteCmd(0xE0);  // Positive Gamma Correction
  LCD_WriteData(0x00); 
  LCD_WriteData(0x03); 
  LCD_WriteData(0x09); 
  LCD_WriteData(0x08); 
  LCD_WriteData(0x16); 
  LCD_WriteData(0x0A); 
  LCD_WriteData(0x3F); 
  LCD_WriteData(0x78); 
  LCD_WriteData(0x4C); 
  LCD_WriteData(0x09); 
  LCD_WriteData(0x0A); 
  LCD_WriteData(0x08); 
  LCD_WriteData(0x16); 
  LCD_WriteData(0x1A);
  LCD_WriteData(0x0F);
  
  LCD_WriteCmd(0xE1);  // Negative Gamma Correction
  LCD_WriteData(0x00); 
  LCD_WriteData(0x16); 
  LCD_WriteData(0x19); 
  LCD_WriteData(0x03); 
  LCD_WriteData(0x0F); 
  LCD_WriteData(0x05); 
  LCD_WriteData(0x32); 
  LCD_WriteData(0x45); 
  LCD_WriteData(0x46); 
  LCD_WriteData(0x04); 
  LCD_WriteData(0x0E); 
  LCD_WriteData(0x0D); 
  LCD_WriteData(0x35);
  LCD_WriteData(0x37); 
  LCD_WriteData(0x0F);
  
  
  LCD_WriteCmd(0x21);  // Display Inversion On
  LCD_WriteCmd(0x13); // Normal Display Mode ON   
  LCD_WriteCmd(0x29);  // Display On
  delay(25);
}

// Установка окна вывода
void LCD_SetWindow(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
  LCD_WriteCmd(0x2A);  // Column Address Set
  LCD_WriteData(x1 >> 8);
  LCD_WriteData(x1 & 0xFF);
  LCD_WriteData(x2 >> 8);
  LCD_WriteData(x2 & 0xFF);
  
  LCD_WriteCmd(0x2B);  // Page Address Set
  LCD_WriteData(y1 >> 8);
  LCD_WriteData(y1 & 0xFF);
  LCD_WriteData(y2 >> 8);
  LCD_WriteData(y2 & 0xFF);
  
  LCD_WriteCmd(0x2C);  // Memory Write
}

// Заливка экрана цветом
void LCD_FillScreen(uint16_t color) {
  LCD_SetWindow(0, 0, 319, 479);
  for(uint32_t i = 0; i < 320*480; i++) {
    LCD_WriteData(color);
  }
}


void setup() {
  initFSMC();
  LCD_Init();
  LCD_FillScreen(0x0000);  // Черный фон
}

void loop() {
  // Основные цвета
  LCD_FillScreen(0xF800);  // Красный
  delay(500);
  LCD_FillScreen(0x07E0);  // Зеленый
  delay(500);
  LCD_FillScreen(0x001F);  // Синий
  delay(500);
 }

Исходника нет, сам пытаюсь написать.

Инициализацию можно посмотреть в TFT_eSPI


// This is the command sequence that initialises the ILI9488 driver
//
// This setup information uses simple 8-bit SPI writecommand() and writedata() functions
//
// See ST7735_Setup.h file for an alternative format


// Configure ILI9488 display

    writecommand(0xE0); // Positive Gamma Control
    writedata(0x00);
    writedata(0x03);
    writedata(0x09);
    writedata(0x08);
    writedata(0x16);
    writedata(0x0A);
    writedata(0x3F);
    writedata(0x78);
    writedata(0x4C);
    writedata(0x09);
    writedata(0x0A);
    writedata(0x08);
    writedata(0x16);
    writedata(0x1A);
    writedata(0x0F);

    writecommand(0XE1); // Negative Gamma Control
    writedata(0x00);
    writedata(0x16);
    writedata(0x19);
    writedata(0x03);
    writedata(0x0F);
    writedata(0x05);
    writedata(0x32);
    writedata(0x45);
    writedata(0x46);
    writedata(0x04);
    writedata(0x0E);
    writedata(0x0D);
    writedata(0x35);
    writedata(0x37);
    writedata(0x0F);

    writecommand(0XC0); // Power Control 1
    writedata(0x17);
    writedata(0x15);

    writecommand(0xC1); // Power Control 2
    writedata(0x41);

    writecommand(0xC5); // VCOM Control
    writedata(0x00);
    writedata(0x12);
    writedata(0x80);

    writecommand(TFT_MADCTL); // Memory Access Control
    writedata(0x48);          // MX, BGR

    writecommand(0x3A); // Pixel Interface Format
#if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE)
    writedata(0x55);  // 16-bit colour for parallel
#else
    writedata(0x66);  // 18-bit colour for SPI
#endif

    writecommand(0xB0); // Interface Mode Control
    writedata(0x00);

    writecommand(0xB1); // Frame Rate Control
    writedata(0xA0);

    writecommand(0xB4); // Display Inversion Control
    writedata(0x02);

    writecommand(0xB6); // Display Function Control
    writedata(0x02);
    writedata(0x02);
    writedata(0x3B);

    writecommand(0xB7); // Entry Mode Set
    writedata(0xC6);

    writecommand(0xF7); // Adjust Control 3
    writedata(0xA9);
    writedata(0x51);
    writedata(0x2C);
    writedata(0x82);

    writecommand(TFT_SLPOUT);  //Exit Sleep
delay(120);

    writecommand(TFT_DISPON);  //Display on
delay(25);

// End of ILI9488 display configuration

Спасибо! Я, думаю, с инициализацией дисплея нормально, инициализация FSMC не получается. Проверю эту тоже.
Ещё переписал обращение к регистрам с помощью Ардуино функций, а то замечание делали):
// Настройка конкретных пинов порта D
const uint8_t portD_pins = {PD0, PD1, PD4, PD5, PD7, PD8, PD9, PD10, PD11, PD14, PD15};
for (uint8_t i = 0; i < sizeof(portD_pins)/sizeof(portD_pins[0]); i++) {
pinMode(portD_pins[i], OUTPUT_AF_PP);
}

// Настройка пинов порта E (PE7-PE15)
for (uint8_t i = PE7; i <= PE15; i++) {
pinMode(i, OUTPUT_AF_PP);
}

Посмотри урок STM Урок 37. Дисплей TFT 240×320 8bit. Часть 1 | Программирование микроконтроллеров
Описано как настраивать через куб FSMC. Подпрограмму куба настройки FSMC можно без переделок использовать в ардуино. Если используешь ядро STM.

Спасибо, попробую.

Запустил всё-таки эту плату с дисплеем fsmc 16bit. Помогла библиотека gx_tft.