[ST_MICRO]/STM32F43x2015. 3. 7. 20:00

[STM32F439 LCD EVM] MAC RAW Mode 를 이용한 EtherCat Test

[STM32F439 LCD EVM] MAC RAW Mode 를 이용한 EtherCat Test





W5300을 이용하여 EhterCat 테스트 진행할 때 가장 문제가 된 사항은 지연 현상이었다. EtherCat 스팩 특성상 통신 지연에 대한 이슈가 가장 큰데 

알수 없는 이유로 가끔씩 전송 지연이 발생해서 문제가 되었다.

이부분을 해결하기 위해 찾아 보던중 IEE1588 에 "Low deterministic latency supports IEEE1588" 를 발견했고 TI의 TLK106이 이를 지원하는 PHY 이라고 한다.


TLK106L 스펙을 보면   

TLK106L Industrial 10/100 Ethernet PHY

 - Low deterministic latency supports IEEE1588 implementation

 - Error-Free 100Base-T Operation up to 150 Meters Under Typical Conditions



TLK110 을 이용하면 ST에서 레퍼런스 하고 있는 DP83848 와 핀호환이 된다고 하는데... 일단 사이즈 문제로 TLK106으로 선정해서 테스트 했다.

TLK106 Phy와 고속의 STM32F439를 이용하면 저렴한 EtherCat 솔루션이 되지 않을까 생각한다.



테스트 결과 기존에 W5300 MAC Law 모드에서 나타나던 지연 현상이 없어졌고 상당히 고속의 EtherCat 통신이 가능하게 되었다.






테스트 결과

Slave 를 adStar에서 MAC RAW모드 구동하고 최대 속도로 계속 전송했을때 STM32F439보드에서 수신하는 속도는 최대 24us 정도로 측정된다.

데이터가 깨지거나 지연현상 없이 파형이 출력된다.

1ms 이상이면 되므로 충분한것 같다.




STM32F439 MAC RAW Mode를 이용한 EtherCat 전송 테스트 동영상



Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F43x2015. 3. 7. 17:00

STM32F439 Ehternet 테스트

STM32F439 Ehternet 테스트


STM32 시리즈에는 Ethernet 을 위한 MAC 제어기가 포함되어 있고 외부에 Ethernet PHY만 연결하면 간단히 Ethernet 을 위한 제어가 가능하다.

STM32F439 EVM 보드에는 기본적으로 핀수가 줄어드는 RMII방식의 PHY가 포함되어 있고 경우에 따라서 기존에 제작해 둔 MII, RMII 모듈을 연결할 수 있는 커넥터가 있어 다양한 방법으로 이더넷 테스를 할 수 있다.

(참고로 STM32F439 EVM 보드에 내장되어 있는 PHY는  "Low deterministic latency supports IEEE1588" 를 지원하는 TI의 TLK106를 사용하였다.)





Ethernet Phy 연결하는방식에 따라 MII, RMII Mode로 가능하며 MII 방식은 25Mhz 클럭로 100T 전송이 가능하다.





RMII Mode에서는 데이터 라인이 절반으로 줄어들어서 9핀으로 가능하지만 클럭을 50Mhz를 공급해야 한다.

비용적인 측면을 고려 한다면 MII방식이 좀더 유리 한데 STM32F4의 내부 클럭에서 25Mhz공급하능하기 때문이다.

하지만 핀수를 줄여서 간단히 하고 싶다면 RMII 방식이 좋을것 같다.

테스트 용이라 RMII 방식으로 보드를 제작 했다.






STM32F429 Ethernet 초기화 코드


void HAL_ETH_MspInit(ETH_HandleTypeDef *heth)

  GPIO_InitTypeDef GPIO_InitStructure;

  

  /* Enable GPIOs clocks */

  __GPIOA_CLK_ENABLE();

  __GPIOB_CLK_ENABLE();

  __GPIOC_CLK_ENABLE();


  //Ethernet pins configuration

  /*

        ETH_MII_RX_CLK/ETH_RMII_REF_CLK---> PA1

        ETH_MDIO -------------------------> PA2

        ETH_MII_RX_DV/ETH_RMII_CRS_DV ----> PA7


        ETH_MII_TX_EN/ETH_RMII_TX_EN -----> PB11

        ETH_MII_TXD0/ETH_RMII_TXD0 -------> PB12

        ETH_MII_TXD1/ETH_RMII_TXD1 -------> PB13


        ETH_MDC --------------------------> PC1        

        ETH_MII_RXD0/ETH_RMII_RXD0 -------> PC4

        ETH_MII_RXD1/ETH_RMII_RXD1 -------> PC5

                                                  */


  /* Configure PA1, PA2 , PA7 */

  GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7;

  GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;

  GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;

  GPIO_InitStructure.Pull = GPIO_NOPULL ; 

  GPIO_InitStructure.Alternate = GPIO_AF11_ETH;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);


  /* Configure PB5 and PB8 */

  GPIO_InitStructure.Pin = GPIO_PIN_11 | GPIO_PIN_12| GPIO_PIN_13;

  HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);


  /* Configure PC1, PC2, PC3, PC4 and PC5 */

  GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5;

  HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);

                             

  /* Enable ETHERNET clock  */

  __ETH_CLK_ENABLE();

  

  if (heth->Init.MediaInterface == ETH_MEDIA_INTERFACE_MII)

  {

    /* Output HSE clock (25MHz) on MCO pin (PA8) to clock the PHY */

    HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);

  }

}




Ehternet 을위한 프로토콜 스텍은 ST에서 제공하는 LwIP Third Party Lib 예제를 이용하였다.


Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F43x2015. 3. 1. 23:30

STM32F439 LCD EVM - TFT LCD Test

STM32F439 LCD EVM - TFT LCD Test





STM32F429, STM32F439의 가장 큰 장점으로 TFT-LCD 컨트롤러가 내장되어 있어 1024x768 해상도의 TFT-LCD를 별도의 제어기 없이 연결할 수 있다. 물론 큰 LCD를 연결하려면 메모리 때문에 SDRAM을 연결해야 하는 부담이 있다.
여기서 조금 아쉬운점이 있는데 LCD메모리도 포함 시켜서 만들면 훨신더 경쟁력이 있지 않았을까? (adStar의 경우 TFT-LCD 컨트롤러 및 SDRAM이 한칩에 있어 가격이나 사이즈면에서 상당히 편리하다.)

24-bit RGB Parallel Pixel Output; 8 bits-per-pixel (RGB888)
- 2 display layers with dedicated FIFO (64x32-bit)
- Color Look-Up Table (CLUT) up to 256 color (256x24-bit) per layer
- Supports up to XGA (1024x768) resolution
- Programmable timings for different display panels
- Programmable Background color
- Programmable polarity for HSync, VSync and Data Enable
- Up to 8 Input color formats selectable per layer
- ARGB8888, RGB888, RGB565, ARGB1555, ARGB4444,
- L8 (8-bit Luminance or CLUT), AL44 (4-bit alpha + 4-bit luminance), AL88 (8-bit alpha + 8-bit luminance)




STM32F4 LTDC 핀맵







STM32F439  TFT-LCD 초기화 코드

uint8_t BSP_LCD_Init(void)

    /* LTDC Configuration ----------------------------------------------------*/

    LtdcHandler.Instance = LTDC;

    

    /* Configure horizontal synchronization width */

    LtdcHandler.Init.HorizontalSync = HSYNC;

    /* Configure vertical synchronization height */

    LtdcHandler.Init.VerticalSync = VSYNC;

    /* Configure accumulated horizontal back porch */

    LtdcHandler.Init.AccumulatedHBP = HBP;

    /* Configure accumulated vertical back porch */

    LtdcHandler.Init.AccumulatedVBP = VBP;

    /* Configure accumulated active width */

    LtdcHandler.Init.AccumulatedActiveW = ACTIVE_W-2;

    /* Configure accumulated active height */

    LtdcHandler.Init.AccumulatedActiveH = ACTIVE_H;

    /* Configure total width */

    LtdcHandler.Init.TotalWidth = TOTAL_WIDTH;

    /* Configure total height */

    LtdcHandler.Init.TotalHeigh = TOTAL_HEIGHT;


    

    /* Configure R,G,B component values for LCD background color */

    LtdcHandler.Init.Backcolor.Red= 0;

    LtdcHandler.Init.Backcolor.Blue= 0;

    LtdcHandler.Init.Backcolor.Green= 0;

    

    /* LCD clock configuration */

    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;

    PeriphClkInitStruct.PLLSAI.PLLSAIN = _PLLSAIN_CLK;

    PeriphClkInitStruct.PLLSAI.PLLSAIR = PLLSAIR_DIV;

    PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_2;

    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); 

    

    /* Polarity */

    LtdcHandler.Init.HSPolarity = LTDC_HSPOLARITY_AL;

    LtdcHandler.Init.VSPolarity = LTDC_VSPOLARITY_AL;

    LtdcHandler.Init.DEPolarity = LTDC_DEPOLARITY_AL;

    LtdcHandler.Init.PCPolarity = LTDC_PCPOLARITY_IPC;

    

    MspInit();

    HAL_LTDC_Init(&LtdcHandler); 

    


    /* Initialize the SDRAM */

    BSP_SDRAM_Init();


    /* Initialize the font */

    BSP_LCD_SetFont(&LCD_DEFAULT_FONT);


return LCD_OK;

}  






STM32F439 EVM TFT-LCD커넥터 핀맵






기존 7" TFT-LCD 모듈 커넥터 연결하여 다양한 LCD 테스트 가능하다.










STM32F439 TFT LCD 제어 예제

아래는 간단히 LCD 초기화 하고 LCD에 Text 표시하는 예제이다.


#if _USE_TFTLCD_
    LCD_BackLightInit();  
    
    //LCD초기화
    BSP_LCD_Init();

    /* Layer2 Init */
    BSP_LCD_LayerDefaultInit(1, LCD_FRAME_BUFFER_LAYER1);
    /* Set Foreground Layer */
    BSP_LCD_SelectLayer(1);
    /* Clear the LCD */
    BSP_LCD_Clear(LCD_COLOR_GREEN);  
    BSP_LCD_SetColorKeying(1, LCD_COLOR_RED);
    BSP_LCD_SetLayerVisible(1, DISABLE);

    /* Layer1 Init */
    BSP_LCD_LayerDefaultInit(0, LCD_FRAME_BUFFER_LAYER0);

    // Set Foreground Layer
    BSP_LCD_SelectLayer(0);

    // Enable The LCD 
    BSP_LCD_DisplayOn();

    // Clear the LCD 
    BSP_LCD_Clear(LCD_COLOR_BLUE);
    
    BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
    BSP_LCD_SetTextColor(LCD_COLOR_WHITE);


    BSP_LCD_DrawRect(0,0, LCD_WIDTH-1, LCD_HEIGHT-1);
    BSP_LCD_DisplayStringAtLine(0, "STM32F429- EtherCat Test");
#endif


코드 다운로드 하고 테스트 해보면 아래와 같이 TFT-LCD에 출력 되는것을 확인 할수 있다. STM32F439에서 TFT-LCD출력을 위한 기본 셋팅은 구성되었으므로 앞으로 여러가지 테스트 예제를 작성해 가면서 테스트 해보자.





STM32F439 TFT LCD 제어 테스트 예제 동영상

SD Card에 있는 BMP파일을읽어 TFT LCD에 출력하는 동영상









Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F43x2015. 3. 1. 22:30

STM32F439 SDRAM 테스트

STM32F439 SDRAM 테스트


STM32F4는 FSMC(Flexible static memory controller)를 지원하는데 STMF439에서는 SDRAM을 지원하기 위해 FMC (Flexible memory controller )로 변경되었다. 당연히 코드 수정이 필요하다.


- NOR/PSRAM memory controller

- NAND/PC Card memory controller

- Synchronous DRAM (SDRAM/Mobile LPSDR SDRAM) controller






[STM32F439 EV] 보드에서 SDRAM 핀맵 할당 

SDRAM Bank는 2채널 할당 되어 있는데 STM32F439 EV 보드에서는 FMC_SDNE1 (0xD000 0000) 에 할당해서 제작 했다.


FMC_SDNE0->(PC2, PH3)

FMC_SDNE1->(PB6, PH6)






STM32F439  SDRAM 초기화 코드


 static DMA_HandleTypeDef dmaHandle;

  GPIO_InitTypeDef GPIO_InitStructure;

  SDRAM_HandleTypeDef  *hsdram = &SdramHandle;


  /* Enable FMC clock */

  __FMC_CLK_ENABLE();


  /* Enable chosen DMAx clock */

  __DMAx_CLK_ENABLE();


  /* Enable GPIOs clock */

  __GPIOB_CLK_ENABLE();

  __GPIOC_CLK_ENABLE();

  __GPIOD_CLK_ENABLE();

  __GPIOE_CLK_ENABLE();

  __GPIOF_CLK_ENABLE();

  __GPIOG_CLK_ENABLE();



  /* Common GPIO configuration */

  GPIO_InitStructure.Mode  = GPIO_MODE_AF_PP;

  GPIO_InitStructure.Speed = GPIO_SPEED_FAST;

  GPIO_InitStructure.Pull  = GPIO_NOPULL;

  GPIO_InitStructure.Alternate = GPIO_AF12_FMC;


  /* GPIOB configuration */

  GPIO_InitStructure.Pin = GPIO_PIN_5 | GPIO_PIN_6;

  HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);  


  /* GPIOC configuration */

  GPIO_InitStructure.Pin = GPIO_PIN_0;      

  HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);  

  

  /* GPIOD configuration */

  GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 |  GPIO_PIN_7 |\

                                GPIO_PIN_8| GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15;

  HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);


  /* GPIOE configuration */

  GPIO_InitStructure.Pin = GPIO_PIN_0  | GPIO_PIN_1  | GPIO_PIN_7 |

                           GPIO_PIN_8  | GPIO_PIN_9  | GPIO_PIN_10 |

                           GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 |

                           GPIO_PIN_14 | GPIO_PIN_15;

  HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);


  /* GPIOF configuration */

  GPIO_InitStructure.Pin = GPIO_PIN_0  | GPIO_PIN_1 | GPIO_PIN_2 | 

                           GPIO_PIN_3  | GPIO_PIN_4 | GPIO_PIN_5 |

                           GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 |

                           GPIO_PIN_14 | GPIO_PIN_15;

  HAL_GPIO_Init(GPIOF, &GPIO_InitStructure);


  /* GPIOG configuration */

  GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_3 | GPIO_PIN_4 |

                           GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_15;

  HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);


  /* Configure common DMA parameters */

  dmaHandle.Init.Channel             = SDRAM_DMAx_CHANNEL;

  dmaHandle.Init.Direction           = DMA_MEMORY_TO_MEMORY;

  dmaHandle.Init.PeriphInc           = DMA_PINC_ENABLE;

  dmaHandle.Init.MemInc              = DMA_MINC_ENABLE;

  dmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;

  dmaHandle.Init.MemDataAlignment    = DMA_MDATAALIGN_WORD;

  dmaHandle.Init.Mode                = DMA_NORMAL;

  dmaHandle.Init.Priority            = DMA_PRIORITY_HIGH;

  dmaHandle.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;

  dmaHandle.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;

  dmaHandle.Init.MemBurst            = DMA_MBURST_SINGLE;

  dmaHandle.Init.PeriphBurst         = DMA_PBURST_SINGLE; 

  

  dmaHandle.Instance = SDRAM_DMAx_STREAM;

  

  /* Associate the DMA handle */

  __HAL_LINKDMA(hsdram, hdma, dmaHandle);

  

  /* Deinitialize the stream for new transfer */

  HAL_DMA_DeInit(&dmaHandle);

  

  /* Configure the DMA stream */

  HAL_DMA_Init(&dmaHandle); 

  

  /* NVIC configuration for DMA transfer complete interrupt */

  HAL_NVIC_SetPriority(SDRAM_DMAx_IRQn, 0, 0);

  HAL_NVIC_EnableIRQ(SDRAM_DMAx_IRQn);




STM32F439 SDRAM 테스트 예제

STM32F439에서 SDRAM를 이용하는 가장 큰 이유는 TFT-LCD Controller 를 사용하기 위해서 이다. SDRAM 메모리에 LCD 레이어 메모리를 할당해 주면 LCD 컨트롤러가 DMA를 이용하여 LCD메모리 공간으로 사용 가능하도록 해준다.


#define LCD_FRAME_BUFFER               ((uint32_t)0xD0000000)

#define LCD_FRAME_BUFFER_LAYER1                  LCD_FRAME_BUFFER


void InitLCD(void)

{

    //LCD초기화

    BSP_LCD_Init();


    /* Layer2 Init */

    BSP_LCD_LayerDefaultInit(1, LCD_FRAME_BUFFER_LAYER1);

}






또하나의 SDRAM 사용방법으로 BMP파일과 같이 메모리를 많이 차지하는 데이터를 올려두고 사용하면 고속 처리에 있어 편이하게 사용할 수 있다.


//SDRAM Address

#define SDRAM_DEVICE_ADDR          ((uint32_t)0xD0000000)

#define SDRAM_DEVICE_SIZE          ((uint32_t)0x800000)  


#define LCD_FRAME_BUFFER_LAYER1                  LCD_FRAME_BUFFER



#define MAX_LAYER_NUMBER        2

#define LCD_FRAME_BUFFER        SDRAM_DEVICE_ADDR 

#define BUFFER_OFFSET           (uint32_t)(800*400)



void InitBmpFileRead(void)

{

    //SDRAM의 임의번지

    ImageBuffer = (uint8_t *)BUFFER_OFFSET+LCD_FRAME_BUFFER;

}





Posted by nexp

댓글을 달아 주세요