TouchGFX-移植和开发环境搭建

移植并创建工程模板

制作SPI Flash烧录算法

  • Keil提供的烧录算法,可以将编译后的程序直接烧录到内部的Flash,并没有提供烧录到SPI Flash。而且每款产品spi flash的硬件设计不同,需要提供不同的烧录算法。
  • 烧录算法一般是flm格式的文件,Keil提供的烧录算法均在安装路径下的ARM\Flash文件夹中,正常的工程是没法提供FLM格式的文件,为此Keil官方提供了生成FLM的工程模板,在_Template文件夹下。可以方便我们生成烧录算法。

制作spi flash烧录算法

  1. 在Keil的安装路径下ARM\Flash,复制_Template文件夹到我们的工程下。
  2. 打开Keil,Device中选择对应的芯片。
  3. 要根据具体硬件的设计,在工程中需要添加spi的初始化,和spi flash芯片的驱动函数。
  4. 修改FlashDev.c代码
#include "../FlashOS.H"        // FlashOS Structures

struct FlashDevice const FlashDevice  =  {
	FLASH_DRV_VERS,             // Driver Version, do not modify!
	"STM32F429_W25QXX",   // Device Name 
	EXTSPI,
	0x90000000,// Device Start Address
	0x01000000,// Device Size in Bytes (16M)
	4096,// Programming Page Size
	0,                          // Reserved, must be 0
	0xFF,                       // Initial Content of Erased Memory
	2000,// Program Page Timeout 2000 mSec
	3000,                       // Erase Sector Timeout 3000 mSec
	0x001000,0x000000,// Sector Size  4kB (4 Sectors)
	SECTOR_END
};
  1. 修改FlashPrg.c代码
#include "../FlashOS.H"        // FlashOS Structures

#include "sys.h"
#include "delay.h"
#include "w25qxx.h"
#include "spi1.h"
#include "usart.h"

#define PAGE_SIZE            4096

uint8_t aux_buf[PAGE_SIZE];
uint32_t base_adr;
 
int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {

  /* Add your Code */
     Stm32_Clock_Init(360,25,2,8);//设置时钟,180Mhz
     delay_init(180);            //初始化延时函数 
     //uart_init(90,115200);     //初始化串口波特率为115200
     W25QXX_Init();              //W25QXX初始化
     return (0);                                  // Finished without Errors
}

int UnInit (unsigned long fnc) {

  /* Add your Code */
  return (0);                                  // Finished without Errors
}

int EraseChip (void) {

  /* Add your Code */
	W25QXX_Erase_Chip();
	return (0);                                  // Finished without Errors
}

int EraseSector (unsigned long adr) {

  /* Add your Code */
	W25QXX_Erase_Sector((adr-base_adr)/4096);
	return (0);                                  // Finished without Errors
}

int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {

  /* Add your Code */
	W25QXX_Write_NoCheck(buf,adr-base_adr,sz);
	return (0);                                  // Finished without Errors
}

int BlankCheck (unsigned long adr, unsigned long sz, unsigned char pat) {

    return (1);                                        /* Always Force Erase */
}
unsigned long Verify      (unsigned long adr,   // Verify Function
                           unsigned long sz,
                           unsigned char *buf)
{
        return 0;//直接返回0,表示成功                             
}
  1. 最后将工程中编译出来的FLM文件,复制到安装目录下的ARM\Flash文件夹中,即可在Keil工程中找到对应的算法。

将数据储存到SPI Flash

  1. 在TouchGFX Designer软件中,在Image和Texts栏中,将需要储存在spi Flash的图片和字库的Section和Extra Section设置为ExtFlashSection。
  2. 修改Keil中的烧录算法
    1. 在烧录算法界面Flash Download,取消Verify校验,否则会报错。
    2. 给烧录算法分配合适的RAM空间,如Start:0x20000000,Size:0x8000,保证烧录算法有足够的空间。
    3. 点击Add,添加烧录算法,选择前面生成的FLM文件。
  3. 选择Linker选项卡
    1. 去掉Use Memory Layout from Target Dialog选项,这个选项的作用是默认使用Device器件的储存空间,因为我们这里需要自定义储存空间,不使用默认的空间。注意:取消后,在Targe界面的RAM和ROM设置不再起作用。会使用我们定义的sct文件。
    2. 取消Use Memory Layout from Target Dialog选项,ScatterFile界面就变成可操作状态,点击Edit就可以打开sct文件。
  4. 在sct文件中,添加LR_EROM1,这个是spi flash对应储存空间的别称。只需要保证spi flash对应的空间不和内部规划的地址有冲突就好。
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00100000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00100000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x00030000  {  ; RW data
   .ANY (+RW +ZI)
  }
  RW_IRAM2 0x10000000 0x00010000  {
   .ANY (+RW +ZI)
  }
}

LR_EROM1 0x90000000 0x01000000  {    ; load region size_region
    ER_EROM1 0x90000000 0x01000000  {  ; load address = execution address
		*.o (ExtFlashSection)
	}
}
  1. 在TouchGFXHAL.c中,添加读数据的操作
bool TouchGFXHAL::blockCopy(void* RESTRICT dest, const void* RESTRICT src, uint32_t numBytes)
{
    uint32_t dataOffset = (uint32_t)src;

    if ((dataOffset >= 0x90000000) && (dataOffset < 0x91000000))
    {
        dataOffset = dataOffset - 0x90000000;
        ReadFlash((uint8_t *)dest, dataOffset, numBytes);
        return true;
    }
    else
    {
        return TouchGFXGeneratedHAL::blockCopy(dest, src, numBytes);
    }
}
  1. 在启动的ScreenView.cpp文件中,需要先从spi flash中加载图片/文字到SDRAM。

void screen_startView::setupScreen()
{
	/* 加载外部Flash中的存储内容,缓存到SDRAM的(uint16_t *)0xd0300000之后的0x400000的大小空间,
最多加载128个文件 */
	Bitmap::setCache((uint16_t *)0xd0300000, 0x400000, 128);
	Bitmap::cacheAll();
    screen_startViewBase::setupScreen();
}

遇到的问题记录

图片加载不完整

较小的图片可以加载完整,但是较大的图片不能完整加载。检查spi flash读写函数,是否支持较大字节数读写,读写的字节长度全部设置成uint32_t。

图片出现小部分乱码

检测该图片的地址是否和其他地址(如数据保存地址冲突),地址冲突会覆盖图片的内容,导致部分区域乱码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值