移植并创建工程模板

制作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 Structuresstruct FlashDevice const FlashDevice  =  {FLASH_DRV_VERS,             // Driver Version, do not modify!"STM32F429_W25QXX",   // Device Name EXTSPI,0x90000000,// Device Start Address0x01000000,// Device Size in Bytes (16M)4096,// Programming Page Size0,                          // Reserved, must be 00xFF,                       // Initial Content of Erased Memory2000,// Program Page Timeout 2000 mSec3000,                       // Erase Sector Timeout 3000 mSec0x001000,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            4096uint8_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);//设置时钟,180Mhzdelay_init(180);            //初始化延时函数 //uart_init(90,115200);     //初始化串口波特率为115200W25QXX_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 Functionunsigned 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_regionER_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_regionER_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。

图片出现小部分乱码

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

TouchGFX-移植和开发环境搭建相关推荐

  1. 开发板qt移植和交叉开发环境搭建学习笔记

    tslib移植 准备工作   开发板有uboot 搭建tftp服务器,开发板可通过服务器下载内核并启动: nfs工具,开发板可通过nfs工具加载到主机(电脑)的rootfs: 触摸屏可使用,在cat触 ...

  2. STM32固件库移植(开发环境的搭建)

    STM32固件库移植(开发环境的搭建) 以下过程是手动移植,过程繁琐,不感兴趣的可以绕路学习CubeMX. 下文阐述两种基本开发环境的搭建方法,HAL库的添加将放在下期 1.基本开发环境的搭建 先创一 ...

  3. JDK安装以及开发环境搭建

    无论是Java开发.J2EE以及Android开发搭建环境时JDK开发环境搭建及环境变量配置是必不可少的,这篇文章就来就分别介绍下JDK的下载以及不同平台的环境变量的配置. 1.安装JDK开发环境 官 ...

  4. 嵌入式linux编译环境搭建,嵌入式Linux开发环境搭建

    整理下嵌入式Linux开发环境搭建过程笔记. 一.制作u-boot.bin文件: tar xjf u-boot-1.1.6.tar.bz2 cd u-boot-1.1.6 patch -p1 < ...

  5. 图像识别DM8127开发攻略——开发环境搭建

    经过两年多的爆炸性出货(针对我们这种小公司),目前稍微停顿了一下,现在难得有点时间继续写自己的博客,其实自己一直想静下心来做点东西,可惜做TI DAVINCI(ARM+DSP)这方面的人不太好招,本人 ...

  6. TI Davinci DM6446开发攻略——开发环境搭建

    TI DAVINCI DM6446的开发环境搭建不像三星S3C2410,S3C2440,ATMEL的AT91SAM9260之类的单核ARM那么简单,因为DM6446还有DSP端的开发环境,以及双核之间 ...

  7. stm32mp1安装linux系统,stm32mp1linux开发环境搭建(cortex a7)

    原标题:stm32mp1linux开发环境搭建(cortex a7) 写在前面: 本文章为<STM32MP1系列教程之Cortex-A7开发篇>系列中的一篇,全系列总计11篇.笔者使用的开 ...

  8. C语言核心技术-C语言概述与开发环境搭建

    C语言概述 C语言发展简史 起源 1972年,贝尔实验室的Dennis Ritchie和Ken Thompson在开发Unix操作系统时设计了C语言,该操作系统的90%以上的代码都是由C语言实现,后期 ...

  9. Hi3519V101开发环境搭建(二)

    目录 目录 前言 编译U-boot 编译Linux-318y的内核 链接地址 前言 前面已经搭建好了Ubuntu下的海思开发环境,现在对编译Uboot和Kernel的过程做一个简单的记录.参考文档&l ...

  10. NB-IoT(7)---开发环境搭建及模组驱动开发

    NB-IoT(7)---开发环境搭建及模组驱动开发 STM32CubeMX安装及使用 1.STM32CubeMX介绍 2.STM32CubeMX安装 3.STM32CubeMX使用 STM32Cube ...

最新文章

  1. 仅需6步,教你轻易撕掉app开发框架的神秘面纱(4):网络模块的封装
  2. 产品经理心中都住着一个段子手?看看他们如何相爱相撕的...
  3. 利剑无意之JAVA面试题(一)
  4. python函数参数学习_python学习笔记-11.函数参数和返回值进阶
  5. 内置炊具行业调研报告 - 市场现状分析与发展前景预测
  6. 依赖注入(di)模式_Java依赖注入– DI设计模式示例教程
  7. oc基础 不可变字符串的创建和使用
  8. pdf 复制文本 乱码_如何在保留格式的同时从PDF复制文本?
  9. html5 go语言运行环境,GO语言环境搭建 及 helloworld开发
  10. winform直接控制云台_售价899元,大疆手机云台DJI OM 4发布,磁吸式卡位 15小时续航...
  11. 计算机屏幕显示故障,计算机显示器常见故障的原因和解决方法
  12. Springboot整合kafka
  13. 计算机快捷键word,计算机类009-Word的快捷键集锦.doc
  14. Layui文件上传样式在ng-dialog不显示的问题处理
  15. Oracle 数据库修复,IBM DB2 数据库修复,MY SQL 数据库修复,SQL Server 数据 库修复,Sybase 数据库,Foxpro 数据库,Access 数据库,Informi
  16. Citrix提供免费阳春版XenServer
  17. “地图易“制图工具——零代码制作漂亮业务地图
  18. Linux进程的详细内容
  19. [附源码]Python计算机毕业设计SSM流浪猫狗救助站(程序+LW)
  20. java token 有效期_Java编程——Token 认证的来龙去脉

热门文章

  1. html文字段落代码,HTML 段落
  2. 邮件客户端用IMAP还是POP3,为什么?Thunderbird 雷鸟和免费腾讯企业邮箱
  3. php虚拟主机伪静态,各种虚拟主机伪静态设置方法
  4. 网络传真机,开启无纸化进程
  5. 【社群运营】关于社群运营的一些学习和思考
  6. 【智驾深谈】特斯拉死亡事故官方洗白,业界被判死缓(万字报告)
  7. Dynamic Wallpaper Mac版 精美的动态壁纸
  8. 仿《雷霆战机》飞行射击手游开发--飞机(含源码库地址)
  9. 笔记本电池怎样使用问题
  10. 完整教程:AI孙燕姿翻唱《交换余生》