# rtt-pkgs-st7305 **Repository Path**: RT-Thread-Mirror/rtt-pkgs-st7305 ## Basic Information - **Project Name**: rtt-pkgs-st7305 - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-23 - **Last Updated**: 2026-01-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # rtt-pkgs-st7305 ## 介绍 ST7305 驱动软件包,基于 RT-Thread 的 pin 和 spi 驱动。ST7305 是低功耗黑白二色 LCD 控制芯片,本驱动通过 SPI 接口,可以实现在 LCD上 显示字符及进行基本的图形操作。 ## 软件说明 由于 ST7305 特殊的点阵显示结构,每比特数据不能和传统的点阵数据对应,要经过相应的转换,不利于使用 DMA 进行高速传输。故先在系统内存中开辟一块或几块 RAM 空间作为缓冲区,先变换数据结构存进缓冲区,再统一进行高速刷新,更新进 ST7305 内存,以提高传输速度,降低功耗。 - 可以配置整个屏幕点阵为一个大的缓冲区,优点是内容可以任意写入,缺点是占用 RAM 较大,在资源受限的 MCU 下可能 RAM 比较紧张。 - 也可以配置为单行缓冲,屏幕以行为单位划分显示区域,比较适合纯文字的,缓冲区宽度配置为整个屏幕宽度(或一半,则以半行为单位来划分显示区域),高度为字符高度,RAM 用量少,缺点是不能跨行(字符行)跨区域显示完整图像。 - 还可以配置2个及以上的缓冲区,小块的用于经常需要刷新的数据,大的可以用于不常刷新的区域,分开理论上更有利于降低功耗。 ## API 函数 主要包括初始化及缓冲区分配、规划刷新区域、绘制点阵或图形等API函数。 具体请参考 [ST7305_API_Doc.md](ST7305_API_Doc.md "ST7305_API_Doc.md") 文档。 ## 使用说明 #### 1. 使用 env 工具配置工程 1. 在 bsp 下打开 env 工具。 3. 输入 menuconfig 命令配置工程,选择 peripherals/st7305 软件包,启用配置好之后保存退出。 5. 输入 pkgs --update 命令更新软件包。 7. 参考下面第二项,编辑 packages/st7305-vx.x.x/st7305_port.h 头文件。 9. 输入 scons --target=mdk5 命令重新生成工程。 #### 2. 编译前,先修改 `st7305_port.h` 头文件中相关宏定义: ```c #define ST7305_SPI_BUS_NAME "spi1" #define ST7305_SPI_DEVICE_NAME "spi10" ``` 这2个改成自己的SPI接口名称。 ```c #define ST7305_CS_PIN GET_PIN(B, 12) #define ST7305_DC_PIN GET_PIN(B, 14) #define ST7305_RESET_PIN GET_PIN(C, 9) ``` 这3个控制脚修改成自己板上连接的引脚 ```c /* st7305 列像素,对应CA方向 */ #define ST7305_COL_PIXS 168 /* st7305 行像素,对应RA方向 */ #define ST7305_ROW_PIXS 384 ``` LCD物理参数,修改成适配自己的LCD参数。我使用的是鱼鹰光电的YDP290屏幕2.9英寸,384*168分辨率。 ```c /* LCD面板放置方向:0->横置排线朝右,1->纵置排线朝下,2->纵置排线朝上,3->横置排线朝左 */ #define LCD_PLACE_DIRECTION 3 ``` LCD屏幕放置方向,修改成自己希望的方位。 ```c /* * 定义显示缓冲区像素宽度和高度 * 缓冲区像素宽度,屏幕横置时,必须是2的倍数,竖置时,必须是12的倍数,默认整行 * 缓冲区像素高度,屏幕横置时,必须是12的倍数,竖置时,必须是2的倍数 * 缓冲区RAM占用约 (DISP_BUF_WIDTH_PIXS * DISP_BUF_HEIGHT_PIXS / 4) 字节数 */ #if defined(LCD_PLACE_VERTICAL) && LCD_PLACE_VERTICAL != 0 #define DISP_BUF_WIDTH_PIXS ST7305_COL_PIXS #define DISP_BUF_HEIGHT_PIXS ST7305_ROW_PIXS #else #define DISP_BUF_WIDTH_PIXS ST7305_ROW_PIXS #define DISP_BUF_HEIGHT_PIXS ST7305_COL_PIXS #endif ``` 这里定义了整个屏幕的缓冲区,可以修改成适合自己的缓冲区宽度和高度。 ```c /* 显示缓存是否动态分配,0->静态内存,1->使用堆内存,动态分配 */ #ifndef FRAME_BUF_USING_HEAP #define FRAME_BUF_USING_HEAP 0 #endif ``` 默认帧缓存使用静态分配,修改成`1`使用堆内存,动态分配。 #### 3. 示例 - 先定义缓冲区RAM,可以有多个,如果是动态分配的,可以省略 ```c rt_uint8_t dp_frame_buf[DISP_BUF_SIZE]; ``` - 定义缓存句柄 ```c /* 定义缓存句柄,有几块缓存就定义几个句柄 */ static dp_frame_t frame = {0}; ``` - 若是动态分配的,定义句柄指针,并赋值为 NULL ```c static dp_frame_t *pframe = RT_NULL; ``` - 初始化 ST7305 控制器 ```c /* ST7305面板初始化,复位、偏压设置等等 */ st7305_init(); ``` - 初始化句柄及关联缓冲区,若希望要动态分配缓冲区,第二个参数必须为空指针 ```c /* 帧缓存句柄初始化,关联缓冲区 */ st7305_frame_init(&frame, &dp_frame_buf[0]); ``` - 规划要刷新进 ST7305 RAM 的矩形块 ```c /* * 规划要刷新的矩形,可以是缓存的一部分,以支持局部刷新 * 此处规划了整个缓存,起点坐标(0,0),由于屏幕横置,矩形宽384,高168,不立即填充颜色 */ st7305_draft_rect(&frame, 0, 0, 384, 168, RT_FALSE, COLOR_WHITE); ``` - 然后可以进行各种操作 ```c /* 画任意线段,起点(10,0),终点(380,160) */ st7305_draw_line(&frame, 10, 0, 380, 160, COLOR_BLACK); /* 画圆,圆心(190,80),半径60 */ st7305_draw_circle(&frame, 190, 80, 60, COLOR_BLACK); ``` - 最后统一更新进 ST7305 RAM ```c /* 刷新缓存到st7305 RAM,注意:此处刷新的内容是st7305_draft_rect()函数规划的对应矩形 */ st7305_flush(&frame); ``` #### 4. 完整示例 `demo/main.c` ```c #include #include #include /** * LCD帧数据缓冲区,连续存储的数据 * 可以规划一个大的,包含整个屏幕的帧缓存; * 若RAM有限,也可以规划一个或多个小的缓存,只是图像不能跨缓存显示。 * DISP_BUF_SIZE 在 st7305_port.h 已定义 */ rt_uint8_t dp_frame_buf[DISP_BUF_SIZE]; /* 定义缓存句柄,有几块缓存就定义几个句柄 */ static dp_frame_t frame = {0}; /* 示例字符点阵数据,ABCD1234,宋体 12*24 点阵数据,垂直扫描,低位在前 */ static const unsigned char m_char_bits[][36] = { //U+0041(A) 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x80, 0x1F, 0x00, 0x7C, 0x10, 0x80, 0x43, 0x00, 0xE0, 0x40, 0x00, 0xE0, 0x47, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xF8, 0x13, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x10, //U+0042(B) 0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x10, 0x10, 0x20, 0x10, 0x10, 0x20, 0x10, 0x10, 0x20, 0x10, 0x10, 0x60, 0x18, 0x10, 0xC0, 0x2F, 0x18, 0x80, 0xE7, 0x0F, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, //U+0043(C) 0x00, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x80, 0xFF, 0x07, 0xC0, 0x01, 0x0E, 0x40, 0x00, 0x18, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x08, 0x60, 0x00, 0x04, 0xE0, 0x01, 0x03, 0x00, 0x00, 0x00, //U+0044(D) 0x20, 0x00, 0x10, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x18, 0x40, 0x00, 0x08, 0xC0, 0x01, 0x0E, 0x80, 0xFF, 0x07, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x00, //U+0031(1) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0xC0, 0xFF, 0x1F, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //U+0032(2) 0x00, 0x00, 0x00, 0x80, 0x03, 0x1C, 0x40, 0x03, 0x1A, 0x20, 0x00, 0x19, 0x20, 0x80, 0x18, 0x20, 0x40, 0x18, 0x20, 0x20, 0x18, 0x60, 0x38, 0x18, 0xC0, 0x1F, 0x18, 0x80, 0x07, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //U+0033(3) 0x00, 0x00, 0x00, 0x80, 0x03, 0x07, 0xC0, 0x03, 0x0F, 0x20, 0x00, 0x10, 0x20, 0x10, 0x10, 0x20, 0x10, 0x10, 0x60, 0x18, 0x10, 0xC0, 0x2F, 0x18, 0x80, 0xE7, 0x0F, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //U+0034(4) 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x88, 0x00, 0x00, 0x86, 0x00, 0x00, 0x81, 0x10, 0xC0, 0x80, 0x10, 0xE0, 0xFF, 0x1F, 0xF0, 0xFF, 0x1F, 0x00, 0x80, 0x10, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, }; void lcd_init(void) { /* GPIO端口及SPI配置已经被系统自动初始化了 */ /* ST7305面板初始化,复位、偏压设置等等 */ st7305_init(); /* 帧缓存句柄初始化,关联缓冲区 */ st7305_frame_init(&frame, &dp_frame_buf[0]); /* 以正常模式清屏 */ st7305_clear_screen(&frame, COLOR_NORMAL); } void lcd_demo(void) { lcd_init(); /* * 规划要刷新的矩形,可以是缓存的一部分,以支持局部刷新 * 此处规划了整个缓存,起点坐标(0,0),由于屏幕横置,矩形宽384,高168,不立即填充颜色 */ st7305_draft_rect(&frame, 0, 0, 384, 168, RT_FALSE, COLOR_WHITE); /* 显示字符 */ for (int i = 0; i < 8; i++) { st7305_fill_fast_rect_mat(&frame, (rt_uint8_t *)&m_char_bits[i][0], i * 12, 0, 12, 24, ST7305_MAT_VER_SCAN, ST7305_BITS_LSB, COLOR_NORMAL); } /* 画水平线段,起点(0,30),长度384 */ st7305_draw_hor_line(&frame, 0, 30, 384, COLOR_BLACK); /* 画垂直线段,起点(100,0),长度168 */ st7305_draw_ver_line(&frame, 100, 0, 168, COLOR_BLACK); /* 画任意线段,起点(10,0),终点(380,160) */ st7305_draw_line(&frame, 10, 0, 380, 160, COLOR_BLACK); /* 画圆,圆心(190,80),半径60 */ st7305_draw_circle(&frame, 190, 80, 60, COLOR_BLACK); /* 填充黑色矩形,起点(300,70),长50,宽30 */ st7305_fill_rect_color(&frame, 300, 70, 50, 30, COLOR_BLACK); /* 刷新缓存到st7305 RAM,注意:此处刷新的内容是st7305_draft_rect()函数规划的对应矩形 */ st7305_flush(&frame); } int main(void) { lcd_demo(); } ``` ## 示例效果 ![示例图片](demo/demo.jpg)