dvf 1 1 февраля, 2021 Опубликовано 1 февраля, 2021 · Жалоба Не получается( Выделил адреса для кадра в SDRAM: 0xC0000000 и 0xC0080000. Помимо этого, на ней же, с таким же интервалом (512К) выделил области для хранения графики формата ARGB8888. Все в рамках одной страницы (4М). Кэш L1 настроил, MPU - тоже. Ну, соответственно и SDRAM. Скрытый текст /* FMC initialization function */ static void MX_FMC_Init(void) { /* USER CODE BEGIN FMC_Init 0 */ /* USER CODE END FMC_Init 0 */ FMC_SDRAM_TimingTypeDef SdramTiming = {0}; /* USER CODE BEGIN FMC_Init 1 */ /* USER CODE END FMC_Init 1 */ /** Perform the SDRAM1 memory initialization sequence */ hsdram1.Instance = FMC_SDRAM_DEVICE; /* hsdram1.Init */ hsdram1.Init.SDBank = FMC_SDRAM_BANK1; hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8; hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12; hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16; hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_2; hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3; hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE; hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2; hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE; hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0; /* SdramTiming */ SdramTiming.LoadToActiveDelay = 2; SdramTiming.ExitSelfRefreshDelay = 7; SdramTiming.SelfRefreshTime = 4; SdramTiming.RowCycleDelay = 7; SdramTiming.WriteRecoveryTime = 3; SdramTiming.RPDelay = 2; SdramTiming.RCDDelay = 2; if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK) { Error_Handler( ); } /* USER CODE BEGIN FMC_Init 2 */ /* USER CODE END FMC_Init 2 */ } void MPU_Config(void) { MPU_Region_InitTypeDef MPU_InitStruct = {0}; /* Disables the MPU */ HAL_MPU_Disable(); /** Initializes and configures the Region and the memory to be protected */ MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER0; MPU_InitStruct.BaseAddress = 0xC0000000; MPU_InitStruct.Size = MPU_REGION_SIZE_4MB; MPU_InitStruct.SubRegionDisable = 0x0; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0; MPU_InitStruct.AccessPermission = MPU_REGION_PRIV_RW; MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE; MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct); /* Enables the MPU */ HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); } Первоначально, закидываю при помощи DMA2D графику в оба адреса: 0xC0000000 и 0xC0080000. После инициализации LTDC нацелено на первый адрес. Далее, переключаю его в бесконечном цикле (для теста) с интервалом 1с после полной отрисовки кадра. void ltdc_frb_replace( uint8_t frbuff ) { LTDC_LAYER(&hltdc, 0)->CFBAR = AdrFrBuff[ frbuff ]; __HAL_LTDC_VERTICAL_BLANKING_RELOAD_CONFIG( &hltdc ); } Частота клока LTDC - 9.6МГц. Частота AHB - 216МГц. Сначала, примерно три переключения, нормально отображаются. А потом картинка начинает стремительно "рассыпаться". Если поставить отладку на паузу или после последнего переключения вставить бесконечный цикл в листинге, то картинка восстанавливается (в конце не видео). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvf 1 1 февраля, 2021 Опубликовано 1 февраля, 2021 · Жалоба Нашел эту ссылку, но не вкурил про выравнивание 64 байта( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться