打印

当我开辟一个大的数组到外部sram,lcd就不能正常显示了

[复制链接]
6468|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chineser|  楼主 | 2008-10-25 11:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在做图片解码显示,用的是ze的片子,我开辟了的一个大的数组在sram里,请放心这个数组确实在外部,我去过地址查看,0x6800xxx位置,现在的问题是,我如果把这个数组开辟的小一点,比如几百字节,lcd显示正常,开辟大来人比如几百k  lcd就不能正常显示了 ,在我这时黑屏现象,不显示要显示的东西。
  哪位大侠 解释一下
    
沙发
tsx1983| | 2008-10-25 11:47 | 只看该作者

感觉ST的外扩SRAM空间有问题

楼主可以看看我发的帖子,堆栈放到外部空间死机

使用特权

评论回复
板凳
Swd21ic| | 2008-10-25 14:55 | 只看该作者

re

好像fsmc外扩限制很大.
36MHz+16bit总线..  不知道对性能有多大影响。。

使用特权

评论回复
地板
chineser|  楼主 | 2008-10-27 09:29 | 只看该作者

怎么每人 说一下呢

使用特权

评论回复
5
ijk| | 2008-10-27 09:49 | 只看该作者

STM32ZE开辟一个大的数组到外部sram

  STM32ZE开辟一个大的数组到外部sram,我也做过,没有问题。实际上,我把整个SRAM当作1个大的数组,SRAM的容量为1MB。并且,我的LCD和SRAM都是挂在FSMC上面的。
  至于LZ为什么碰到上面的问题,需要自己进行解释,我上面的情况仅供参考。

使用特权

评论回复
6
tsx1983| | 2008-10-27 14:59 | 只看该作者

回5楼

请问5楼的兄弟能否把你的工程发上来让俺们参考参考?或者能不能解释一下使用外扩SRAM需要注意哪几个地方。我也遇到了和楼主一样的问题,不过不是开辟大的数组,而是使用SRAM就FAULT;

使用特权

评论回复
7
chineser|  楼主 | 2008-10-27 16:32 | 只看该作者

是啊 5楼的 高手 给大点意见呀

使用特权

评论回复
8
ijk| | 2008-10-27 16:47 | 只看该作者

STM32ZE开辟数组到外部sram 的例子

  STM32ZE开辟数组到外部sram  的例子如下,仅供参考:

#define SRAM_MAX_COUNT        0x80000
typedef struct
{
  vu16 HalfWord[SRAM_MAX_COUNT];
} BOARD_SRAM_TypeDef;

// Note: SRAM /CS is CE2_1 - Bank 2 of 0~3
#define BOARD_SRAM_BASE        ((u32)(0x60000000 | 0x08000000))
#define BOARD_SRAM             ((BOARD_SRAM_TypeDef *) BOARD_SRAM_BASE)

//...

void SRAM_Test(void)
{
// 变量定义:此处省略
  // SRAM IO configuration --------------------------------------//
  // Enable FSMC, GPIOD~G & AFEN(Alternate Function) clock //
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |
                         RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG |
                         RCC_APB2Periph_AFIO, ENABLE);
  // Set PD0,1, 4,5, 8~15 as PP AF - D2,3, OE,WE, D13~15, A16~18, D0~1
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |
                                GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |
                                GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  // Set PE0,1, 7~15 as PP AF - BLN0,1, D4~12
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_7 | GPIO_Pin_8 | 
                                GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 |
                                GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOE, &GPIO_InitStructure);
  // Set PF0~5, 12~15 as PP AF - A0~5, A6~9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
                                GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12 | GPIO_Pin_13 |
                                GPIO_Pin_14 | GPIO_Pin_15;
  GPIO_Init(GPIOF, &GPIO_InitStructure);
  // Set PG0~5, 10 as PP AF - A10~15, CE2_1
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
                                GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_10;
  GPIO_Init(GPIOG, &GPIO_InitStructure);

  // SRAM configuration -----------------------------------------//
  // SRAM configured as follow:
  //      - Data/Address MUX = Disable
  //      - Memory Type = SRAM
  //      - Data Width = 16bit
  //      - Write Operation = Enable
  //      - Extended Mode = Disable
  //      - Asynchronous Wait = Disable
  FSMC_Bank1->BTCR[4] = FSMC_DataAddressMux_Disable | FSMC_MemoryType_SRAM |
                        FSMC_MemoryDataWidth_16b | FSMC_WriteOperation_Enable |
                        FSMC_ExtendedMode_Disable | FSMC_AsyncWait_Disable;
  // and as follow - for both read & write operations:
  //      - Address Setup Time = 0x01
  //      - Address Hold Time = 0x00
  //      - Data Setup Time = 0x01
  //      - Bus Turn around Duration = 0x00
  FSMC_Bank1->BTCR[5] = 0x00000101;    // timing OK for 36M,48M&72M Hz Fcpu

  //      - BANK 2 (of NOR/SRAM Bank 0~3) is enabled
  FSMC_Bank1->BTCR[4] |= 0x0001;

  // SRAM test - test a block of SRAM area from SRAM address 0x00000
  for(Added_Addr=0; Added_Addr<0x80000; )
  {
    for(i=0; i<0x80; i++)
    {
      // write data to SRAM
      for(j=0; j<SRAM_BUF_SIZE; j++)
        BOARD_SRAM->HalfWord[i+j + Added_Addr] = Sram_WriteBuf[j];
      // read data from SRAM
      for(j=0; j<SRAM_BUF_SIZE; j++)
        Sram_ReadBuf[j] = BOARD_SRAM->HalfWord[i+j + Added_Addr];
      // compare read-data with written-data
      for(j=0; j<SRAM_BUF_SIZE; j++)
        if(Sram_ReadBuf[j] != Sram_WriteBuf[j])
          return SRAM_TEST_FAIL_64;
      // clear buffer - specific value
      for(j=0; j<SRAM_BUF_SIZE; j++)
        Sram_ReadBuf[j] = 0x8888;
    }
    if(Added_Addr==0)
      Added_Addr = 0x100;
    else
      Added_Addr <<= 1;
  }

}

使用特权

评论回复
9
chineser|  楼主 | 2008-10-27 17:31 | 只看该作者

单独操作可以 能不能给个带lcd的呢

使用特权

评论回复
10
chineser|  楼主 | 2008-10-27 18:00 | 只看该作者

单独操作是没问题 不过再加上lcd显示 就不行了

使用特权

评论回复
11
香水城| | 2008-10-27 18:27 | 只看该作者

楼主用什么方式驱动LCD?LCD与STM32是如何连接的?

你的外部RAM有多大?

通常与存储器有关的问题,很可能是越界访问,估计你的问题是访问外部RAM时越界破坏了LCD的工作区。

使用特权

评论回复
12
tsx1983| | 2008-10-27 19:20 | 只看该作者

回8楼

那种使用方法我的也可以,我的意思是让MDK自动分配地址空间。
像下面这样。

unsigned long TempBuf[60*1024];

而不指定地址

使用特权

评论回复
13
chineser|  楼主 | 2008-10-27 20:29 | 只看该作者

会香水城

我用的是我们公司买的st原版板 

使用特权

评论回复
14
香水城| | 2008-10-27 21:20 | 只看该作者

楼主:我不知道你知不知道这个板上的外扩RAM有多大,LCD如

如果你不知道这些信息,我不知道你是如何写程序的。不错,板子是ST的原装板,但程序可是你写的,你又是如何操作LCD的?

我没有用到这一部分,不知道外扩RAM的容量,但我可以去问问;假如外扩RAM只有64K或128K,你却要分配几百K,程序能正常运行吗?


回12楼:不知道你的问题是不会使用MDK,还是会使用MDK但STM32堆栈放在外扩RAM死机?因为从你的另一个帖子可以看出,你非常肯定地说“经过无数次实验,证明STM32堆栈不能放到外部SRAM空间,放到外部空间必死。”
如何解决STM32堆栈放在外扩RAM死机问题?

现在我有点糊涂,你的问题到底在哪里,请仔细说明:
1)芯片有问题?
2)MDK有问题?
3)不知道如何设置MDK?

这样我才能知道如何帮助你。

使用特权

评论回复
15
chineser|  楼主 | 2008-10-28 10:41 | 只看该作者

提一个 要求 什么都解决了

请香主  再出一个把外部sram当成数据区的,并且带lcd显示功能的例程出来的话  大家就都知道哪有错了
    注意  就像12楼的一样  开辟一个数组  在给数组赋值
     然后再有一个lcd显示  就行了
 就这么简单  只要您出一个这样的例程  大家就都知道哪有问题了  何必还在这争论这些没用的呢。
   请香主  就出一个基于st原装板的就行了。
  请把设置的数组值  在不超界限的情况下够大,原装板是512k,开个100k就行
先谢谢 香主

使用特权

评论回复
16
tsx1983| | 2008-10-28 11:20 | 只看该作者

回答香主俺的问题

问题1:
我用ST的例程,启动代码里使用外部SRAM的宏DATA_IN_ExtSRAM按照要求置成1了。初始化堆栈指针__initial_sp也按照要求置成0x20000000 + Stack_Size了。工程的Option-Target选项下的外部空间RAM1填上了起始地址和大小。

问题来了。RAM1前面打上勾,运行就FAULT;RAM1前面不打勾,一切正常。
填写的RAM1的大小大于64K,运行就FAULT;小于64K正常。

RAM1前面不打钩,像8楼那样,申明一个结构体,指定地址,也正常。

再按照README的说法,选上微库,把内部IRAM1前面的勾去掉,只在RAM1前面打上勾并添上起始地址和大小。仿真好使,脱机运行,白屏

使用特权

评论回复
17
tsx1983| | 2008-10-28 12:04 | 只看该作者

总的来说就是

总的来说就是STM32的外部SRAM空间只能当外设使,而不能像内部RAM那样自由的使用,自由的由编译器去分配。

使用特权

评论回复
18
香水城| | 2008-10-28 12:22 | 只看该作者

你的意思是否是说这是编译器的问题?

请具体说一下你使用的是ST的哪个例程,我们可以详细看看。

因为我们从没有碰到你的问题,所以感到很奇怪。

使用特权

评论回复
19
chineser|  楼主 | 2008-10-28 12:50 | 只看该作者

你们出一个15楼所说的例程就行

使用特权

评论回复
20
香水城| | 2008-10-28 13:16 | 只看该作者

另外一个帖子中有一个例程

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

93

主题

261

帖子

0

粉丝