Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » STM32 » LTDC,SDRAM,DMA2D


LTDC,SDRAM,DMA2D

Сообщений 1 страница 14 из 14

1

На примере F429 дискавери

украден здесь http://en.radzio.dxp.pl/stm32f429idiscovery/

Инит SDRAM можно брать сразу, полностью рабочий .
Работа с SDRAM :

Код:
// SDRAM base address for Bank 2
#define SDRAM_BASE 0xD0000000
// SDRAM size is 8MB
#define SDRAM_SIZE 0x00800000

Инит LTDC пришлось переписывать ибо в их примере внешний 640x480.
А на дискавирине еще и рулить дисплеем надо через SPI
Что изменилось:
Тайминги синхро LCD -

Код:
#define LCD_WIDTH    240
#define LCD_HEIGHT    320

#define HFP 	10
#define HSYNC 10
#define HBP 	20

#define VFP 	4
#define VSYNC 	2
#define VBP 	2



#define ACTIVE_W (HSYNC + LCD_WIDTH + HBP - 1)
#define ACTIVE_H (VSYNC + LCD_HEIGHT + VBP - 1)
#define DISP_ACCUM_HORIZ_BACKPORCH  (HSYNC + HBP - 1)
#define DISP_ACCUM_VERT_BACKPORCH  (VSYNC + VBP - 1)
#define TOTAL_WIDTH  (HSYNC + HBP + LCD_WIDTH + HFP - 1)
#define TOTAL_HEIGHT (VSYNC + VBP + LCD_HEIGHT + VFP - 1)

Тактирование LCD

Код:
  #define PLLSAI_N     192  /* Multiplier for input clock (which is HSE/M) */
  #define PLLSAI_R     4    /* Divider 1; /4 */
  #define PLLSAI_DIVR  2    /* Divider 2; 0=/2, 1=/4, 2=/8, 3=/16 */
	#define PLLSAI_Q     4
	RCC->PLLSAICFGR = (PLLSAI_N  << 6) | (PLLSAI_Q << 24) | (PLLSAI_R << 28);
	RCC->DCKCFGR = (RCC->DCKCFGR & (~RCC_DCKCFGR_PLLSAIDIVR)) | (PLLSAI_DIVR  << 16);
	/* Enable SAI PLL */
	RCC->CR |= RCC_CR_PLLSAION;
	/* wait for SAI PLL ready */
	while((RCC->CR & RCC_CR_PLLSAIRDY) == 0){};

Конфиг окна

Код:
/* Synchronization Size Configuration */
	LTDC->SSCR     	= ((HSYNC - 1) << 16) 	| (VSYNC - 1);
	/* Back Porch Configuration */
	LTDC->BPCR     	= (((HSYNC+HBP) - 1) << 16) 	| ((VSYNC+VBP) - 1);
	/* Active Width Configuration */
	LTDC->AWCR     	= (ACTIVE_W << 16)     | (ACTIVE_H);
	/* Total Width Configuration */
	LTDC->TWCR     	= (TOTAL_WIDTH << 16) 	| (TOTAL_HEIGHT);

Конфиг слоя 1.

Код:
	/* Pixel Format Configuration */
	LTDC_Layer1->PFCR   = 2;
	/* Window Horizontal Position Configuration */
	LTDC_Layer1->WHPCR = ((DISP_ACCUM_HORIZ_BACKPORCH + LCD_WIDTH) << 16) | (DISP_ACCUM_HORIZ_BACKPORCH+1);
  LTDC_Layer1->WVPCR = ((DISP_ACCUM_VERT_BACKPORCH + LCD_HEIGHT) << 16) | (DISP_ACCUM_VERT_BACKPORCH+1);
	/* Color Frame Buffer Address */
	LTDC_Layer1->CFBAR  = SDRAM_BASE;
	/* Color Frame Buffer Length */
	LTDC_Layer1->CFBLR  = ((LCD_WIDTH * PIXELWIDHT) << 16) | ((LCD_WIDTH * PIXELWIDHT) + 3);
	/* Enable Layer */
	LTDC_Layer1->CFBLNR = LCD_HEIGHT;

  LTDC_Layer1->CR |= LTDC_LxCR_LEN; // Enable layer1 

	/* Immediate Reload */
	LTDC->SRCR     	= LTDC_SRCR_IMR;
	
	/* Enable LTDC */
	LTDC->GCR      	= LTDC_GCR_LTDCEN;

Пока застолблю , описание и чистка потом

2

#define LCD_WIDTH    240
#define LCD_HEIGHT    320

И ты реально что-то видишь на этой трёхдюймовой хрени 320х240?
Если видишь, то это, увы, ненадолго...
Сейчас старых пердунов вроде меня (хотя я-то как раз к эмбэдду не отношусь, что статистики, однако, не портит) в эмбедде абсолютное большинство.
Вот и ориентируйся на целевую аудиторию. Дисп минимум 7" 800х480, для которого команды по А18 в режиме FSMC явно преждевременны...

К чему это?
да мучу как раз терминал на старой пятнашке 1024х768@60Hz по интерфейсу ssd1306  (правда SPI, а не IIC). Интерфейс простой, отработанный, разрешение без нарушения протокола меняется в 4 раза лёгким движением руки, ресурсов много не требует...

Из четвёртых кортексов у мну только 407 на дискаверине...
Чё нить к народу ближе. :)

3

Чё нить поближе, как раз и есть 429 дискаверина.
Если сходишь по выше озвученной ссылке, там и дисплей поболее. И ссылку на свой монитор кинь...

4

И ссылку на свой монитор кинь...


https://www.cnet.com/products/ibm-think … ies/specs/  :playful:
Матрас вот этот http://www.alldatasheet.com/datasheet-p … 50X08.html

Чё нить поближе, как раз и есть 429

Ога.
F0/F1 народные.

Отредактировано omercury (2017-02-24 11:22:38)

5

В F0,F1 нет сего интерфейса, читай заголовок темы...

6

В F0,F1 нет сего интерфейса

Нету...  :(
...но есть SPI/FSMC

7

Ну и? Или  заведем ветку о дисплеях или о спи и фсмц...

8

dosikus написал(а):

Ну и? Или  заведем ветку о дисплеях или о спи и фсмц...

Жаль нет продолжения!
Я тоже "старпер", но считаю что 429 это минимум "народности", поскольку работать можно и нужно с любыми - тут какждый решает сам, а вот изучать как минимум нужно начинать с возможностей этого, и цена не сильно кусается и многое уже есть.
Да и вообще что за манера - вместо толковых вопросов, критика и вопли расскажи попроще...

9

sherpa,  ты имеешь ввиду подкрутить гуй EmWin?
  Подкручен , без спл и калокуба . Но надо вновь все нюансы вспоминать...

10

Привет всем. Поделюсь своей работой с SDRAM IS42S16400J и экраном TM057QDH01 V1.1 (640х480)

Работа с памятью IS42S16400J

SDRAM_HandleTypeDef hsdram1;

void  SDRAM_Init(void)
{
  FMC_SDRAM_TimingTypeDef SdramTiming;

  /** 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_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_1;
 
  /* SdramTiming */
  // 1такт = (1/90Мгц)*1000000000 = ns или 1000/90 = ns
  // т.к. у нас частота FMC = 96Мгц то 1 такт = 10.42ns (проц разогнан до 192Мгц)
  //   
  /* TMRD: 2 Clock cycles */
  SdramTiming.LoadToActiveDelay = 2;
  /* TXSR: min=70ns (7x1такт) */
  SdramTiming.ExitSelfRefreshDelay = 7;
  /* TRAS (Command Period (ACT to PRE)): min=42ns (4x1такт) max=120k (ns) */
  SdramTiming.SelfRefreshTime = 4;
  /* TRC (Command Period (REF to REF / ACT to ACT)):  min=70 (7x1такт) */
  SdramTiming.RowCycleDelay = 7;
  /* TWR (Command Delay time):  min=1+ 7ns (1+1x1такт) */
  SdramTiming.WriteRecoveryTime = 2;
  /* TRP (Command Period):  20ns => 2x1такт */
  SdramTiming.RPDelay = 2;
  /* TRCD (Active Command To Read): 20ns => 2x1такт */
  SdramTiming.RCDDelay = 2;

  if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK)
  {
    Error_Handler();
  }
  SDRAM_InitSequence();
}

void SDRAM_InitSequence(void)
{
  FMC_SDRAM_CommandTypeDef FMC_SDRAMCommandStructure;
  uint32_t tmpr = 0;
 
/* Step 3 --------------------------------------------------------------------*/
  /* Configure a clock configuration enable command */
  FMC_SDRAMCommandStructure.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;
  FMC_SDRAMCommandStructure.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
  FMC_SDRAMCommandStructure.AutoRefreshNumber = 1;
  FMC_SDRAMCommandStructure.ModeRegisterDefinition = 0;
  FMC_SDRAM_SendCommand(FMC_SDRAM_DEVICE, &FMC_SDRAMCommandStructure, 100);

  /* Step 4 --------------------------------------------------------------------*/
  /* Insert 100 ms delay */
  HAL_Delay(10);
   
  /* Step 5 --------------------------------------------------------------------*/
  /* Configure a PALL (precharge all) command */
  FMC_SDRAMCommandStructure.CommandMode = FMC_SDRAM_CMD_PALL;
  FMC_SDRAMCommandStructure.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
  FMC_SDRAMCommandStructure.AutoRefreshNumber = 1;
  FMC_SDRAMCommandStructure.ModeRegisterDefinition = 0;
  FMC_SDRAM_SendCommand(FMC_SDRAM_DEVICE, &FMC_SDRAMCommandStructure, 100);
 
  /* Step 6 --------------------------------------------------------------------*/
  /* Configure a Auto-Refresh command */
  FMC_SDRAMCommandStructure.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
  FMC_SDRAMCommandStructure.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
  FMC_SDRAMCommandStructure.AutoRefreshNumber = 4;
  FMC_SDRAMCommandStructure.ModeRegisterDefinition = 0;
  FMC_SDRAM_SendCommand(FMC_SDRAM_DEVICE, &FMC_SDRAMCommandStructure, 100);
  /* Step 7 --------------------------------------------------------------------*/
  /* Program the external memory mode register */
  tmpr = (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;
 
  /* Configure a load Mode register command*/
  FMC_SDRAMCommandStructure.CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
  FMC_SDRAMCommandStructure.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
  FMC_SDRAMCommandStructure.AutoRefreshNumber = 1;
  FMC_SDRAMCommandStructure.ModeRegisterDefinition = tmpr;
  FMC_SDRAM_SendCommand(FMC_SDRAM_DEVICE, &FMC_SDRAMCommandStructure, 100);
 
  /* Step 8 --------------------------------------------------------------------*/

  /* Set the refresh rate counter */
  /* (15.625 us x Freq) - 20 */
  /* Set the device refresh counter */
  FMC_SDRAM_ProgramRefreshRate(FMC_SDRAM_DEVICE, 1480);
}

Инициализация экрана TM057QDH01 V1.1 (640х480)

void 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 = 9;
  hltdc.Init.VerticalSync = 1;
  hltdc.Init.AccumulatedHBP = 144;
  hltdc.Init.AccumulatedVBP = 35;
  hltdc.Init.AccumulatedActiveW = 784;
  hltdc.Init.AccumulatedActiveH = 515;
  hltdc.Init.TotalWidth = 800;
  hltdc.Init.TotalHeigh = 525;
  hltdc.Init.Backcolor.Blue = 0;
  hltdc.Init.Backcolor.Green = 0;
  hltdc.Init.Backcolor.Red = 0;
  if (HAL_LTDC_Init(&hltdc) != HAL_OK)
  {
    Error_Handler();
  }

  pLayerCfg.WindowX0 = 0;
  pLayerCfg.WindowX1 = LCD_PIXEL_WIDTH;
  pLayerCfg.WindowY0 = 0;
  pLayerCfg.WindowY1 = LCD_PIXEL_HEIGHT;
  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 = 0xC0000000;
  pLayerCfg.ImageWidth = LCD_PIXEL_WIDTH;
  pLayerCfg.ImageHeight = LCD_PIXEL_HEIGHT;
  pLayerCfg.Backcolor.Blue = 0;
  pLayerCfg.Backcolor.Green = 0;
  pLayerCfg.Backcolor.Red = 0;
  if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)
  {
    Error_Handler();
  }

  pLayerCfg1.WindowX0 = 0;
  pLayerCfg1.WindowX1 = LCD_PIXEL_WIDTH;
  pLayerCfg1.WindowY0 = 0;
  pLayerCfg1.WindowY1 = LCD_PIXEL_HEIGHT;
  pLayerCfg1.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
  pLayerCfg1.Alpha = 0;
  pLayerCfg1.Alpha0 = 0;
  pLayerCfg1.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;
  pLayerCfg1.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
  pLayerCfg1.FBStartAdress = 0xC0500000;
  pLayerCfg1.ImageWidth = LCD_PIXEL_WIDTH;
  pLayerCfg1.ImageHeight = LCD_PIXEL_HEIGHT;
  pLayerCfg1.Backcolor.Blue = 0;
  pLayerCfg1.Backcolor.Green = 0;
  pLayerCfg1.Backcolor.Red = 0;
  if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg1, 1) != HAL_OK)
  {
    Error_Handler();
  }
 
  /* dithering activation */
  HAL_LTDC_EnableDither(&hltdc);

  /* LTDC configuration reload */ 
  HAL_LTDC_Reload(&hltdc, LTDC_RELOAD_IMMEDIATE);
}

Может кому пригодится.

11

AlexWonder, мы калокуб и спл не используем.

12

AlexWonder И HAL)

13

Жесткач :)

Пишите на АСМе?

14

AlexWonder, мы здесь изучаем работу периферии а не гламурное тырканье в г.либах...


Вы здесь » Микроконтроллеры » STM32 » LTDC,SDRAM,DMA2D