STM32F429使用touchGFX驱动外部flash存储资源

起源

做单片机开发的时候,总会遇到单片机内存不够,图片需要存储到外部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.编译下载
编译会提示警告,主要是上面定义到外部存储空间的图片没有扇区匹配。
在这里插入图片描述
然后下载主程序就可以了。

使用STM32F429微控制器配合TouchGFX开发的触摸库通常涉及以下几个步骤: 1. **库安装及配置**: - 首先确保从Silicon Labs官方获取了针对STM32F429TouchGFX SDK,这通常包含了预编译的驱动库文件。 - 在STM32固件工程中,添加这些库文件,并配置相应的路径。 2. **初始化硬件**: - 在主函数里,初始化GPIO(负责触摸传感器的输入),以及ADC或其他用于读取触摸位置的数据采集模块。 - 调用TouchGFX提供的初始化函数,设置触摸库的工作模式和分辨率。 3. **注册回调函数**: - TouchGFX会生成一些中断服务程序(ISRs)来处理触碰事件。你需要为这些中断注册对应的回调函数,以便在实际发生触碰时响应。 4. **处理事件**: - 在回调函数中,根据接收到的触摸信息更新UI,比如改变UI元素的状态,触发特定的操作等。 - 可能需要结合实时数据解析库,将触摸坐标转换为屏幕坐标。 5. **错误检查和调试**: - 在开发过程中,要经常检查返回值和错误码,确保每个功能都能正常工作。同时利用调试工具(如JTAG或ST-LINK)进行断点调试。 ```c // 示例代码片段 void touch_event_handler(uint16_t x, uint16_t y, uint8_t state) { // Update your GUI based on the touch state and position if (state == TOUCH_DOWN) { gui_set_button_state(x, y, GUI_STATE_PRESSED); } else if (state == TOUCH_UP) { gui_set_button_state(x, y, GUI_STATE_NORMAL); } } void setup() { ... // GPIO和ADC初始化 touchgfx_config(); NVIC_EnableIRQ(TOUCH_IRQn); // Enable touch interrupt touch_register_callback(touch_event_handler); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值