800*480分辨率的屏幕需要的缓存较大,放在外部的SRAM里面更为方便
用cubemx配置FSMC驱动SRAM
先打开战舰V4的原理图查看开发板上外部SRAM的接口。

片选管脚连接到了FSMC的NE3端口,地址为19位,数据为16位,设置一下cubemx,时序配置为0;4;0

生成代码,我这里是用的Makefile
把显存放在SRAM中,代码如下
static uint16_t color_buf[480 * 800] __attribute__((section(".ext_sram")));
然后需要修改链接文件,在 STM32F103ZETx_FLASH.ld 文件中修改两处,在MEMORY中添加EXTSRAM和地址、大小信息;在下方 SECTIONS 中添加 ext_sram 节区。
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
EXTSRAM (xrw) : ORIGIN = 0X68000000, LENGTH = 1024K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 512K
}
.ext_sram(NOLOAD) :
{
. = ALIGN(4);
_sext_sram = .;
. = ALIGN(4);
_eext_sram = .;
} >EXTSRAM AT> FLASH
SRAM 的测试代码如下
#include "sram.h"
#include <stdio.h>
#define EXT_SRAM_ADDR ((uint32_t)0x68000000)
#define EXT_SRAM_SIZE (1 * 1024 * 1024)
uint32_t bsp_test_sram(void) {
uint32_t i;
uint32_t *pSRAM;
uint8_t *pBytes;
uint32_t err;
const uint8_t ByteBuf[4] = {0x55, 0xA5, 0x5A, 0xAA};
pSRAM = (uint32_t *)EXT_SRAM_ADDR;
for (i = 0; i < EXT_SRAM_SIZE / 4; i++) {
*pSRAM++ = i;
}
err = 0;
pSRAM = (uint32_t *)EXT_SRAM_ADDR;
for (i = 0; i < EXT_SRAM_SIZE / 4; i++) {
if (*pSRAM++ != i) {
err++;
}
}
printf("SDRAM check round 1 error = %u\r\n", err);
if (err > 0) {
return (4 * err);
}
#if 1
pSRAM = (uint32_t *)EXT_SRAM_ADDR;
for (i = 0; i < EXT_SRAM_SIZE / 4; i++) {
*pSRAM = ~*pSRAM;
pSRAM++;
}
err = 0;
pSRAM = (uint32_t *)EXT_SRAM_ADDR;
for (i = 0; i < EXT_SRAM_SIZE / 4; i++) {
if (*pSRAM++ != (~i)) {
err++;
}
}
printf("SDRAM check round 2 error = %u\r\n", err);
if (err > 0) {
return (4 * err);
}
#endif
pBytes = (uint8_t *)EXT_SRAM_ADDR;
for (i = 0; i < sizeof(ByteBuf); i++) {
*pBytes++ = ByteBuf[i];
}
err = 0;
pBytes = (uint8_t *)EXT_SRAM_ADDR;
for (i = 0; i < sizeof(ByteBuf); i++) {
if (*pBytes++ != ByteBuf[i]) {
err++;
}
}
printf("SDRAM check round 3 error = %u\r\n", err);
if (err > 0) {
return err;
}
return 0;
}
测试通过
