athlon64 0 17 сентября, 2019 Опубликовано 17 сентября, 2019 · Жалоба Коллеги, добрый день Использую 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( ); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
athlon64 0 18 сентября, 2019 Опубликовано 18 сентября, 2019 · Жалоба Оказалось, что первое обращение по указателю 0x64000000 отрабатывалось, а последующие пропускались. Причина во включенном кэшировании записи в Cortex-M7 для адресного пространства 0x60000000 - 0x7FFFFFFF. Решение - включить ремап на адресное пространство 0xC0000000-0xDFFFFFFF, где кэширование записи отключено HAL_EnableFMCMemorySwapping(); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 18 сентября, 2019 Опубликовано 18 сентября, 2019 · Жалоба 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 ))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться