diff --git a/.config b/.config index f885b7f..6c1eec8 100644 --- a/.config +++ b/.config @@ -221,7 +221,8 @@ CONFIG_RT_SFUD_SPI_MAX_HZ=50000000 CONFIG_RT_USING_WDT=y # CONFIG_RT_USING_AUDIO is not set # CONFIG_RT_USING_SENSOR is not set -# CONFIG_RT_USING_TOUCH is not set +CONFIG_RT_USING_TOUCH=y +# CONFIG_RT_TOUCH_PIN_IRQ is not set CONFIG_RT_USING_LCD=y # CONFIG_RT_USING_HWCRYPTO is not set # CONFIG_RT_USING_PULSE_ENCODER is not set diff --git a/.cproject b/.cproject index f3f5b4d..55f928c 100644 --- a/.cproject +++ b/.cproject @@ -1,837 +1,842 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index cdf8b63..0bc0db6 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + diff --git a/applications/lvgl/lv__user_gui.c b/applications/lvgl/lv__user_gui.c index 31db8dc..428c2a2 100644 --- a/applications/lvgl/lv__user_gui.c +++ b/applications/lvgl/lv__user_gui.c @@ -19,44 +19,55 @@ #define LCD_BL_PIN GET_PIN(D,12) #define LCD_RST_PIN GET_PIN(D,11) -void lv_user_gui_init(void) +static void btn_led_on_evt_handler(lv_event_t *e) { - // rt_pin_mode(LCD_BL_PIN, PIN_MODE_OUTPUT); - // rt_pin_write( LCD_BL_PIN, PIN_HIGH); - // rt_pin_mIN, ode(LCD_RST_PIN, PIN_MODE_OUTPUT); - // rt_pin_write( LCD_RST_PPIN_LOW); + lv_event_code_t code = lv_event_get_code(e); - // 检查 LTDC 是否全局使能 - if (LTDC->GCR & LTDC_GCR_LTDCEN) - { - LOG_D("LTDC is ENABLED"); - } - else + if (code == LV_EVENT_CLICKED) { - LOG_E("LTDC is NOT enabled!"); + rt_kprintf("LED ON\n"); + //led_on(); } +} - // 检查图层 0 是否使能 - if (LTDC_Layer1->CR & LTDC_LxCR_LEN) - { - LOG_D("Layer 0 is ENABLED"); - } - else - { - LOG_E("Layer 0 is NOT enabled!"); - } - if (__HAL_RCC_LTDC_IS_CLK_ENABLED()) - { - LOG_D("LTDC clock is enabled"); - } - else +static void btn_led_off_evt_handler(lv_event_t *e) +{ + lv_event_code_t code = lv_event_get_code(e); + + if (code == LV_EVENT_CLICKED) { - LOG_E("LTDC clock is DISABLED! <-- This is likely the root cause"); + rt_kprintf("LED OFF\n"); + // led_off(); } +} + +void lv_user_gui_init(void) +{ + lv_obj_t *scr = lv_scr_act(); + + // 创建“按钮” —— 实际是一个可点击的普通对象 + lv_obj_t *btn_on = lv_obj_create(scr); + lv_obj_set_size(btn_on, 100, 50); + lv_obj_align(btn_on, LV_ALIGN_CENTER, -60, 0); + lv_obj_add_flag(btn_on, LV_OBJ_FLAG_CLICKABLE); // 启用点击 + lv_obj_clear_flag(btn_on, LV_OBJ_FLAG_SCROLLABLE); + + lv_obj_t *label_on = lv_label_create(btn_on); + lv_label_set_text(label_on, "LED ON"); + lv_obj_center(label_on); + + lv_obj_add_event_cb(btn_on, btn_led_on_evt_handler, LV_EVENT_CLICKED, NULL); + + // 第二个按钮 + lv_obj_t *btn_off = lv_obj_create(scr); + lv_obj_set_size(btn_off, 100, 50); + lv_obj_align(btn_off, LV_ALIGN_CENTER, 60, 0); + lv_obj_add_flag(btn_off, LV_OBJ_FLAG_CLICKABLE); + lv_obj_clear_flag(btn_off, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_t *label_off = lv_label_create(btn_off); + lv_label_set_text(label_off, "LED OFF"); + lv_obj_center(label_off); - // lv_obj_t *label = lv_label_create(lv_scr_act()); - // lv_label_set_text(label, "Hello LVGL on RT-Thread!"); - // lv_obj_align(label, LV_ALIGN_CENTER, 0, 0); + lv_obj_add_event_cb(btn_off, btn_led_off_evt_handler, LV_EVENT_CLICKED, NULL); } -//INIT_APP_EXPORT(lv_user_gui_init); diff --git a/applications/lvgl/lv_port_disp.c b/applications/lvgl/lv_port_disp.c index e7af276..2e83d28 100644 --- a/applications/lvgl/lv_port_disp.c +++ b/applications/lvgl/lv_port_disp.c @@ -10,6 +10,8 @@ * INCLUDES *********************/ #include "lv_port_disp.h" +#include "ltdc.h" +#include "lcd.h" #include /********************* @@ -174,25 +176,37 @@ void disp_disable_update(void) *'lv_disp_flush_ready()' has to be called when finished.*/ static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p) { - if(disp_flush_enabled) { - /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/ + // if(disp_flush_enabled){ + // ltdc_color_fill(area->x1,area->y1,area->x2,area->y2,(uint16_t*)color_p); + // } + if(!RGB_DIR) /*竖屏*/ + { int32_t x; int32_t y; - for(y = area->y1; y <= area->y2; y++) { - for(x = area->x1; x <= area->x2; x++) { - /*Put a pixel to the display. For example:*/ - /*put_px(x, y, *color_p)*/ + for(y = area->y1; y <= area->y2; y++) + { + for(x = area->x1; x <= area->x2; x++) + { + #if LTDC_PIXFORMAT == LTDC_PIXFORMAT_ARGB8888 + ltdc_draw_point(x, y, *(uint32_t *)(uint32_t*)color_p); + #elif LTDC_PIXFORMAT_RGB565 + ltdc_draw_point(x, y, *(uint16_t *)(uint32_t*)color_p); + #endif color_p++; } } } - + else /*横屏*/ + { + ltdc_color_fill(area->x1,area->y1,area->x2,area->y2,(uint16_t*)color_p); + } /*IMPORTANT!!! *Inform the graphics library that you are ready with the flushing*/ lv_disp_flush_ready(disp_drv); } + /*OPTIONAL: GPU INTERFACE*/ /*If your MCU has hardware accelerator (GPU) then you can use it to fill a memory with a color*/ diff --git a/applications/lvgl/lv_port_disp.h b/applications/lvgl/lv_port_disp.h index af04b01..a10691d 100644 --- a/applications/lvgl/lv_port_disp.h +++ b/applications/lvgl/lv_port_disp.h @@ -25,6 +25,8 @@ extern "C" { /********************* * DEFINES *********************/ +#define MY_DISP_HOR_RES 1024 +#define MY_DISP_VER_RES 600 /********************** * TYPEDEFS diff --git a/applications/main.c b/applications/main.c index a8cc28b..e138466 100644 --- a/applications/main.c +++ b/applications/main.c @@ -12,7 +12,6 @@ #include #include #include "DB_SQLite.h" -#include "lv__user_gui.h" #include "lcd.h" #define DBG_TAG "main" #define DBG_LVL DBG_LOG @@ -26,8 +25,6 @@ int main(void) thread_DB_SQLite(); thread_RUN_LED();//运行指示灯线程 - lcd_init(); - // lv_user_gui_init(); return RT_EOK; } diff --git a/applications/wdt.c b/applications/wdt.c index 82cb6b2..7ef05f3 100644 --- a/applications/wdt.c +++ b/applications/wdt.c @@ -69,4 +69,4 @@ static int wdt_sample() return ret; } -//INIT_APP_EXPORT(wdt_sample); +INIT_APP_EXPORT(wdt_sample); diff --git a/cubemx/Src/stm32h7xx_hal_msp.c b/cubemx/Src/stm32h7xx_hal_msp.c index 04e268a..761a63f 100644 --- a/cubemx/Src/stm32h7xx_hal_msp.c +++ b/cubemx/Src/stm32h7xx_hal_msp.c @@ -84,13 +84,13 @@ void HAL_MspInit(void) */ void HAL_DMA2D_MspInit(DMA2D_HandleTypeDef* hdma2d) { - if(hdma2d->Instance==DMA2D) + //if(hdma2d->Instance==DMA2D) { /* USER CODE BEGIN DMA2D_MspInit 0 */ /* USER CODE END DMA2D_MspInit 0 */ /* Peripheral clock enable */ - __HAL_RCC_DMA2D_CLK_ENABLE(); + // __HAL_RCC_DMA2D_CLK_ENABLE(); /* USER CODE BEGIN DMA2D_MspInit 1 */ /* USER CODE END DMA2D_MspInit 1 */ diff --git a/drivers/include/lcd.h b/drivers/include/lcd.h index dbc41e6..8f66392 100644 --- a/drivers/include/lcd.h +++ b/drivers/include/lcd.h @@ -22,6 +22,8 @@ #define CYAN 0x07FF #define MAGENTA 0xF81F +#define RGB_DIR 1 + /* 注意:_lcd_dev 必须在 extern 之前定义! */ typedef struct { uint16_t width; @@ -35,7 +37,7 @@ extern uint32_t g_back_color; extern _lcd_dev lcddev; /* 函数声明 */ -void lcd_init(void); +int lcd_init(void); void lcd_clear(uint32_t color); void lcd_draw_point(uint16_t x, uint16_t y, uint32_t color); void lcd_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint32_t color); diff --git a/drivers/include/ltdc.h b/drivers/include/ltdc.h index a32d9c8..4f3c81d 100644 --- a/drivers/include/ltdc.h +++ b/drivers/include/ltdc.h @@ -95,7 +95,7 @@ extern DMA2D_HandleTypeDef g_dma2d_handle; /* DMA2D句柄 */ #define LTDC_BACKLAYERCOLOR 0X00000000 /* LTDC帧缓冲区首地址,这里定义在SDRAM里面. */ -#define LTDC_FRAME_BUF_ADDR 0XC0000000 +//#define LTDC_FRAME_BUF_ADDR 0XC0000000 /* LTDC背光控制 */ #define LTDC_BL(x) do{ x ? \ @@ -124,6 +124,6 @@ uint8_t ltdc_clk_set(uint32_t pll3n, uint32_t pll3m, uint32_t pll3r); void ltdc_layer_window_config(uint8_t layerx, uint16_t sx, uint16_t sy, uint16_t width, uint16_t height); /* LTDC层窗口设置 */ void ltdc_layer_parameter_config(uint8_t layerx, uint32_t bufaddr, uint8_t pixformat, uint8_t alpha, uint8_t alpha0, uint8_t bfac1, uint8_t bfac2, uint32_t bkcolor); /* LTDC层基本参数设置 */ uint16_t ltdc_panelid_read(void); /* LTDC 面板ID读取函数 */ -int ltdc_init(void); /* LTDC初始化函数 */ +int ltdc_init(void); #endif /* DRIVERS_INCLUDE_LTDC_H_ */ diff --git a/drivers/lcd.c b/drivers/lcd.c index b7ee730..650ef2e 100644 --- a/drivers/lcd.c +++ b/drivers/lcd.c @@ -16,19 +16,20 @@ uint32_t g_point_color = RED; uint32_t g_back_color = WHITE; _lcd_dev lcddev; -void lcd_init(void) { - lcddev.id = 0x7016; // 模拟 ID +int lcd_init(void) { + // lcddev.id = 0x7016; // 模拟 ID - rt_kprintf("LCD ID:%x\r\n", lcddev.id); + // rt_kprintf("LCD ID:%x\r\n", lcddev.id); if (lcdltdc.pwidth != 0) { - lcd_display_dir(1); // 横屏 + lcd_display_dir(RGB_DIR); // 横屏 } lcd_clear(WHITE); - lcd_rgb_test(); + + return 0; } -//INIT_APP_EXPORT(lcd_init); +INIT_APP_EXPORT(lcd_init); void lcd_rgb_test(void) { @@ -106,8 +107,8 @@ void lcd_show_xnum(uint16_t x, uint16_t y, uint32_t num, uint8_t len, uint8_t si void lcd_show_string(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t size, char *p, uint32_t color) {} // 工具函数(若未使用可删除) -static uint32_t lcd_pow(uint8_t m, uint8_t n) { +/*static uint32_t lcd_pow(uint8_t m, uint8_t n) { uint32_t result = 1; while (n--) result *= m; return result; -} +}*/ diff --git a/drivers/ltdc.c b/drivers/ltdc.c index 81d1259..0564340 100644 --- a/drivers/ltdc.c +++ b/drivers/ltdc.c @@ -19,10 +19,8 @@ LTDC_HandleTypeDef g_ltdc_handle; /* LTDC句柄 */ DMA2D_HandleTypeDef g_dma2d_handle; /* DMA2D句柄 */ -/* 移除原始静态帧缓存数组定义 */ - -#define MAX_FRAME_WIDTH 1280 -#define MAX_FRAME_HEIGHT 800 +#define MAX_FRAME_WIDTH 1024 +#define MAX_FRAME_HEIGHT 600 #if LTDC_PIXFORMAT == LTDC_PIXFORMAT_ARGB8888 || LTDC_PIXFORMAT == LTDC_PIXFORMAT_RGB888 #define BYTES_PER_PIXEL 4 @@ -234,8 +232,16 @@ void ltdc_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint32_t colo } else { - if (ex >= lcdltdc.pheight) ex = lcdltdc.pheight - 1; - if (sx >= lcdltdc.pheight) sx = lcdltdc.pheight - 1; + if (ex >= lcdltdc.pheight) + { + ex = lcdltdc.pheight - 1; + } + + if (sx >= lcdltdc.pheight) + { + sx = lcdltdc.pheight - 1; + } + psx = sy; psy = lcdltdc.pheight - ex - 1; pex = ey; @@ -246,10 +252,12 @@ void ltdc_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint32_t colo addr = ((uint32_t)g_ltdc_framebuf[lcdltdc.activelayer] + lcdltdc.pixsize * (lcdltdc.pwidth * psy + psx)); __HAL_RCC_DMA2D_CLK_ENABLE(); + DMA2D->CR &= ~(DMA2D_CR_START); DMA2D->CR = DMA2D_R2M; DMA2D->OPFCCR = LTDC_PIXFORMAT; DMA2D->OOR = offline; + DMA2D->OMAR = addr; DMA2D->NLR = (pey - psy + 1) | ((pex - psx + 1) << 16); DMA2D->OCOLR = color; @@ -292,11 +300,13 @@ void ltdc_color_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_ addr = ((uint32_t)g_ltdc_framebuf[lcdltdc.activelayer] + lcdltdc.pixsize * (lcdltdc.pwidth * psy + psx)); __HAL_RCC_DMA2D_CLK_ENABLE(); + DMA2D->CR &= ~(DMA2D_CR_START); DMA2D->CR = DMA2D_M2M; DMA2D->FGPFCCR = LTDC_PIXFORMAT; DMA2D->FGOR = 0; DMA2D->OOR = offline; + DMA2D->FGMAR = (uint32_t)color; DMA2D->OMAR = addr; DMA2D->NLR = (pey - psy + 1) | ((pex - psx + 1) << 16); @@ -448,7 +458,7 @@ int ltdc_init(void) lcdltdc.pwidth = 1024; lcdltdc.pheight = 600; lcdltdc.hsw = 20; lcdltdc.hbp = 140; lcdltdc.hfp = 160; lcdltdc.vsw = 3; lcdltdc.vbp = 20; lcdltdc.vfp = 12; - ltdc_clk_set(300, 25, 6); + ltdc_clk_set(129, 32, 5); } else if (lcdid == 0X7018) { diff --git a/packages/LVGL-v8.3.11/lv_conf_template.h b/packages/LVGL-v8.3.11/lv_conf.h similarity index 100% rename from packages/LVGL-v8.3.11/lv_conf_template.h rename to packages/LVGL-v8.3.11/lv_conf.h diff --git a/packages/packages.dbsqlite b/packages/packages.dbsqlite index 1c0f41a..2d3e4f2 100644 Binary files a/packages/packages.dbsqlite and b/packages/packages.dbsqlite differ diff --git a/rtconfig.h b/rtconfig.h index ad2d633..3f276d3 100644 --- a/rtconfig.h +++ b/rtconfig.h @@ -144,6 +144,7 @@ #define RT_SFUD_USING_QSPI #define RT_SFUD_SPI_MAX_HZ 50000000 #define RT_USING_WDT +#define RT_USING_TOUCH #define RT_USING_LCD #define RT_USING_DEV_BUS #define RT_USING_PIN