[ST_MICRO]/STM32F42011. 12. 6. 23:30

[STM32F4] W5100/W5200 TPC/IP Loopback 전송 속도 테스트

[STM32F4] W5100/W5200 TPC/IP Loopback 전송 속도 테스트



SPI 최대 클럭 21Mhz에서 3.5Mbps 정도 나온다.
빠르긴 한데.. 아쉬운 점은 168Mhz MCU인데 속도가 기대한 만큼은 나오지 않는것 같다.
(PIC32 CP/IP 전송 속도 테스트 결과 와 비교하면 80Mhz PIC32가 더 빠르게 나온다)

SPI클럭 설정을 좀더 자유롭게 할 수 있으면 좋을것 같은데....
SPI FIFO가 없어 그런것 같은데... DMA를 이용하면 좀더 빨라지지 않을까?

------------------------------------------------------------
[7] iInChip Send: 3.5567 Mbps(5278574 bytes, 11.3230 sec)
iInChip Recv: 3.5074 Mbps(5278574 bytes, 11.4822 sec)
------------------------------------------------------------
[8] iInChip Send: 3.5647 Mbps(5278574 bytes, 11.2975 sec)
iInChip Recv: 3.3565 Mbps(5278574 bytes, 11.9982 sec)
--------------------------------------------------------






Cortex-M4 STM32F405 의 W5200 HAL Driver 코드
//-----------------------------------------------------------------------------
// W5100 HAL
#define _SPI1_ENABLE     1

#define W5100_CS_PORT     GPIOB
#define W5100_CS_BIT     BIT12

#define W5100_RST_PORT     GPIOA
#define W5100_RST_BIT     BIT0

#define IINCHIP_RSToff()    cbi(W5100_RST_PORT, W5100_RST_BIT) 
#define IINCHIP_RSTon()     sbi(W5100_RST_PORT, W5100_RST_BIT)

#define W5100_IO_INIT()     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);\
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;\
          GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;\
          GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\
          GPIO_InitStructure.GPIO_Pin=W5100_CS_BIT;\
          GPIO_Init(GPIOB, &GPIO_InitStructure);\
          GPIO_InitStructure.GPIO_Pin=W5100_RST_BIT;\
          GPIO_Init(GPIOA, &GPIO_InitStructure);


#define IINCHIP_CSoff()     cbi(W5100_CS_PORT, W5100_CS_BIT) 
#define IINCHIP_CSon()     sbi(W5100_CS_PORT, W5100_CS_BIT)

#define IINCHIP_SPI_INIT()    SPI1_Init();IINCHIP_SpiSpeed()
#define IINCHIP_SpiSendData    SPI1_WriteReadByte
#define IINCHIP_SpiRecvData    SPI1_WriteReadByte
#define IINCHIP_SpiSpeed()              SPI1_SetSpeed(SPI_SPEED_MAX)
//-----------------------------------------------------------------------------
Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F42011. 12. 6. 22:00

[STM32F4] STM32F405 TFT LCD 출력 테스트

[STM32F4] STM32F405 TFT LCD 출력 테스트



STM32F103 EVM] 보드와 핀맵이 동일하기 때문에 기존 확장 보드에서 TFT LCD테스트 가능하다.
GPIO 최대 클럭으로 제어시 LCD가 동작을 하지 않는다. 이때 1프레임 출력시간은 4ms로 너무 빨라서 GPIO로는 타이밍을 맞추기 힘든것 같다.  약간의 지연시간을 주니 정상 동작하고 1프레임 출력 시간은 8ms 정도 된다. 상당히 빠른것 같다.
 (메모리 버스 타입이 아니라 딜레이는 더이상 줄이기 힘든것 같다.)

STM32F4 TFT LCD 출력 속도 테스트 동영상





STM32F4 TFT LCD BMP 파일 출력 테스트 동영상

SPI를 이용하여 SD Card의  BMP 파일 출력 테스트
Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F42011. 12. 6. 21:00

[STM32F4] SPI 테스트

[STM32F4] SPI 테스트
STM32F4  의 SPI는 3채널이 있고 37.5Mbits/s 로 고속 전송이 가능해 졌다고 한다.


STM32F4 SPI 블록도




STM32F4 소프트웨어는 STM32F103과 거의 호환 가능하다. 초기화 부분에 GPIO설정 부분만 수정하면 문제 없이 동작한다.
SPI클럭을 최대로 설정하니 42Mhz 정도 나온다.


STM32F4 SPI 초기화 함수
void SPI0_Init(void)
{
 SPI_InitTypeDef   SPI_InitStructure;
 GPIO_InitTypeDef GPIO_InitStructure;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
   
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

 // Set SPI interface
 SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
 SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
 SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
 SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;
 SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;
 SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
 SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_64;
 SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
 SPI_InitStructure.SPI_CRCPolynomial=7;

 SPI_Init(SPI1,&SPI_InitStructure);
 SPI_Cmd(SPI1,ENABLE);     //Enable  SPI1
}



STM32F4 SPI Wrire 함수
unsigned char SPI0_WriteReadByte(unsigned char Data)
{
    while((SPI1->SR & SPI_I2S_FLAG_TXE) == RESET);
   
    SPI1->DR =  Data;
    while((SPI1->SR & SPI_I2S_FLAG_RXNE) == RESET);
   
    return (SPI1->DR);
}



Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F42011. 12. 5. 22:30

[STM32F4] Timer Test - SysTick 테스트

[STM32F4] Timer Test - SysTick 테스트
SM32F4 는 최대 17개의 타이머가 있다. 최대 168Mhz로 동작하고 16bit/32bit의  성능 또한 멋지다.

17 timers: up to twelve 16-bit and two 32-bit timers up to 168 MHz, each with up to 4 IC/OC/PWM or pulse counter and quadrature
(incremental) encoder input


STM32F4 Timer (SysTick)예제 소스코드
#include "system.h"
#include "serial.h"

volatile unsigned int gTimeTick1_1ms = 0;

//-------------------------------------------------------
//SYSTick Timer Interrupt Handler
void SysTick_Handler(void)
{
    gTimeTick1_1ms++;
}
//-------------------------------------------------------


int main(void)
{
    Led1Init();
    Led2Init();
    Led1On();
    Led2On();   
   
    //Serial Init
    DebugInit(BAUD_115200);
    DebugPrint("STM32F4 Timer Test(CLK=%ld).\r\n", SystemCoreClock);   
   
    //SysTickTimer 초기화 - 1ms
    SysTick_Config(SystemCoreClock / 1000);

    while (1)
    {
        if(gTimeTick1_1ms>1000)
        {
            gTimeTick1_1ms = 0;
           
            Led1Toggle();
        }
    }

Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F42011. 12. 5. 21:30

[STM32F4] UART 테스트

[STM32F4] UART 테스트



STM32F4 의 USART는 4채널이고 UART가 두채널 더 늘어 났다. 전송율도 두배 정도 증가된 10.5Mpbs로 쓰일곳이 많을 것 같다.
 
4 USARTs/2 UARTs (10.5 Mbit/s, ISO 7816 interface, LIN, IrDA, modemcontrol)

(아쉬운 점은 UART FIFO가 없다. 물론 DMA를 이요하여 SRAM에 저장해도 되지만 다른 MCU에 다 있는 FIFO없는것이 좀...)







STM32F4 UART 초기화 함수
void U0_Init(unsigned char baud)
{
    USART_InitTypeDef USART_InitStructure;

    USART_InitStructure.USART_BaudRate = baud_rate;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
   
    //STM_EVAL_COMInit(COM1, &USART_InitStructure);
   
//   GPIO_InitTypeDef GPIO_InitStructure;

  /* Enable GPIO clock */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

  /* Connect PXx to USARTx_Tx*/
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);

  /* Connect PXx to USARTx_Rx*/
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

  /* Configure USART Tx as alternate function  */
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure USART Rx as alternate function  */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* USART configuration */
  USART_Init(USART1, &USART_InitStructure);
   
  /* Enable USART */
  USART_Cmd(USART1, ENABLE);
}



STM32F4 UART 송수신 함수
//한문자 수신
unsigned char U0_GetByte(void)
{
 while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
 return (u8)USART1->DR;; 
}

//한문자 전송
void U0_PutByte(unsigned char Data)
{
 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
 USART_SendData(USART1, Data);
}




STM32F4 UART 테스트 예제 코드
//=============================================================================
// STM32F4 EVM Module Test Program
// by nexp76() http://nexp.tistory.com/
// [main.c]
//=============================================================================

/*
 - STM32 EVM  USART0 Test
*/

#include "system.h"
#include "serial.h"


//-----------------------------------------------------------------------------
int main(void)
{
    //System Init
 SystemInit();
 
    //LED Init
 Led1Init();
 Led1On();
 
 //Serial Init
 DebugInit(BAUD_115200);
 DebugPrint("Serial Test Program.\r\n");

 while (1)
 {
  switch(U0_GetByte())
  {
  case '0':
     Led1Off();
   DebugPrint("LED OFF\r\n");
     break;

  case '1':
   Led1On();

   DebugPrint("LED ON\r\n");   
     break;
  }  
 }
}
//-----------------------------------------------------------------------------

Posted by nexp

댓글을 달아 주세요