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ą.