STM32F429 - W5300 을 이용한 TCP/IP 전송 속도 테스트



STM32F429 는 최대 180Mhz로 구동된다. W5300을 이용하여 TCP/IP 전송 속도 테스트 결과 37Mbps 정도로 측정된다.




STM32F429 W5300 드라이버 코드

//-----------------------------------------------------------------------------

#define W5300_BANK_ADDR                 ((uint32_t)0x64000000)

#define W5300_DATA_ADDR                 (*(uint16_t *) (W5300_BANK_ADDR))

                                        

#define _W5300_DATA(p)                    (*(__IO uint16_t*) (W5300_BANK_ADDR + (p<<1)))


#define W5300_RST_PORT GPIOA

#define W5300_RST_BIT BIT9


#define IINCHIP_RSToff() cbi(W5300_RST_PORT, W5300_RST_BIT)

#define IINCHIP_RSTon() sbi(W5300_RST_PORT, W5300_RST_BIT)



#define W5300_IO_INIT()

//-----------------------------------------------------------------------------





STM32F4 타이머 인터럽트 테스트



STM32F4에서 TIM2, TIM5는 32bit 타이머 모드를 지원한다. 이를 이용하여 1초 만들기 테스트를 해 보았다.




STM32F4 타이머 인터럽트 초기화 함수

void TimerInit2(void)

{

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    TIM_OCInitTypeDef  TIM_OCInitStructure;


    uint16_t PrescalerValue = 0;


    NVIC_InitTypeDef NVIC_InitStructure;


    /* TIM2 clock enable */

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);


    /* TIM2 gloabal Interrupt 초기화 */

    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);


    //--------------------------------------------------------------------------

    /* Compute the prescaler value */

    PrescalerValue = (uint16_t) ((SystemCoreClock / 2) / 6000000) - 1; 


    /* Time base configuration */

    TIM_TimeBaseStructure.TIM_Period = (6000-1);   //Autoreload value (ARR) -> 1ms

    TIM_TimeBaseStructure.TIM_Prescaler = (6000-1);

    TIM_TimeBaseStructure.TIM_ClockDivision = 0;

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;


    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);


    /* Prescaler configuration */

    TIM_PrescalerConfig(TIM2, PrescalerValue, TIM_PSCReloadMode_Immediate);



    /* TIM Interrupts enable */

    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);


    /* TIM2 enable counter */

    TIM_Cmd(TIM2, ENABLE);

    //--------------------------------------------------------------------------    

}




STM32F4 타이머 인터럽트 핸들러

void TIM2_IRQHandler(void)

{

if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)

{

TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

        Led2Toggle();

}  

}




STM32F439 보드 테스트 - 주의사항




STM32F439 보드 제작해서 연결했는데 쇼트가 발생한다.
데이터 시트를 보니 STM32F4와는 좀더 다른점이 있다. STM32F4데이터 시트에는 99번핀이 VDD or VSS라 되어 있는데...
STM32F439에는 VSS로 되어 있다. (주의할 필요가 있다.)
 

STM32F4x







STM32F439


CortexM4 STM32F439 출시

[ST_MICRO]/STM32F43x | 2013.08.09 18:02
Posted by nexp

CortexM4 STM32F439 출시

ST사의 새로운 CortexM4인 STM32F439가 출시되었다.

시스템 클럭이 160Mhz에서 180Mhz로 올랐고 플래시 메모리도 2M, SRAM도 256K로 성능이 업그레이드 되었다.


그리고 가장큰 특징으로 TFT LCD Controller가 추가되었다.

SPI도 클럭과 채널이 6채널로 업되었다. SAI도 추가되었다.

아무튼 이정도면 최고 사양인듯하다.


- 180 MHz ( 225 DMIPS)

- 2 MB of Flash memory

- 256+4 KB of SRAM

LCD-TFT controller

 up to SVGA resolution with dedicated Chrom-ART Accelerator™ for enhanced graphic content creation (DMA2D)

3 SPIs (37.5 Mbits/s), Up to 6 SPIs (45 Mbits/s)

1 x SAI (serial audio interface)




STM32F4 - VS1053 MP3 Module Test

[ST_MICRO]/STM32F4 | 2013.04.27 21:30
Posted by nexp

 STM32F4 - VS1053 MP3 Module Test

 

 

 

STM32F4 를 이용하여 MP3출력시 소비 전류 측정을 위해 [LCD-EXP EVM] 보드를 이용하여 테스트 했다.

 

SPI클럭을 1.2mhz로 구동하고 클럭 분주를 1/2 로 설정하니 전류가 80mA -> 65mA로 줄어 들었다.


클럭을 좀더 낮추니 (1/4) 60mA로 줄어 든다. 이 상태에서도 MP3출력은 잘된다.
이때 SPI클럭을 좀더 올려 줬다.
SPI1_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_8;

static void SetSysClock(void)
{
 :

    /* HCLK = SYSCLK / 1*/
//    RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
    RCC->CFGR |= RCC_CFGR_HPRE_DIV4; 

:

}

 


사용하지 않는 페리 끌수 있으면 좀더 줄지 않을까...

저전력 MCU가 아니라서 옵션이 많지 않은것이 아쉽다.

 

[LCD-EXP EVM] 회로도


 

 

[STM32F4 EVM] VS1053 제어 드라이버 코드

 

//-----------------------------------------------------------------------------
// SD Card HAL
#define _DEBUG_FAT_FILE                 0


#define MMC_CS_PORT      GPIOA
#define MMC_CS_BIT      BIT7

#define MMC_CS_INIT()     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);\
          GPIO_InitStructure.GPIO_Pin = MMC_CS_BIT|BIT4|BIT5;\
          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_Init(GPIOA, &GPIO_InitStructure);Sbi(PORTA, BIT4|BIT5)
         
#define MMC_CS_HIGH()     sbi(MMC_CS_PORT, MMC_CS_BIT)
#define MMC_CS_LOW()     cbi(MMC_CS_PORT, MMC_CS_BIT)
#define MMC_ASSERT_INIT()    MMC_CS_INIT();MMC_CS_HIGH()
#define MMC_ASSERT()     MMC_CS_LOW()
#define MMC_DEASSERT()     MMC_CS_HIGH()


#define MMC_SpiInit()     SPI1_Init()
#define MMC_SendByte     SPI1_WriteReadByte
#define MMC_Send(Data)      SPI1_WriteByte(Data)
#define MMC_Recv()      SPI1_WriteReadByte(0xFF)
#define MMC_RecvP(Data)     MMC_Send(0xFF); (*(Data)=SPI1_ReadByte())
#define MMC_SPISpeed     SPI1_SetSpeed

#define SPI_Mode3()

#define FAT_MAX_NUM_FILE          50

#define FCLK_SLOW()             MMC_SPISpeed(SPI_SPEED_1MHZ) 
#define FCLK_FAST()             MMC_SPISpeed(SPI_SPEED_MAX)
//-----------------------------------------------------------------------------

 


//-----------------------------------------------------------------------------
// VS1053 Drvier
//-----------------------------------------------------------------------------
#define VS_DREQ_BIT          BIT6
#define VS_DREQ_PORT         PORTA

#define VS_CS_BIT          BIT5
#define VS_CS_PORT          PORTA


#define VS_RST_BIT      
#define VS_RST_DDR      
#define VS_RST_PORT      


#define VS1003_DREQ()           ((GPIOA->IDR&VS_DREQ_BIT))


#define VS1003_CS_H()      Sbi(VS_CS_PORT, VS_CS_BIT)
#define VS1003_CS_L()      Cbi(VS_CS_PORT, VS_CS_BIT)

#define vs1003_enable()      VS1003_CS_L()
#define vs1003_disable()     VS1003_CS_H()

#define VS_XDCS_BIT          BIT4
#define VS_XDCS_PORT         GPIOA
#define VS1003_XDCS_H()      sbi(VS_XDCS_PORT, VS_XDCS_BIT)
#define VS1003_XDCS_L()      cbi(VS_XDCS_PORT, VS_XDCS_BIT)


#define VS1003_RESET_H()     //Sbi(VS_RST_PORT, VS_RST_BIT)
#define VS1003_RESET_L()     //Cbi(VS_RST_PORT, VS_RST_BIT)

#define IsVs1003DataReady()     (GPIOA->IDR&VS_DREQ_BIT)

#define VS_SendByte       SPI1_WriteReadByte
#define VS_InitSpi()      //SPI1_Init()
#define VS_SpiSpeed_Low()        SPI1_SetSpeed(SPI_SPEED_1MHZ)
#define VS_SpiSpeed_High()     SPI1_SetSpeed(SPI_SPEED_4MHZ)


#define MP3_PORT_INIT()         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);\
              GPIO_InitStructure.GPIO_Pin = BIT4|BIT5;\
              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_Init(GPIOA, &GPIO_InitStructure);\
              GPIO_InitStructure.GPIO_Pin = VS_DREQ_BIT;\
                                            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;\
              GPIO_Init(GPIOA, &GPIO_InitStructure);\
                                            VS1003_CS_H();VS1003_XDCS_H()
//-----------------------------------------------------------------------------

[STM32F4] I2C 테스트 - 3축 가속도 센서 TFT LCD 출력

 

 

3축 가속도 센서를 테스트 해야할 일이 있어 STM32F407 보드를 이용하여 I2C 테스트를 해보았다. 기존 STM32F103 I2C 테스트 코드과 크게 차이 없이 테스트 가능했다.

 

[EXP-NET EVM] 보드에는 I2C(SPI)로 연결되는 자이로, 가속도, 온도, 압력 센서등의 모듈을 연결할 수 있는 표준핀맵 커넥터가 있다.

 

 

 

 

SM-Type EVM 에는 핀 8번에, M-Type EVM에는 핀 13번에 각각 CS핀이 할당되어 있다.

 

 

 

STM32F4 I2C테스트 동영상

STM32F407 을 이요하여 3가속도 센서의 데이터를 TFT-LCD에 그래프로 표시하는 테스트 예제




STM32F4 I2C 초기화 코드

void i2c_init1(unsigned int Speed)
{
 I2C_InitTypeDef  I2C_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);     
    //Configure I2C2 pins: SCL and SDA
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6| GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;    
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;    
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    //Connect pins to I2C peripheral
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1);  
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1);

    //I2C2 and I2C2 Periph clock enable
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

    I2C_DeInit(I2C1);    
 
    //I2C2 configuration
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_OwnAddress1 = 0x33;
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_ClockSpeed = Speed;
    I2C_Cmd(I2C1, ENABLE);
    I2C_Init(I2C1, &I2C_InitStructure);
}

 

 

STM32F4 가속도 센서 I2C 제어 코드 

//-----------------------------------------------------------------------------

// myAccel3LV02 HAL

#define MY_ACCEL3LV02_SPI_MODE 0

#define MY_ACCEL3LV02_I2C_MODE 1


//#define ACCEL_CS_BIT BIT6

//#define ACCEL_CS_PORT PORTB


#define ACCEL_CS_BIT BIT11

#define ACCEL_CS_PORT PORTE


#define ACCEL_CS_INIT() RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);\

GPIO_InitStructure.GPIO_Pin=ACCEL_CS_BIT;\

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;\

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;\

GPIO_Init(GPIOC, &GPIO_InitStructure);\

ACCEL_CS_DEASSERT()

#define ACCEL_CS_ASSERT() Cbi(ACCEL_CS_PORT, ACCEL_CS_BIT)

#define ACCEL_CS_DEASSERT() Sbi(ACCEL_CS_PORT, ACCEL_CS_BIT)


#define ACCEL_SPI_INIT() SPI0_Init()

#define ACCEL_Read SPI0_WriteReadByte

#define ACCEL_Write SPI0_WriteReadByte



#define myAccelI2C_INIT                 i2c2_init

#define myAccelI2C_START                i2c2_start

#define myAccelI2C_WRITE                i2c2_write

#define myAccelI2C_READ_NAK             i2c2_readNak

#define myAccelI2C_STOP                 i2c2_stop



//-----------------------------------------------------------------------------
//myAccel3LV02의 특정 레지스터에서 데이터를 읽어옴
unsigned char myAccel3lvRead(unsigned char reg)

 unsigned char data = 0; 
 
 myAccelI2C_START(LIS3L02_I2C_ADDR+I2C_WRITE);     // device address 및 write mode 설정
 myAccelI2C_WRITE(reg);

    // 레지스터 설정
 myAccelI2C_START(LIS3L02_I2C_ADDR+I2C_READ);       // device address 및 read mode 설정
   
 data = myAccelI2C_READ_NAK(); 
 myAccelI2C_STOP(); 


 return data;
}

 

//myAccel3LV02의 특정 레지스터에 데이터를 기록
void myAccel3lvWrite(unsigned char reg, unsigned char data)
{
 myAccelI2C_START(LIS3L02_I2C_ADDR+I2C_WRITE);     // device address 및 write mode 설정
 myAccelI2C_WRITE(reg);         // 레지스터 설정
 myAccelI2C_WRITE(data);        // 데이터 출력
 myAccelI2C_STOP();  
}

 

[STM32F4] STM32F4 Discovery Board SWD 핀맵

 

 

Discovery Board SWD 핀맵은 아래와 같다

 

 

 

다른 보드에 사용할때 아래 핀맵으로 사용하면 된다.

 

 

 

Discovery Board SWD  커넥터와 STM32F4 테스트 보드연결 

주의) STM32F4 Boot 모드에서 동작해야 디버깅 가능하다.

 

 

 


IAR 개발환경 설정

 

 ST-LINK 선택

 

 

 

Flash Downloader설정

 $TOOLKIT_DIR$\config\flashloader\ST\FlashSTM32F4xxx.board

 

 

 

 

 

 

 

 

참고로 ST-LINK는 아래 링크에서 저렴하게 구매할 수 있다.

http://www.icbank.com/shop/default.asp?file=product_detail.asp&prod_code=P001880480

 

[STM32F4] FPU테스트 - Julia Set Fractal calculation TFT LCD 출력

 

STM32F4 는 플로팅 포인트 연산을 하드웨어로 처리하는 FPU가 있다.

DSP도 아닌 저렴한 MCU에서 FPU를 사용할 수 있다는것은 상업용 MCU개발자에게 상당히 메리트 있는 소식이다.

 

우선 간단히 FPU의 성능을 테스트 해 보았다.

float function1(float number1, float number2)
{
    float temp1, temp2;
    temp1 = number1 + number2;
    temp2 = number1/temp1;
    return temp2;
}

 

 

STM32F4 를 이용하여 컴파일 해 보면 아래와 같이 플로팅 포인트 연산을 한 명령어에 처리하는것을 확인 할 수 있다.

      5          float function1(float number1, float number2)
      6          {
      7              float temp1, temp2;
      8              temp1 = number1 + number2;
      9              temp2 = number1/temp1;
     10              return temp2;
   \                     function1:
   \   00000000   70EE200A           VADD.F32 S1,S0,S1
   \   00000004   80EE200A           VDIV.F32 S0,S0,S1
   \   00000008   7047               BX       LR               ;; return
     11          }

 

 

 

FPU가 없는 STM32F103에서 동일한 코드를 컴파일 하면 플로팅 포인트 라이브러리 함수를 호출하는것을 확인 할 수 있다.

      9          float function1(float number1, float number2)
     10          {
   \                     function1:
   \   00000000   10B5               PUSH     {R4,LR}
   \   00000002   0446               MOV      R4,R0
   \   00000004   0846               MOV      R0,R1
     11              float temp1, temp2;
     12              temp1 = number1 + number2;
     13              temp2 = number1/temp1;
     14              return temp2;
   \   00000006   2146               MOV      R1,R4
   \   00000008   ........           BL       __aeabi_fadd
   \   0000000C   0146               MOV      R1,R0
   \   0000000E   2046               MOV      R0,R4
   \   00000010   BDE81040           POP      {R4,LR}
   \   00000014   ........           B.W      __aeabi_fdiv
     15          }

 

 

 

FPU를 사용하지 않았을때와 비교하면 17.9배 정도의 성능차이가 보인다고 한다.(실제 아래 동영상을 보면 10배 이상 차이나는것을 확인할 수가 있다.)

 

 

 

 

STM32F4 FPU테스트 소스코드

int main(void)
{
    float ret;
   
    Led1Init();
    Led1On();
  
    //Serial Init
    DebugInit(BAUD_115200);
    DebugPrint("STM32F4 FPU Program.\r\n");   
   
    ret = function1(5.1, 15.4);
    DebugPrint("result = %f.\r\n", ret);   
   
    while (1)
    {
        Led1On();
        Delay(100);
       
       
        Led1Off();
        Delay(100);
    }
}

 

 

 

STM32F4 FPU테스트 동영상

좀더 확실한 효과를 위해 STM32F405를 이용하여 Julia Set Fractal을 TFT LCD에 출력해 보았다. 400x240 화면에 한프레임씩 출력하도록 했는데 1프레임 출력 시간이 200ms 정도 된다. 상당히 빠르다.

(참고로 FPU가 없는 STM32F103으로 동일 코드 실행시 4000ms 정도 걸렸다. STM32F103은 메모리가 부족해서 화면출력을 반만 했는데도 오래 걸리는데 풀스크린으로 출력하면 훨씬 더 오래 걸린다.)

 

 

 

 

 

Julia Set Floating point 생성코드

void GenerateJulia_fpu(uint16_t size_x, uint16_t size_y, uint16_t offset_x, uint16_t offset_y, uint16_t zoom, uint8_t * buffer)
{
  float       tmp1, tmp2;
  float       num_real, num_img;
  float       rayon;

  uint8_t       i;
  uint16_t        x, y;

  for (y = 0; y < size_y; y++)
  {
    for (x = 0; x < size_x; x++)
    {
      num_real = y - offset_y;
      num_real = num_real / zoom;
      num_img = x - offset_x;
      num_img = num_img / zoom;
      i = 0;
      rayon = 0;
      while ((i < ITERATION - 1) && (rayon < 4))
      {
        tmp1 = num_real * num_real;
        tmp2 = num_img * num_img;
        num_img = 2 * num_real * num_img + IMG_CONSTANT;
        num_real = tmp1 - tmp2 + REAL_CONSTANT;
        rayon = tmp1 + tmp2;
        i++;
      }
      /* Store the value in the buffer */
      buffer[x+y*size_x] = i;
    }
  }
}  

[STM32F4-100 EVM] USB Host 보드 제작


STM32F407/STM32F17 , STM32F2는 USB Host기능을 지원하는데, STM32F1, STM32F2, STM32F4를 모두 사용할 수 있는 보드를   [M-Type EVM] 형태로 새롭게 제작했다.




USB Device/Host 기능 모두 지원 할수 있도록 커넥터를 배치 했다.



STM32시리즈는 UART 프로그램이 가능하기 때문에 USB2UART 연결할 수 있는 커넥터를 연결할 수 있다.



STM32F4 확장 테스트 보드
[M-Type EVM] 표준 핀맵이므로 기존 확장 테스트 보드에 연결하여 테스트 가능하다.



[LCD_EXP_EVM] 보드 

[STM32F4] FMSC (Flexible static memory controller) Test













 

 

 

블로그 이미지

nexp

카테고리

분류 전체보기 (1550)
[MyProject] (48)
[TI] (75)
[NXP] (51)
[ST_MICRO] (129)
[FreeScale] (31)
[MSP430] (139)
[Microchip] (131)
Cortex-M (36)
[ATMEL] (29)
[AnalogDevice] (22)
[Embedded] (2)
ARM9 (24)
[AVR] (80)
[DSP] (111)
[8051] (21)
[MCU] (50)
[INTERFACE] (210)
[AppBoard] (23)
[ROBOT] (25)
[MODULE] (127)
[SENSOR] (41)
[DATA] (21)
[FPGA] (29)
[EVB] (1)
[Proramming] (38)
[MyLog] (6)
[IDEA] (0)
[Utility] (19)
[Book] (24)
취미생활 (4)
[Link] (2)

티스토리 툴바