본문 바로가기

[ST_MICRO]/STM32G4

[STM32G4-SM EVM] STM32G431 Arduino SPI 테스트

기존 STM32F4 시리즈와 비교 해서 하드웨어 적으로 개선된 부분이 있다고 하는데  특히 SPI클럭이

fPCLK/2 (Maximum speed at master mode – 75 MHz) 이다

 

STM32G4 의 MCU클럭은 최대 180Mhz 으로  85Mhz 까지 가능하다.

 

 


STM32G431 로 Arduino 에서 SPI 클럭 출력 테스트를 해 보자

 

#define PIN_OUT     PC13

#include <SPI.h>


void setup()
{
  Serial.begin(115200);
  Serial.println("SPI tst..");
  
  pinMode(PIN_OUT, OUTPUT);
  digitalWrite(PIN_OUT, 0);

  delay(2000);
  
  SPI.begin();

  SPI.setClockDivider(SPI_CLOCK_DIV2);  //85Mhz
  //SPI.setClockDivider(SPI_CLOCK_DIV4);  //42.5Mhz
  //SPI.setClockDivider(SPI_CLOCK_DIV8);  //24Mhz
  //SPI.setClockDivider(SPI_CLOCK_DIV16);  //12Mhz
}


unsigned char buf[2] = {1,2};

void loop() {
  SPI.transfer(buf, sizeof(buf));
  SPI.transfer(buf, sizeof(buf));
  delay(10);
}

 

STM32G431의 경우 SPI를 최대 클럭(SPI_CLOCK_DIV2)으로 설정하면 80Mhz로 측정이 된다. 하지만 SPI출력 인터벌은 300ns 이상으로 길다.

 

 

 


STM32CubeIDE를 이용하여 SPI 클럭을 설정할때 SPI_BAUDRATEPRESCALER_2 로 설정을 하면 에러가 발생한다. 최대 SPI클럭이 75MHz 이므로 설정이 안된다.

하지만 코드에서 SPI_BAUDRATEPRESCALER_2 를 강제로 해 주면 85Mhz는 나오기는 하지만 정상적으로 동작하는지는 의심이 된다.

SPI_BAUDRATEPRESCALER_2 가 안된다면 42.5Mhz가 최대 클럭인데... 아쉬운 부분이다.

 

 

42.5Mhz 는 정상적으로 잘 출력되는것을 확인 할 수 있다.

static void MX_SPI1_Init(void)
{

  /* USER CODE BEGIN SPI1_Init 0 */

  /* USER CODE END SPI1_Init 0 */

  /* USER CODE BEGIN SPI1_Init 1 */

  /* USER CODE END SPI1_Init 1 */
  /* SPI1 parameter configuration*/
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN SPI1_Init 2 */

  /* USER CODE END SPI1_Init 2 */

}

 

반응형