修改通讯串口逻辑,添加810,811,812指令
This commit is contained in:
1 parent
64d820b24c
commit
155358f5d0
42 files changed
+17864
-579
No files matched your search
@@ -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);
|
||||
}
|
||||
@@ -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_ */
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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_ */
|
||||
Reference in new issue
Block a user