[ST_MICRO]/STM32G2018. 12. 14. 05:11

#STM32G030 EVM - I2C 테스트 (TMP275 온도 센서의 온도 측정)

#STM32G030 EVM - I2C 테스트 (TMP275 온도 센서의 온도 측정)


STM32G-SSM EVM 보드는 표준 핀맵을 통일화 해서 다양한 확장보드에 공용으로 테스트 할 수 있도록 제작한 보드 이다. I2C도 핀 맵핑에 따라 동일한 위치에서 테스트 가능하다.



SSM EVM표준 핀맵




SSM EVM 확장 테스트 보드 연결

SSM EVM 표준 핀맵을 테스트 할수 있는 다양한 확장 테스트 보드를 이용해서 I2C 테스트를 진행 해 볼수 있다. 

우선 I2C로 온도 값을 읽을 수 있는 TMP275 온도 센서 모듈을이용하여 SSM EVM 확장 테스트 보드에 연결하여 I2C를 테스트 해 보자.





STM32CubeIDE를 이용하여 기본 핀맵 설정하고 I2C 셋팅을 한 후 코드 생성하면 자동으로 I2C 설정 코드가 생성된다.


SSM EVM 핀맵에 맞도록 STM32G031에서 I2C1을 PA12(SDA), PA11(SCL)에 할당 했다.






생성된 코드를 이용하여 TMP275에서 온도 값을 읽어 오는 코드를 추가 해주면 I2C로 TMP275의 온도 값을 읽어 올 수 있다.


#define _TMP275_ADDRESS                 (0x48<<1)
#define _TMP275_REG_CONFIG              1
#define _I2C_DELAY_TIME                 1000
#define I2C_HANLDLE                     hi2c2

unsigned int read16(unsigned char addr, unsigned char data)
{
    unsigned char buf[2];

    HAL_I2C_Master_Transmit(&I2C_HANLDLE, addr, &data, 1, _I2C_DELAY_TIME);
    HAL_I2C_Master_Receive(&I2C_HANLDLE, addr|0x01, buf, 2, _I2C_DELAY_TIME);
    return (buf[0]<<8|buf[1]);

}




  SystemClock_Config();
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
         x = (read16(_TMP275_ADDRESS, 0)>>4)%0xFFF;

         printf("%.2f\r\n", (float)x/16.0);
         HAL_Delay(500);
    /* USER CODE BEGIN 3 */

  }





STM32G 시리즈에서 TMP275 온도 센서 모듈을 이용하여 간단히 I2C 테스트를 진행해 보았다. STM32CubeIDE를 이용하니 코어가 바뀌어도 별다른 설정없이 I2C를 테스트 할 수 있어 편리한것 같다.




Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32G2018. 12. 14. 05:10

#STM32G030 EVM - UART 테스트 (STM32CubeIDE 에서 printf 사용하기)

#STM32G030 EVM -  UART 테스트 (STM32CubeIDE  에서 printf 사용하기)





STM32g030F6에는 3채널의 UART포트가 있고 UART1(Tx-PB3, Rx-PB7) 포트가 보드상의 UART커넥터에 할당되어 있다.





STM32CubeIDE에서 새로운 프로젝트를 생성하고 UART탭의 핀맵과 보레이트 등을 설정한다.






STM32CubeIDE 로 코드 생성하면 자동 코드가 생성되고 기존 STM32 HAL코드와 동일하게 작성하면 UART 통신 테스트를 할 수 있다.



int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */
  /* MCU Configuration--------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  /* Configure the system clock */
  SystemClock_Config();
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_UART_Transmit( &huart1, "STM32G-SSM EVM", 1, 100);
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

}




STM32CubeIDE  에서 printf 사용하기


STM32CubeIDE 에서 printf 를 사용하려면 _wrte 함수를 재 정의 해 주면 된다.


#define hUART           huart1
int _write( int32_t file , uint8_t *ptr , int32_t len )
{
    /* Implement your write code here, this is used by puts and printf for example */
    for ( int16_t i = 0 ; i < len ; ++i )
    {
        HAL_UART_Transmit( &hUART, ptr++, 1, 100);
    }
    return len;

}




printf 로 간단히 카운트 값을 증가 하는 코드 작성해서 테스트 해 보니 잘 동작한다.


  while (1)
  {
    /* USER CODE END WHILE */
    printf("%d\r\n", cnt++);
    HAL_Delay(100);
    /* USER CODE BEGIN 3 */

  }


Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32G2018. 11. 14. 03:27

#STM32G STM32CubeIDE 를 이용한 개발환경 설정 및 성능 테스트

#STM32G STM32CubeIDE 를 이용한 개발환경 설정 및 성능 테스트






[STM32G031-SSM] 보드를 이용하여 개발 환경 설정 및 STM32G0의 성능 테스트를 해 보았다.


처음에 STM32CubeMx를 이용하여 코드를 생성하려고 진행 했는데.. 설정 다 하고 코드 생성하려는 순간 STM32G  시리즈는 CubeMx에서 지원을 하지 않는다고 한다.


알아보니 STM32CubeIDE를 이용하라고 한다.




STM32CubeIDE로 STM32G시리즈 선택해서 새로운 프로젝트를 생성











핀맵 설정

CubeMx와 거의 동일하게 동작하는것 같다.






STM32CubeIDE 클럭 설정

최대 64Mhz까지 설정 가능하다.






기본 설정 완료후 STM32CubeIDE에서 저장 하면 기본 코드가 생성된다.





[STM32G031-SSM] 보드에는 PA5에 LED가 연결되어 있으므로 GPIO토글 속도 측정을 해 보자





  while (1)
  {
    /* USER CODE END WHILE */
        GPIOA->BSRR = GPIO_PIN_5;
        GPIOA->BRR = GPIO_PIN_5;
    /* USER CODE BEGIN 3 */

  }



25ns(16Mhz) 정도 출력 된다.










Delay를 주어 STM32G0의 GPIO 토글 시간만 측정해 보았다.

68ns 가 나온다.



  while (1)
  {
    /* USER CODE END WHILE */
        
        GPIOA->BSRR = GPIO_PIN_5;
        GPIOA->BRR = GPIO_PIN_5;
        HAL_Delay(1);
    /* USER CODE BEGIN 3 */
  }





이상한데... 어샘코드를 보니 HAL_Delay가 두번 들어가 있다. 컴파일러 오류 인가?

     GPIOA->BSRR = GPIO_PIN_5;
800030c:    341f          adds    r4, #31
800030e:    61ac          str    r4, [r5, #24]
     HAL_Delay(1);
8000310:    2001          movs    r0, #1
     GPIOA->BRR = GPIO_PIN_5;
8000312:    62ac          str    r4, [r5, #40]    ; 0x28
     HAL_Delay(1);
8000314:    f000 f8a8     bl    8000468 <HAL_Delay>
8000318:    e7f9          b.n    800030e <main+0x62>
800031a:    46c0          nop            ; (mov r8, r8)
800031c:    40021000     .word    0x40021000





HAL_Delay()를 앞쪽으로 해서 실행 하면 23ns가 정상 출력된다.


while (1)
  {
    /* USER CODE END WHILE */
        HAL_Delay(1);
        GPIOA->BSRR = GPIO_PIN_5;
        GPIOA->BRR = GPIO_PIN_5;
    /* USER CODE BEGIN 3 */
  }




어샘 코드도 정상이다.

800030c:    341f          adds    r4, #31
      HAL_Delay(1);
800030e:    2001          movs    r0, #1
8000310:    f000 f8aa     bl    8000468 <HAL_Delay>
     GPIOA->BSRR = GPIO_PIN_5;
8000314:    61ac          str    r4, [r5, #24]
     GPIOA->BRR = GPIO_PIN_5;
8000316:    62ac          str    r4, [r5, #40]    ; 0x28
8000318:    e7f9          b.n    800030e <main+0x62>
800031a:    46c0          nop            ; (mov r8, r8)

800031c:    40021000     .word    0x40021000




결론적으로 STM32G0 의 GPIO토글 속도는 23ns 정도 된다. 비슷한 클럭의 STM32F103 의 GPIO토글 속도와 비교해서 더 좋은것 같다. 가격도 저렴하고 성능도 나쁘지 않은것 같다.


1$대 MCU에서 크기도 작고 성능 면에서 최고 인것 같다.




Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32G2018. 11. 13. 06:31

#STM32G0-SSM EVM 보드 제작 - STM32G031F6

#STM32G0M-SSM EVM 보드 제작 - STM32G031F6







STM32의 저렴한 MCU로 STM32F0 를 많이 사용하고 있었는데 성능면에서 약간 아쉬울 때가 있으면 STM32F1 시리즈 F4시리즈를 선택 해야 한다.


성능을 위해 가격을 올리기가 약간 부담스러울 때가 있었는데 이번에 STM32G가 출시 되었다고 해서 제작 해 보았다.


한가지 아쉬운점은 기존의 STM32F시리즈와 핀 호환이 안된다. ST의 가장 큰 장점 이었는데...




보드는 가장 간단히 MCU및 센서모듈등의 표준 핀맵으로 사용하는 SSM 모듈 핀맵으로 20핀 TSSOP패키지의 STM32G031F6 로 제작 했다.







STM32G의 장점으로 온도 스펙이 -40 ~ 125도로 산업용으로 적용 가능해 졌다. ADC속도도 빨라지고 내부 클럭 정밀도도 높아 졌다고 한다.











파워 핀을 하나로 정리하고 내부 클럭 정밀도가 높아져 외부 클럭이 필요 없다는 장점으 부각하고 있다.





전류 소모도 줄어서 저전력에도 도움이 될것 같고...





핀맵도 정리 했다고 하는데 PCB한번에 여러 패키지를 적용 시킬 수도 있을것 같다.


Posted by nexp

댓글을 달아 주세요