我使用MCB1700评估板。 它有(320 x 240)TF LCD显示屏。 IDE:Keil uvision4 4.03q。 我的任务是将图片从PC下载到MCB1700,在LCD上显示 并在USB-stick上下载(连接到主板)。 我需要320 * 240 * 2 = 153600字节的内存。 MCB1700只有64kB SRAM和512kB片上闪存。 显然,我必须将图片存储在闪存中。
据我所知,我应该将指针直接绑定到内存地址。
/* Base addresses */
#define LPC_FLASH_BASE (0x00000000UL) //beginning address of on-chip Flash
#define LPC_IMAGE_ADDR (LPC_FLASH_BASE + 0x10000)
#define ImagePtr ((unsigned short *) LPC_IMAGE_ADDR )
//read-write operations
ImagePtr[0] = 0x0124; //First pixel
…
ImagePtr[320*240] = 0xFA37; //Last pixel
unsigned short A = ImagePtr[0];
这是对的吗? 由于Target的选择,我有疑虑。
Flash存储器的区域定义为Read / Only IROM1。 这是否意味着我们只能从Flash读取数据并且必须更改IROM和IRAM字段中的Memory区域以执行写入操作?例如,以这种方式:
答案 0 :(得分:1)
您可能最好让编译器/链接器决定将图像放在Flash中的位置:
static const unsigned short Image[320*240] = { <image data> } ;
将Image
作为数组放在ROM1内存中。
你不能直接写入闪存,它通常是只读的,虽然写操作是面向字的,但是除非先前已擦除并且擦除是以页面或扇区为导向,否则无法写入字 - 因此它更复杂一些管理你的示例代码。
在我上面的建议中,我添加了一个初始化器。现在手动初始化320 * 240元素显然是不切实际的,但是编写基于PC的工具非常简单,该工具将直接从图像文件生成必要的初始化代码。
或者,如果图像不能是静态的,您可以为图像保留部分Flash,然后编写代码以写入闪存,并在必要时从串行端口或USB下载的数据中擦除页面。在这种情况下,Flash存储器必须是页面对齐的,并且包含Flash页面的整数倍。
为了灵活性,您不应该依赖目标对话框设置,而是创建自定义分散文件,然后您可以使用armcc扩展__attribute__
变量限定符创建自定义部分并将图像内存分配给它。