本文使用CubeMx新建工程,使用硬件spi驱动W25Q64和LCD屏幕,本文使用的屏幕为1.54寸240x240屏幕。
本文中使用的MCU为STM32F103C8T6。
如何把图片存储在外置FALSH并显示参考我之前的文章
https://blog.csdn.net/nnnzn/article/details/130774716?spm=1001.2014.3001.5501
如图,一张240x240的图片大小达到了115200,如果要显示存储在FLASH中的这张图片,首先要定义一个大小为115200的数组。
STM32F103C8T6 这颗MCU的内存不足以创建这么大的数组,所以通过以下代码实现分块显示。
u8 Read_data[BLOCK_SIZE]; // 图像数据缓冲区
#define BLOCK_SIZE 480 // 每块的大小,根据RAM容量和需求调整
#define LCD_WIDTH 240 // LCD屏幕宽度
#define LCD_HEIGHT 240 // LCD屏幕高度
#define FLASH_IMAGE_SIZE 115200 // 图像文件的总大小,根据实际大小设置
void DisplayImageChunks(u32 startOffset, u32 endOffset) {
u32 y = 0; // 初始化y坐标
u32 scrollStep = 1; // 初始化y坐标的滚动步长,根据需要调整
while (1) {
// 设置LCD显示区域
LCD_Address_Set(0, y, LCD_WIDTH, LCD_HEIGHT);
// 逐步读取并显示当前块
W25QXX_Read(Read_data, startOffset, BLOCK_SIZE); // 从Flash内存读取数据
for (u32 i = 0; i < BLOCK_SIZE; i++) {
u8 data = Read_data[i];
LCD_WR_DATA8(data);
}
// 更新块的起始位置
startOffset += BLOCK_SIZE;
// 增加y坐标以滚动显示
y += scrollStep;
// 如果y坐标越界,重置y坐标
if (y >= LCD_HEIGHT) {
y = 0;
break;
}
// 在每个块之间添加延时,以稳定滚动显示
//HAL_Delay(100); // 根据需要调整延时时长
}
}
这里数组的大小定义为了480,scrollStep的值为 数组大小(480)/ 2 /屏幕宽度(240)。注意scrollStep要为整数,数组大小和scrollStep根据实际调整。
在main函数中调用DisplayImageChunks(),