起源
做单片机开发的时候,总会遇到单片机内存不够,图片需要存储到外部flash的情况。
开始
开发环境:
1、开发板:安富莱V6
2、显示屏:LCD7寸,480*800分辨率
3、外部flash:W25Q64,8M
4、touchgfx版本:4.20
5、stm32CubeMX版本:6.6.1
6、单片机开发:keil
准备工作
获取外部flash通过keil进行下载的算法。
我是直接使用安富莱的算法。
对于程序,我们需要做一些修改,以适应外部数据存取。
1,首先进行touchgfx修改
找到touchGFXHAL.CPP文件,修改其中内容。(需要增加flash头文件)
bool TouchGFXHAL::blockCopy(void* RESTRICT dest, const void* RESTRICT src, uint32_t numBytes)
{
// return TouchGFXGeneratedHAL::blockCopy(dest, src, numBytes);
uint32_t dataOffset = (uint32_t)src;
//if (dataOffset >= 0x90000000 && dataOffset < 0x92000000)
if (dataOffset >= 0x90000000 && dataOffset < 0x91000000)//如果GFX调用的地址在0x90000000~0x91000000之间执行
{
dataOffset = dataOffset - 0x90000000;//dataOffset 最终等于卸载外置SPI_FLASH中的地址
// for copying data from there.
sf_ReadBuffer((uint8_t *)dest, dataOffset, numBytes);//读取SPI_FLASH内容
return true;
}
else
{
// For all other addresses, just use the default implementation.
// This is important, as blockCopy is also used for other things in the core framework.
return HAL::blockCopy(dest, src, numBytes);
}
}
2其次进行图片缓存,我是直接在起始screen1里面全部缓存了,这样会造成开机缓存时间比较长,所以可以缓存指定图片。
void Screen1View::setupScreen()
{
percent = 0;
Bitmap::setCache((uint16_t *)0xc0300000,0x800000,128);//
Bitmap::cacheAll();
Screen1ViewBase::setupScreen();
}
通过通过keil下载图片文件到外部flash通过通过keil下载图片文件到外部flash
1新建rom空间
2配置需要下载到外部flash文件到外部地址空间(右键点击)
3加载外部空间下载算法
4编译下载。
过程中会提示0x08000000地址空间没有下载算法,是因为我们现在还没有加载,不管。
下载主程序
1.加载芯片的下载算法
注意缓存要大
2.修改链表
LR_EROM1 0x90000000 0x01000000 { ; load region size_region
ER_EROM1 0x90000000 0x01000000 { ; load address = execution address
*.o (ExtFlashSection)
}
}
手动增加上面的链表文件。
3.编译下载
编译会提示警告,主要是上面定义到外部存储空间的图片没有扇区匹配。
然后下载主程序就可以了。