From e6fc56a2030374116aa8ffcca55cbfa35d6ea545 Mon Sep 17 00:00:00 2001 From: Stanislav N Mikhailov Date: Fri, 27 Dec 2024 14:39:43 +0300 Subject: [PATCH] RGBView --- .gitignore | 3 + CMakeLists.txt | 19 ++++++ Thread.c | 117 ++++++++++++++++++++++++++++++++++ Thread.h | 23 +++++++ main.c | 69 ++++++++++++++++++++ main.h | 3 + Диаграмма без названия.drawio | 44 +++++++++++++ 7 files changed, 278 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 Thread.c create mode 100644 Thread.h create mode 100644 main.c create mode 100644 main.h create mode 100644 Диаграмма без названия.drawio diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4c69388 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +build/* +.vscode/* + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..6fd306a --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 3.18.4) +include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake) + +project(circle C CXX ASM) +set(CMAKE_C_STANDARD 11) +set(CMAKE_CXX_STANDARD 17) + +pico_sdk_init() + +add_executable(${PROJECT_NAME} main.c Thread.c) + +target_link_libraries(${PROJECT_NAME} + pico_stdlib + hardware_spi + hardware_dma + pico_multicore +) + +pico_add_extra_outputs(${PROJECT_NAME}) diff --git a/Thread.c b/Thread.c new file mode 100644 index 0000000..45e8512 --- /dev/null +++ b/Thread.c @@ -0,0 +1,117 @@ +#include "Thread.h" +#include "pico/stdlib.h" +#include "hardware/spi.h" +#include "pico/multicore.h" + +uint16_t frame_buffer[WIDTH * HEIGHT]; // Буфер для экрана + +//uint16_t frame_buffer1[WIDTH * HEIGHT]; // Буфер для экрана1 + +void coreEntry(){ + st7789_init(); // Initialize SPI and GPIO + gpio_put(PIN_BL, 1); // Подсветка + multicore_fifo_push_blocking(0); //Экран 0 свободен + //multicore_fifo_push_blocking(1); //Экран 1 свободен + + while (true) + { + uint32_t data = multicore_fifo_pop_blocking(); + if (data==0) + { + st7789_send_framebuffer(frame_buffer); //Рисую экран 0 + multicore_fifo_push_blocking(0); //Экран 0 свободен + } + /*else if (data==1) + { + st7789_send_framebuffer(frame_buffer1); // Рисую первый экран + multicore_fifo_push_blocking(1); //Экран 1 свободен + }*/ + else + { + multicore_reset_core1(); // Сброс и остановка ядра 1 + } + + } + + +} + +void st7789_init() { + // Initialize SPI + spi_init(SPI_PORT, 1000 * 100 * 625); // 62.5MHz + gpio_set_function(PIN_MOSI, GPIO_FUNC_SPI); + gpio_set_function(PIN_SCK, GPIO_FUNC_SPI); + + // Initialize control pins + gpio_init(PIN_CS); + gpio_init(PIN_DC); + gpio_init(PIN_RST); + gpio_init(PIN_BL); + gpio_set_dir(PIN_CS, GPIO_OUT); + gpio_set_dir(PIN_DC, GPIO_OUT); + gpio_set_dir(PIN_RST, GPIO_OUT); + gpio_set_dir(PIN_BL, GPIO_OUT); + + // Reset the display + gpio_put(PIN_RST, 0); + sleep_ms(50); + gpio_put(PIN_RST, 1); + sleep_ms(50); + + // Initialize ST7789 commands + st7789_send_command(0x01); // Software reset + sleep_ms(150); + st7789_send_command(0x11); // Exit sleep mode + sleep_ms(150); + + st7789_send_command(0x36); // Memory data access control + st7789_send_data(0x20); // RGB + //st7789_send_data(0b00101000); // BGR + + st7789_send_command(0x3A); // Interface pixel format + st7789_send_data(0b01010101); // 16-bit/pixel + + st7789_send_command(0x21); //INVON (21h): Display Inversion On + st7789_send_command(0x29); // Display ON +} + +void st7789_send_command(uint8_t cmd) { + gpio_put(PIN_DC, 0); + gpio_put(PIN_CS, 0); + spi_write_blocking(SPI_PORT, &cmd, 1); + gpio_put(PIN_CS, 1); +} + +void st7789_send_data(uint8_t data) { + gpio_put(PIN_DC, 1); + gpio_put(PIN_CS, 0); + spi_write_blocking(SPI_PORT, &data, 1); + gpio_put(PIN_CS, 1); +} + +void st7789_send_framebuffer(uint16_t *buffer) { + // Установить область для записи на весь экран + st7789_send_command(0x2A); // Column address set + st7789_send_data(0x00); + st7789_send_data(0x00); // X-start = 0 + st7789_send_data((WIDTH - 1) >> 8); + st7789_send_data((WIDTH - 1) & 0xFF); // X-end = WIDTH-1 + + st7789_send_command(0x2B); // Row address set + st7789_send_data(0x00); + st7789_send_data(0x00); // Y-start = 0 + st7789_send_data((HEIGHT - 1) >> 8); + st7789_send_data((HEIGHT - 1) & 0xFF); // Y-end = HEIGHT-1 + + // Команда записи данных в память дисплея + st7789_send_command(0x2C); // Memory write + + // Передача буфера на дисплей + gpio_put(PIN_DC, 1); // Режим данных + gpio_put(PIN_CS, 0); // Выбор устройства + + // Отправка буфера по SPI + spi_write_blocking(SPI_PORT, (uint8_t *)buffer, WIDTH * HEIGHT * 2); + + gpio_put(PIN_CS, 1); // Завершить передачу +} \ No newline at end of file diff --git a/Thread.h b/Thread.h new file mode 100644 index 0000000..67ae61c --- /dev/null +++ b/Thread.h @@ -0,0 +1,23 @@ +#include +#define SPI_PORT spi0 +#define PIN_MISO -1 +#define PIN_MOSI 19 +#define PIN_SCK 18 +#define PIN_CS 17 +#define PIN_DC 22 +#define PIN_RST 13 +#define PIN_BL 12 + +#define WIDTH 320 +#define HEIGHT 240 +#define COLOR_BLACK 0x0000 +#define COLOR_WHITE 0xFFFF + +extern uint16_t frame_buffer[WIDTH * HEIGHT]; +extern uint16_t frame_buffer1[WIDTH * HEIGHT]; + +void st7789_send_command(uint8_t cmd); +void st7789_send_data(uint8_t data); +void st7789_send_framebuffer(uint16_t *buffer); +void coreEntry(); +void st7789_init(); diff --git a/main.c b/main.c new file mode 100644 index 0000000..161bbde --- /dev/null +++ b/main.c @@ -0,0 +1,69 @@ +#include "main.h" +#include "Thread.h" +#include "pico/multicore.h" +#include "pico/stdlib.h" + +int main() { + uint16_t red = 0; + uint16_t green = 0; + uint16_t blue = 0; + uint16_t summcolor=0; + uint32_t data; + stdio_init_all(); + multicore_launch_core1(coreEntry); //Запускаю в ядре 1 процесс вывода на экран + + while (red<32) + { + //uint8_t red_value = (pixel & red_mask) >> 11; + //uint8_t green_value = (pixel & green_mask) >> 5; + //uint8_t blue_value = (pixel & blue_mask); + data = multicore_fifo_pop_blocking(); + fillBufer(frame_buffer,reverse(summcolor & 0b0000011111111111 | red << 11));//; + multicore_fifo_push_blocking(0); //Экран 0 нарисован + /*data = multicore_fifo_pop_blocking(); + fillBufer(frame_buffer1,0x0000); + multicore_fifo_push_blocking(1); //Экран 0 нарисован*/ + red+=1; + sleep_ms(20); + } + + while (green<64) + { + data = multicore_fifo_pop_blocking(); + fillBufer(frame_buffer,reverse(summcolor & 0b1111100000011111 | green << 5)); // + multicore_fifo_push_blocking(0); //Экран 0 нарисован + green+=1; + sleep_ms(20); + } + + while (blue<32) + { + data = multicore_fifo_pop_blocking(); + fillBufer(frame_buffer,reverse(summcolor & 0b1111111111100000 | blue)); // + multicore_fifo_push_blocking(0); //Экран 0 нарисован + blue+=1; + sleep_ms(20); + } + + while (1) { + tight_loop_contents(); + } +} + +void fillBufer (uint16_t* buffer,uint16_t color){ + for (uint16_t y = 0; y < HEIGHT; y++) + { + for (uint16_t x = 0; x < WIDTH; x++) + { + buffer[y*WIDTH+x]=color; + } + } + +} + +unsigned short reverse(unsigned short x) +{ + x = (x & 0xFF) << 8 | (x & 0xFF00) >> 8; + return x; +} + diff --git a/main.h b/main.h new file mode 100644 index 0000000..4b673a7 --- /dev/null +++ b/main.h @@ -0,0 +1,3 @@ +#include +void fillBufer (uint16_t* buffer,uint16_t color); +unsigned short reverse(unsigned short x); \ No newline at end of file diff --git a/Диаграмма без названия.drawio b/Диаграмма без названия.drawio new file mode 100644 index 0000000..ced8b41 --- /dev/null +++ b/Диаграмма без названия.drawio @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +