Цитата(uriy @ Dec 26 2016, 12:15)

Какая частота AHB?
Частота AHB 168 МГц
Цитата
Покажите настройки FMC.
Настройки я как только не менял, даже научным перебором попробовал). То, что осталось от моих рвений:
CODE
void MX_FMC_Init(void)
{
FMC_SDRAM_TimingTypeDef SdramTiming;
/** Perform the SDRAM1 memory initialization sequence
// 168/2= 84 MHz,
*/
hsdram1.Instance = FMC_SDRAM_DEVICE;
/* hsdram1.Init */
hsdram1.Init.SDBank = FMC_SDRAM_BANK2;
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_4;
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_2;
/* SdramTiming */
SdramTiming.LoadToActiveDelay = 0x02; //TMRD
SdramTiming.ExitSelfRefreshDelay = 0x07; //TXSR
SdramTiming.SelfRefreshTime = 0x04; //TRAS
SdramTiming.RowCycleDelay = 0x07; //TRC>TRFC
SdramTiming.WriteRecoveryTime = 0x03; //TWR, TWR>=TRAS-TRCD, TWR>=TRC-TRCD-TRP
SdramTiming.RPDelay = 0x02; // TRP
SdramTiming.RCDDelay = 0x02; // TRCD
if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK)
{
Error_Handler();
}
/* Program the SDRAM external device */
SDRAM_Initialization_Sequence(&hsdram1, &command);
/* Write data to the SDRAM memory */
for (uwIndex = 0; uwIndex < BUFFER_SIZE; uwIndex++)
{
aTxBuffer[uwIndex]=0xA102;
*(uint32_t*) (SDRAM_BANK_ADDR + uwIndex*2)=aTxBuffer[uwIndex];
for (uint16_t ii=0;ii<10;ii++);
}
HAL_SDRAM_Read_16b(&hsdram1, (uint32_t*)SDRAM_BANK_ADDR, aTxBuffer, BUFFER_SIZE);
/* Read back data from the SDRAM memory */
for (uwIndex = 0; uwIndex < BUFFER_SIZE; uwIndex++)
{
aRxBuffer[uwIndex] =*(uint32_t*) (SDRAM_BANK_ADDR + uwIndex*2);
}
//HAL_SDRAM_Write_16b(&hsdram1, (uint32_t*)SDRAM_BANK_ADDR, aRxBuffer, BUFFER_SIZE);
HAL_Delay (10);
/*##-3- Checking data integrity ############################################*/
for (uwIndex = 0; (uwIndex < BUFFER_SIZE) && (uwWriteReadStatus == 0); uwIndex++)
{
if (aRxBuffer[uwIndex] != aTxBuffer[uwIndex])
{
uwWriteReadStatus++;
}
}
if (uwWriteReadStatus)
{
/* KO */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15,1);
}
else
{
/* OK */
}
}
Цитата
Покажите SDRAM_Initialization_sequence()
CODE
void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command)
{
__IO uint32_t tmpmrd =0;
/* Step 3: Configure a clock configuration enable command */
Command->CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;
Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2;
Command->AutoRefreshNumber = 1;
Command->ModeRegisterDefinition = 0;
/* Send the command */
HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);
/* Step 4: Insert 100 ms delay */
HAL_Delay(100);
/* Step 5: Configure a PALL (precharge all) command */
Command->CommandMode = FMC_SDRAM_CMD_PALL;
Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2;
Command->AutoRefreshNumber = 1;
Command->ModeRegisterDefinition = 0;
/* Send the command */
HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);
/* Step 6 : Configure a Auto-Refresh command */
Command->CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2;
Command->AutoRefreshNumber = 8;
Command->ModeRegisterDefinition = 0;
/* Send the command */
HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);
/* Step 7: Program the external memory mode register */
tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_2 |
SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL |
SDRAM_MODEREG_CAS_LATENCY_3 |
SDRAM_MODEREG_OPERATING_MODE_STANDARD |
SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2;
Command->AutoRefreshNumber = 1;
Command->ModeRegisterDefinition = tmpmrd;
/* Send the command */
HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);
/* Step 8: Set the refresh rate counter */
/* (15.62 us x Freq) - 20 */
/* Set the device refresh counter */
HAL_SDRAM_ProgramRefreshRate(hsdram, 0x0569);
}
Цитата
Что это значит и как определяете?
Пардоньте за жаргон. Резетами в линии я называю импульсы низкого уровня на линии reset микроконтроллера. Смотрю осциллоскопом (фото выше прилагал). То есть, когда я включаю инициализацию видеобуфера - с периодичностью 20 мс линия reset прижимается к земле; выключаю объявление видеобуфера - в линии reset спокойные 3.3В
Цитата(SasaVitebsk @ Dec 26 2016, 19:13)


Я тоже не понял... Какие ресеты в какой линии... Причём здесь LTDC... Одни вопросы.
Неверная настройка самого контроллера по частотам к краху приводить не должна. Если не так области заданы, ну тогда наверное возможно... Ну типа видеоозу не по тем адресам задано.... Тогда наверное при попытке обращения будет вызываться немаскируемое прерывание и рестарт... Ну так там надо просто посмотреть... Да и всё.
Хорошая мысль! Тоже думал, будто видеобуфер добегает до конца, стукается об стенку и перезагружается)) (уж извиняюсь, с помощью простых аналогий пытаюсь понять суть сложных вещей).
На всякий случай вот код инициализации экрана, может здесь, конечно, накосячил
CODE
#define LCD_LAYER1_WIDTH 790
#define LCD_LAYER1_HEIGHT 470
void MX_LTDC_Init(void)
{
LTDC_LayerCfgTypeDef pLayerCfg;
LTDC_LayerCfgTypeDef pLayerCfg1;
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 = 47;
hltdc.Init.VerticalSync = 2;
hltdc.Init.AccumulatedHBP = 87;
hltdc.Init.AccumulatedVBP = 31;
hltdc.Init.AccumulatedActiveW = 887;
hltdc.Init.AccumulatedActiveH = 511;
hltdc.Init.TotalWidth = 927;
hltdc.Init.TotalHeigh = 524;
hltdc.Init.Backcolor.Blue = 255;
hltdc.Init.Backcolor.Green = 255;
hltdc.Init.Backcolor.Red = 255;
if (HAL_LTDC_Init(&hltdc) != HAL_OK)
{
Error_Handler();
}
pLayerCfg.WindowX0 = 5;
pLayerCfg.WindowX1 = 795;
pLayerCfg.WindowY0 = 5;
pLayerCfg.WindowY1 = 475;
pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
pLayerCfg.Alpha = 255;
pLayerCfg.Alpha0 = 0;
pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
pLayerCfg.FBStartAdress =(uint32_t)0xD0000000;
pLayerCfg.ImageWidth = LCD_LAYER1_WIDTH;
pLayerCfg.ImageHeight = LCD_LAYER1_HEIGHT;
pLayerCfg.Backcolor.Blue = 0;
pLayerCfg.Backcolor.Green = 0;
pLayerCfg.Backcolor.Red = 255;
if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)
{
Error_Handler();
}
}