commit e6fc56a2030374116aa8ffcca55cbfa35d6ea545 Author: Stanislav N Mikhailov Date: Fri Dec 27 14:39:43 2024 +0300 RGBView 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +