STM32
直播中

李进锋

8年用户 996经验值
私信 关注
[问答]

怎么用32L4R9IDISCOVERY开发板上的PSRAM做显存呢?

我手上有一块 32L4R9IDISCOVERY
然后,我在DEMO程序STM32Cube_FW_L4_V1.14.0Projects32L4R9IDISCOVERYExamplesDSIDSI_CmdMode_SingleBuffer基础上,添加了PSRAM初始化。PSRAM工作正常,并可以作为堆使用。
但当我把显存设置到PSRAM上的时候。
发现系统会进入到LTDC Error中断
LTDC_ER_IRQHandler


请问大大有测试过类似的问题吗?
谢谢


附:代码
显存配置
//__attribute__((section(".FrameBufferSection")))

__attribute__((section(".XRAMSection")))

__align(16) uint32_t PhysFrameBuffer[91260]; // 5 char buffer, 5*16 = 80 pixer



PSRAM初始化

/* PSRAM device configuration */

  /* Timing configuration derived from system clock (up to 120Mhz)

  for 60Mhz as PSRAM clock frequency */

  Timing.AddressSetupTime   = 4;

  Timing.AddressHoldTime    = 2;

  Timing.DataSetupTime     = 6;

  Timing.BusTurnAroundDuration = 1;

  Timing.CLKDivision      = 2;

  Timing.DataLatency      = 2;

  Timing.AccessMode    = FMC_ACCESS_MODE_A; //FMC_ACCESS_MODE_A;


  psramHandle.Init.NSBank       = FMC_NORSRAM_BANK1;

  psramHandle.Init.DataAddressMux   = FMC_DATA_ADDRESS_MUX_DISABLE;

  psramHandle.Init.MemoryType     = FMC_MEMORY_TYPE_PSRAM;

  psramHandle.Init.MemoryDataWidth  = FMC_NORSRAM_MEM_BUS_WIDTH_16;

  psramHandle.Init.BurstAccessMode  = FMC_BURST_ACCESS_MODE_DISABLE;

  psramHandle.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_HIGH;

  psramHandle.Init.WaitSignalActive  = FMC_WAIT_TIMING_BEFORE_WS;

  psramHandle.Init.WriteOperation   = FMC_WRITE_OPERATION_ENABLE;

  psramHandle.Init.WaitSignal     = FMC_WAIT_SIGNAL_DISABLE;

  psramHandle.Init.ExtendedMode    = FMC_EXTENDED_MODE_DISABLE;

  psramHandle.Init.AsynchronousWait  = FMC_ASYNCHRONOUS_WAIT_DISABLE;

  psramHandle.Init.WriteBurst     = FMC_WRITE_BURST_DISABLE;

  psramHandle.Init.ContinuousClock  = FMC_CONTINUOUS_CLOCK_SYNC_ASYNC;

  psramHandle.Init.WriteFifo     = FMC_WRITE_FIFO_DISABLE;

  psramHandle.Init.NBLSetupTime    = 0;

  psramHandle.Init.PageSize      = FMC_PAGE_SIZE_NONE;


  psramHandle.Instance = FMC_NORSRAM_DEVICE;

  psramHandle.Extended = FMC_NORSRAM_EXTENDED_DEVICE;



回帖(1)

贾大林

2024-7-3 16:54:44
首先,我们需要确保PSRAM已经正确初始化并可以正常工作。从您的描述来看,PSRAM已经可以作为堆使用,这意味着PSRAM的初始化应该是正确的。接下来,我们将按照以下步骤尝试解决LTDC Error中断的问题:

1. 检查LTDC配置:确保LTDC的配置参数(如时钟、分辨率、颜色格式等)与您的显示设备和PSRAM兼容。您可以在LTDC初始化代码中检查这些参数。

2. 检查显存地址:确保显存地址已经正确设置为PSRAM的地址。您可以在LTDC配置结构体中设置这个地址。

3. 检查显存大小:确保显存大小足够大,可以容纳您的显示内容。您已经定义了一个91260个uint32_t的数组,这应该是足够的。

4. 检查中断配置:确保LTDC Error中断已经正确配置。您可以在NVIC配置代码中检查这一点。

5. 检查错误处理:在LTDC_ER_IRQHandler中断处理函数中,检查错误原因并采取相应的措施。例如,如果错误是由于显存地址不匹配导致的,您可能需要重新配置显存地址。

6. 调试:使用调试工具(如ST-Link)逐步执行代码,观察LTDC配置和中断处理过程中的变量值,以便找到问题所在。

以下是一个简化的示例,展示如何在STM32Cube_FW_L4_V1.14.0项目中配置LTDC和PSRAM:

```c
#include "stm32l4xx_hal.h"
#include "stm32l4r9i_discovery.h"
#include "stm32l4r9i_discovery_lcd.h"

// PSRAM初始化代码
void PSRAM_Init(void)
{
    // 省略PSRAM初始化代码
}

// LTDC配置结构体
LTDC_HandleTypeDef hltdc;

// 显存配置
__attribute__((section(".FrameBufferSection"))) __attribute__((section(".XRAMSection"))) __align(16) uint32_t PhysFrameBuffer[91260];

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_DMA_Init();
    MX_LTDC_Init();
    PSRAM_Init();

    // 配置LTDC
    hltdc.Instance = LTDC;
    hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
    hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
    hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
    hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
    hltdc.Init.HorizontalSync = 9;
    hltdc.Init.VerticalSync = 1;
    hltdc.Init.AccumulatedHBP = 29;
    hltdc.Init.AccumulatedVBP = 3;
    hltdc.Init.AccumulatedActiveW = 800;
    hltdc.Init.AccumulatedActiveH = 480;
    hltdc.Init.TotalHeigh = 525;
    hltdc.Init.TotalWidth = 840;

    // 配置LTDC层
    LTDC_LayerCfgTypeDef sLayerCfg;
    sLayerCfg.WindowX0 = 0;
    sLayerCfg.WindowX1 = 800;
    sLayerCfg.WindowY0 = 0;
    sLayerCfg.WindowY1 = 480;
    sLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;
    sLayerCfg.Alpha = 255;
    sLayerCfg.Alpha0 = 0;
    sLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
    sLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
    sLayerCfg.FBStartAdress = (uint32_t)PhysFrameBuffer;
    sLayerCfg.ImageWidth = 800;
    sLayerCfg.ImageHeight = 480;
    sLayerCfg.Backcolor.Blue = 0;
    sLayerCfg.Backcolor.Green = 0;
    sLayerCfg.Backcolor.Red = 0;
    HAL_LTDC_ConfigLayer(&hltdc, &sLayerCfg, 0);

    // 启动LTDC
    HAL_LTDC_Start(&hltdc);

    while (1)
    {
        // 省略其他代码
    }
}
```

希望这些信息对您有所帮助。如果问题仍然存在,请提供更多详细信息,以便我们能够更好地帮助您。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分