Tester cz. 3

Co wyświetlić na początek

Nie komplikowałbym od razu grafiki. Najpierw prosty ekran statusowy:

STM32 NET TESTER

LINK     UP

IP       192.168.100.19
MASK     255.255.255.0
GW       192.168.100.1

DNS      192.168.100.1

DHCP     OK

PING GW  2 ms

BATTERY  4.08 V

Odświeżanie co 1 s wystarczy.


Biblioteka

Masz już sterownik do ST7789 czy dopiero będziesz podłączał?

Najpopularniejsze są:

  • własny sterownik HAL SPI
  • biblioteka od Controllerstech
  • biblioteka od Adafruit (po adaptacji)

Na F767 możesz spokojnie używać pełnego framebuffera:

240 × 320 × 2 bajty = 153 600 bajtów

Masz 512 kB SRAM, więc pamięci wystarczy.


Ja bym zrobił od razu prosty framework GUI

Np.:

void ScreenNetwork(void);
void ScreenPing(void);
void ScreenSystem(void);

a przyciskiem przełączasz ekrany.

Ekran 1

NETWORK

IP, MASK, GW, DNS

Ekran 2

LINK TEST

Ping bramy
Ping DNS
Ping Internet

Ekran 3

SYSTEM

MAC
Hostname
Uptime
Napięcie baterii


Co z baterią

F767 ma ADC 12-bit.

Przez dzielnik:

BAT+
 |
10k
 |
ADC
 |
10k
 |
GND

dla Li-Ion 4.2 V dostaniesz około 2.1 V na ADC.

Potem:

float battery =
    (adc * 3.3f / 4095.0f) * 2.0f;

Następny krok

Najpierw uruchomiłbym sam ST7789:

ST7789_Init();
ST7789_Fill_Color(BLACK);

ST7789_WriteString(
    10, 10,
    "STM32 NET TESTER",
    Font_11x18,
    WHITE,
    BLACK);

i sprawdził, czy masz już obraz.

Pytanie: jaki dokładnie moduł ST7789 masz? 240×320 z 6 pinami (VCC,GND,SCL,SDA,RES,DC,CS,BLK) czy jakiś inny wariant? I czy masz już działającą bibliotekę, czy startujemy od zera?


Polecam zacząć od własnego sterownika

To świetne ćwiczenie i nie jest trudne.

Potrzebujesz 3 funkcji:

void LCD_WriteCommand(uint8_t cmd);
void LCD_WriteData(uint8_t *data, uint16_t len);
void LCD_Reset(void);

Komenda

void LCD_WriteCommand(uint8_t cmd)
{
    HAL_GPIO_WritePin(LCD_DC_GPIO_Port,
                      LCD_DC_Pin,
                      GPIO_PIN_RESET);

    HAL_GPIO_WritePin(LCD_CS_GPIO_Port,
                      LCD_CS_Pin,
                      GPIO_PIN_RESET);

    HAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY);

    HAL_GPIO_WritePin(LCD_CS_GPIO_Port,
                      LCD_CS_Pin,
                      GPIO_PIN_SET);
}

Dane

void LCD_WriteData(uint8_t *data, uint16_t len)
{
    HAL_GPIO_WritePin(LCD_DC_GPIO_Port,
                      LCD_DC_Pin,
                      GPIO_PIN_SET);

    HAL_GPIO_WritePin(LCD_CS_GPIO_Port,
                      LCD_CS_Pin,
                      GPIO_PIN_RESET);

    HAL_SPI_Transmit(&hspi1, data, len, HAL_MAX_DELAY);

    HAL_GPIO_WritePin(LCD_CS_GPIO_Port,
                      LCD_CS_Pin,
                      GPIO_PIN_SET);
}

Pierwszy test

Reset:

void LCD_Reset(void)
{
    HAL_GPIO_WritePin(LCD_RST_GPIO_Port,
                      LCD_RST_Pin,
                      GPIO_PIN_RESET);

    HAL_Delay(10);

    HAL_GPIO_WritePin(LCD_RST_GPIO_Port,
                      LCD_RST_Pin,
                      GPIO_PIN_SET);

    HAL_Delay(120);
}

Inicjalizacja minimalna

LCD_Reset();

LCD_WriteCommand(0x11); // Sleep Out
HAL_Delay(120);

LCD_WriteCommand(0x29); // Display ON
HAL_Delay(20);

Potem ustawienie okna

0x2A  // Column Address Set
0x2B  // Row Address Set
0x2C  // Memory Write

i można już rysować piksele.


A swoją drogą, po dzisiejszych bojach z Ethernetem zrobiłeś już całkiem spory postęp:

✓ Ethernet
✓ DHCP
✓ Hostname
✓ Ping
✓ Router widzi urządzenie
□ ST7789
□ ADC bateria
□ Ping gateway
□ SNMP

Podłączenie do F767

Przykładowo:

ST7789      NUCLEO-F767ZI

VCC    -> 3V3
GND    -> GND

SCL    -> SPIx_SCK
SDA    -> SPIx_MOSI

CS     -> GPIO
DC     -> GPIO
RES    -> GPIO

BLK    -> 3V3

Na początek BLK podłącz po prostu do 3V3.

Później możesz dać PWM:

TIMx_CHy -> BLK

i regulować jasność.


SPI

Ja ustawiłbym od razu:

Mode: Master
Data Size: 8 bit
CPOL: Low
CPHA: 1 Edge
MSB First

i zegar np.:

10 MHz

Na start.

Potem można spokojnie podnieść do:

30-40 MHz

bo F767 i ST7789 dobrze to znoszą.