Перейти к содержанию
    

STM32F746 FMC + LCD

Коллеги, добрый день
Использую 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( );
  }
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

HAL_EnableFMCMemorySwapping();

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 )))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...