[ST_MICRO]/STM32F42012. 9. 10. 00:23

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

[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();  
}

 

Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F42012. 8. 30. 15:18

[STM32F4] STM32F4 Discovery Board SWD 핀맵

[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

 

Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F42012. 8. 19. 15:26

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

[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;
    }
  }
}  

Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F103-Mtype2012. 1. 29. 23:49

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

[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] 보드 

Posted by nexp

댓글을 달아 주세요

  1. 비밀댓글입니다

    2012.03.03 01:05 [ ADDR : EDIT/ DEL : REPLY ]
  2. 비밀댓글입니다

    2012.05.02 18:33 [ ADDR : EDIT/ DEL : REPLY ]
  3. 비밀댓글입니다

    2012.07.29 18:42 [ ADDR : EDIT/ DEL : REPLY ]
  4. 비밀댓글입니다

    2012.08.10 23:48 [ ADDR : EDIT/ DEL : REPLY ]

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

[STM32F4] FMSC (Flexible static memory controller) Test

[STM32F4] FMSC (Flexible static memory controller) Test













 

 

 

Posted by nexp

댓글을 달아 주세요