修改通讯串口逻辑,添加810,811,812指令

This commit is contained in:
sc committed 2025-10-28 01:09:33 +08:00
1 parent 64d820b24c
commit 155358f5d0
42 files changed
+17864 -579

No files matched your search

+71
View File
@@ -0,0 +1,71 @@
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2025-10-27 Administrator the first version
*/
#include "lvgl.h"
#include "lv_port_disp.h"
#include "ssd1963.h"
// 屏幕分辨率(请根据实际 LCD 调整)
#define LCD_WIDTH 480
#define LCD_HEIGHT 272
// 绘图缓冲区:建议为屏幕宽度 * 10 行
static lv_color_t draw_buf1[LCD_WIDTH * 10]; // 前缓冲
static lv_color_t draw_buf2[LCD_WIDTH * 10]; // 后缓冲(可选,用于双缓冲)
// LVGL 绘图缓冲区描述符
static lv_disp_draw_buf_t draw_buf;
// 刷屏完成回调
static void disp_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p)
{
// 设置 SSD1963 显示窗口
ssd1963_set_window(area->x1, area->y1, area->x2, area->y2);
// 写入像素数据
uint32_t size = (area->x2 - area->x1 + 1) * (area->y2 - area->y1 + 1);
for (uint32_t i = 0; i < size; i++) {
SSD1963_DATA_ADDR = color_p[i].full; // 使用 FSMC 写入
}
// ✅ 必须调用!通知 LVGL 刷屏已完成
lv_disp_flush_ready(disp_drv);
}
/**
* @brief 初始化 LVGL 显示驱动
*/
void lv_port_disp_init(void)
{
// 1. 初始化 FSMC 总线(由 STM32CubeMX 生成)
// MX_FSMC_Init();
// 2. 初始化 SSD1963 控制器
ssd1963_init(); // ✅ 使用 ssd1963.h 中的初始化函数
// 注释掉重复的 lcd_init()
// lcd_init(); // ❌ 删除:与 ssd1963_init() 重复或冲突
// 3. 初始化 LVGL 的绘图缓冲区
// 参数:缓冲区结构体、第一个缓冲区、第二个缓冲区(可选)、总大小(像素数)
lv_disp_draw_buf_init(&draw_buf, draw_buf1, draw_buf2, LCD_WIDTH * 10);
// 4. 初始化显示驱动
static lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.hor_res = LCD_WIDTH; // 水平分辨率
disp_drv.ver_res = LCD_HEIGHT; // 垂直分辨率
disp_drv.flush_cb = disp_flush; // 刷屏回调
disp_drv.draw_buf = &draw_buf; // 绑定缓冲区 ✅ 必须赋值!
// 5. 注册显示设备到 LVGL
lv_disp_drv_register(&disp_drv);
}
+32
View File
@@ -0,0 +1,32 @@
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2025-10-27 Administrator the first version
*/
#ifndef APPLICATIONS_LV_PORT_DISP_H_
#define APPLICATIONS_LV_PORT_DISP_H_
#ifdef __cplusplus
extern "C" {
#endif
#define LV_COLOR_DEPTH 16
#define LV_HOR_RES_MAX 480
#define LV_VER_RES_MAX 272
#define LV_DPI 130
void ssd1963_init(void);
void ssd1963_set_window(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
/**
* @brief 初始化 LVGL 显示驱动
* 调用 ssd1963_init() 并注册到 LVGL
*/
void lv_port_disp_init(void);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* APPLICATIONS_LV_PORT_DISP_H_ */
+248
View File
@@ -0,0 +1,248 @@
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2025-10-26 Administrator the first version
*/
/**
* @file ssd1963.c
* @brief SSD1963 TFT LCD Controller Driver for STM32F407 + FSMC + RT-Thread
* @author Qwen (Generated for RTT)
* @date 2025-10-26
*/
#include "rtthread.h"
#include "rtdevice.h"
#include "ssd1963.h" // 确保路径正确
#include <board.h>
// ==================== 引脚定义 (根据你的硬件修改) ====================
#define LCD_RST_PIN GET_PIN(B,2) // 复位引脚
#define LCD_BL_PIN GET_PIN(B,0) // 背光控制引脚 (PWM)
// ==================== SSD1963 命令定义 ====================
#define SSD1963_NOP 0x00
#define SSD1963_SOFT_RESET 0x01
#define SSD1963_GET_PWR_MODE 0x0A
#define SSD1963_GET_ADDR_MODE 0x0B
#define SSD1963_GET_PIX_FORMAT 0x0C
#define SSD1963_GET_SIG_MODE 0x0D
#define SSD1963_GET_DIAGNOSTIC 0x0F
#define SSD1963_ENTER_SLEEP 0x10
#define SSD1963_EXIT_SLEEP 0x11
#define SSD1963_ENTER_PARTIAL 0x12
#define SSD1963_ENTER_NORMAL 0x13
#define SSD1963_EXIT_INVERT 0x20
#define SSD1963_ENTER_INVERT 0x21
#define SSD1963_SET_GAMMA 0x26
#define SSD1963_BLANK_OFF 0x28
#define SSD1963_BLANK_ON 0x29
#define SSD1963_CLEAR_WINDOW 0x2D
#define SSD1963_WRITE_MEMORY_START 0x2C
#define SSD1963_READ_MEMORY 0x2E
#define SSD1963_SET_PARTIAL_AREA 0x30
#define SSD1963_SET_SCROLL_AREA 0x33
#define SSD1963_SET_TEAR_OFF 0x34
#define SSD1963_SET_TEAR_ON 0x35
#define SSD1963_MEM_ACCESS_CTRL 0x36
#define SSD1963_VERTICAL_SCROLL 0x37
#define SSD1963_IDLE_OFF 0x38
#define SSD1963_IDLE_ON 0x39
#define SSD1963_SET_PIX_FORMAT 0x3A
#define SSD1963_SET_IMAGE_FUNC 0x3B
#define SSD1963_WRITE_MEMORY_CONTINUE 0x3C
#define SSD1963_READ_MEMORY_CONTINUE 0x3E
#define SSD1963_SET_COLUMN 0x2A
#define SSD1963_SET_ROW 0x2B
#define SSD1963_SET_XY 0x2C
#define SSD1963_SET_TE_LINE 0x40
#define SSD1963_GET_SCAN_LINE 0x45
#define SSD1963_GET_HOR_PERIOD 0x44
#define SSD1963_SET_PLL_MN 0xE0
#define SSD1963_SET_PLL 0xE2
#define SSD1963_SET_PLL_ENABLE 0xE3
#define SSD1963_SET_DESKTOP_START 0xEA
// ==================== 基础操作函数 ====================
/**
* @brief 写入命令
* @param cmd 命令字节
*/
static void ssd1963_write_cmd(uint8_t cmd)
{
SSD1963_CMD_ADDR = cmd;
}
/**
* @brief 写入数据字节
* @param data 数据字节
*/
static void ssd1963_write_data(uint8_t data)
{
SSD1963_DATA_ADDR = data;
}
/**
* @brief 写入 16 位数据
* @param data 16 位数据
*/
static void ssd1963_write_data_16(uint16_t data)
{
SSD1963_DATA_ADDR = data;
}
/**
* @brief 写入 32 位数据(分 4 次)
* @param data 32 位数据
*/
static void ssd1963_write_data_long(uint32_t data)
{
ssd1963_write_data((data >> 24) & 0xFF);
ssd1963_write_data((data >> 16) & 0xFF);
ssd1963_write_data((data >> 8) & 0xFF);
ssd1963_write_data(data & 0xFF);
}
// ==================== 显示设置函数 ====================
/**
* @brief 设置显示窗口(GRAM 区域)
* @param x1 起始 X 坐标
* @param y1 起始 Y 坐标
* @param x2 结束 X 坐标
* @param y2 结束 Y 坐标
*/
void ssd1963_set_window(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
ssd1963_write_cmd(SSD1963_SET_COLUMN);
ssd1963_write_data_long(x1);
ssd1963_write_data_long(x2);
ssd1963_write_cmd(SSD1963_SET_ROW);
ssd1963_write_data_long(y1);
ssd1963_write_data_long(y2);
ssd1963_write_cmd(SSD1963_WRITE_MEMORY_START); // 准备写 GRAM
}
/**
* @brief 清屏
* @param color 填充颜色 (RGB565)
*/
void ssd1963_clear(rt_uint16_t color)
{
uint32_t i;
uint32_t total_pixels = 480 * 272; // 根据实际分辨率调整
ssd1963_set_window(0, 0, 479, 271);
for (i = 0; i < total_pixels; i++)
{
SSD1963_DATA_ADDR = color;
}
}
// ==================== 初始化函数 ====================
/**
* @brief 初始化 SSD1963 控制器
* 支持 480x272 分辨率,16位色
*/
void ssd1963_init(void)
{
rt_pin_mode(LCD_RST_PIN, PIN_MODE_OUTPUT);
// 复位
rt_pin_write(LCD_RST_PIN, PIN_LOW);
rt_thread_mdelay(100);
rt_pin_write(LCD_RST_PIN, PIN_HIGH);
rt_thread_mdelay(150);
// 软件复位
ssd1963_write_cmd(SSD1963_SOFT_RESET);
rt_thread_mdelay(10);
// ============= 设置 PLL =============
// PLL = (CLK * (M+1)) / (N+1), 典型主频 10MHz 输入
ssd1963_write_cmd(SSD1963_SET_PLL_MN);
ssd1963_write_data(0x23); // M = 35, M+1=36
ssd1963_write_data(0x02); // N = 2, N+1=3
ssd1963_write_data(0x04); // DIV = 4
// 启用 PLL
ssd1963_write_cmd(SSD1963_SET_PLL_ENABLE);
ssd1963_write_data(0x01); // 开启 PLL
rt_thread_mdelay(1);
ssd1963_write_cmd(SSD1963_SET_PLL_ENABLE);
ssd1963_write_data(0x03); // 锁定 PLL
rt_thread_mdelay(5);
// 选择 PLL 作为系统时钟
ssd1963_write_cmd(SSD1963_SET_PLL);
ssd1963_write_data(0x03);
// ============= 设置 LCD 模式 =============
ssd1963_write_cmd(0xB0); // Set LCD Mode
ssd1963_write_data(0x20); // 24-bit/pixel, TFT 模式
ssd1963_write_data(0x01); // HSYNC+VSYNC 控制
ssd1963_write_data_long(480); // LCD 宽度
ssd1963_write_data_long(272); // LCD 高度
ssd1963_write_data_long(41); // HSYNC 脉冲宽度 (41)
ssd1963_write_data_long(2); // HSYNC 起始延迟 (HBP)
ssd1963_write_data_long(2); // HSYNC 结束延迟 (HFP)
ssd1963_write_data_long(10); // VSYNC 脉冲宽度 (10)
ssd1963_write_data_long(2); // VSYNC 起始延迟 (VBP)
ssd1963_write_data_long(2); // VSYNC 结束延迟 (VFP)
// ============= 设置像素格式 =============
ssd1963_write_cmd(SSD1963_SET_PIX_FORMAT);
ssd1963_write_data(0x55); // 16位色 (RGB565)
// ============= 设置内存访问方向 =============
ssd1963_write_cmd(SSD1963_MEM_ACCESS_CTRL);
ssd1963_write_data(0x08); // RGB, 正常方向
// ============= 设置背光 =============
// rt_pin_mode(LCD_BL_PIN, PIN_MODE_OUTPUT);
// rt_pwm_enable(LCD_BL_PIN);
// rt_pwm_set(LCD_BL_PIN, 1000, 50000); // 1kHz, 50% 占空比 (可调)
// rt_pin_write(LCD_BL_PIN, PIN_HIGH); // 直接输出高电平点亮
// ============= 开启显示 =============
ssd1963_write_cmd(SSD1963_EXIT_SLEEP);
rt_thread_mdelay(10);
ssd1963_write_cmd(SSD1963_BLANK_OFF);
ssd1963_write_cmd(SSD1963_ENTER_NORMAL);
rt_thread_mdelay(10);
ssd1963_write_cmd(SSD1963_IDLE_OFF);
// 初始窗口
ssd1963_set_window(0, 0, 799, 479);
// 可选:清屏为黑色
ssd1963_clear(0x00f0);
}
// ==================== LVGL 对接接口 (可选封装) ====================
/**
* @brief 获取屏幕宽度
* @return 宽度
*/
rt_uint16_t ssd1963_get_width(void)
{
return 800;
}
/**
* @brief 获取屏幕高度
* @return 高度
*/
rt_uint16_t ssd1963_get_height(void)
{
return 480;
}
+35
View File
@@ -0,0 +1,35 @@
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2025-10-26 Administrator the first version
*/
#ifndef APPLICATIONS_SSD1963_H_
#define APPLICATIONS_SSD1963_H_
#include <rtthread.h>
// ==================== FSMC 地址映射(必须放在头文件中供外部使用)====================
// 假设使用 FSMC Bank1, NE1, A16 作为 RS/DC 控制线
#define SSD1963_BASE_ADDR ((uint32_t)(0x60000000)) // FSMC_NE1
#define LCD_CMD_ADDR (LCD_BASE_ADDR + 0x00000000) // A0 = 0
#define LCD_DATA_ADDR (LCD_BASE_ADDR + 0x00020000) // A0 = 1
// 定义 FSMC 地址:假设使用 Bank1, Base Address 0x60000000,A0 对应地址位1
#define SSD1963_CMD_ADDR *(volatile uint16_t *)(0x60000000)
#define SSD1963_DATA_ADDR *(volatile uint16_t *)(0x60020000)
#define LCD_Write_Cmd(cmd) (*(__IO uint16_t*)LCD_CMD_ADDR = (cmd))
#define LCD_Write_Data(dat) (*(__IO uint16_t*)LCD_DATA_ADDR = (dat))
// 函数声明
void ssd1963_init(void);
void ssd1963_set_window(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
void ssd1963_clear(rt_uint16_t color);
rt_uint16_t ssd1963_get_width(void);
rt_uint16_t ssd1963_get_height(void);
#endif /* APPLICATIONS_SSD1963_H_ */