Jump to content

    
Sign in to follow this  
athlon64

STM32F746 FMC + LCD

Recommended Posts

Коллеги, добрый день
Использую STM32F746G (на плате StarterKit SK-STM32F746).

Пытаюсь подключить используя FMC небольшой дисплей с параллельным интерфейсом, но перед подключением решил проверить логическим анализатором правильность выдачи сигналов на линии D0-D15, WR, RS, CS.

Оказалось, что при записи по адресу в соответствующем банке памяти данные на D0-D15 не выставляются, WR, CS (в моем случае NE2) также не изменяют свои состояния.
При обращении к памяти использую указатель 0x64000000 (1 банк, 2 подбанк). Все используемые ноги FMC инициализированы, скорость GPIO_SPEED_FREQ_VERY_HIGH.

При этом если инициализировать SDRAM (которая уже есть на плате), то при обращении к адресному пространству SDRAM на шине данных сигналы появляются и SDRAM работает хорошо.

Вроде всё просто, не понимаю что я мог упустить.

Прошу вашей помощи

Spoiler

Запись в память:


#define WriteComm(cmd)          *((uint16_t *)0x64000000) = cmd

Инициализация FMC:


void MX_FMC_Init(void)
{
  FMC_NORSRAM_TimingTypeDef Timing = {0};

  // Perform the SRAM1 memory initialization sequence
  hsram1.Instance = FMC_NORSRAM_DEVICE;
  hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
  // hsram1.Init
  hsram1.Init.NSBank = FMC_NORSRAM_BANK2;   // NE2
  hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
  hsram1.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
  hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;
  hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
  hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
  hsram1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
  hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
  hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
  hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE;
  hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
  hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
  hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
  hsram1.Init.WriteFifo = FMC_WRITE_FIFO_DISABLE;
  hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;

  // Timing 
  Timing.AddressSetupTime = 2;
  Timing.AddressHoldTime = 0;
  Timing.DataSetupTime = 5;
  Timing.BusTurnAroundDuration = 0;
  Timing.CLKDivision = 0;
  Timing.DataLatency = 0;
  Timing.AccessMode = FMC_ACCESS_MODE_B;

  if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK)
  {
    Error_Handler( );
  }
}

 

Share this post


Link to post
Share on other sites

Оказалось, что первое обращение по указателю 0x64000000 отрабатывалось, а последующие пропускались.

Причина во включенном кэшировании записи в Cortex-M7 для адресного пространства 0x60000000 - 0x7FFFFFFF.

Решение - включить ремап на адресное пространство 0xC0000000-0xDFFFFFFF, где кэширование записи отключено

HAL_EnableFMCMemorySwapping();

 

Share this post


Link to post
Share on other sites
6 hours ago, athlon64 said:

Решение - включить ремап на адресное пространство 0xC0000000-0xDFFFFFFF, где кэширование записи отключено


HAL_EnableFMCMemorySwapping();

 

Или, запретить кеширование через MPU для адресов 0x64000000 :

void MPU_Conf(void)
{
 MPU_Region_InitTypeDef MPU_InitStruct;

 HAL_MPU_Disable();

 MPU_InitStruct.Enable=MPU_REGION_ENABLE;

 MPU_InitStruct.BaseAddress = 0x60000000;
 MPU_InitStruct.Size = MPU_REGION_SIZE_256MB; //0x60000000..0x6FFFFFFF

 MPU_InitStruct.AccessPermission=MPU_REGION_FULL_ACCESS;

 MPU_InitStruct.TypeExtField=MPU_TEX_LEVEL0;

 MPU_InitStruct.IsCacheable=MPU_ACCESS_NOT_CACHEABLE;
 MPU_InitStruct.IsBufferable=MPU_ACCESS_BUFFERABLE;
 MPU_InitStruct.IsShareable=MPU_ACCESS_SHAREABLE;

 MPU_InitStruct.Number=MPU_REGION_NUMBER0;
 MPU_InitStruct.SubRegionDisable=0x00;
 MPU_InitStruct.DisableExec=MPU_INSTRUCTION_ACCESS_DISABLE;

 HAL_MPU_ConfigRegion(&MPU_InitStruct);

 HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}

 

Старые добрые грабли на Cortex M7 )))

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this