기존 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 */
}
반응형