STM32 시리즈중 최고의 성능을 구현할 수 있는 STM32H7을 아두이노로 만들면 어떨까?
아두이노의 장점은 다양한 라리브러리를 쉽게 적용하여 사용 할수 있어서 성능과 편리함을 동시에 만족 할 수 있지 않을까...
우선 Arduino IDE환경에서 STM32 환경 설정이 되어 있지 않다면 보드 링크를 추가 하고
https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json
STM32H7 EVM 보드를 Arduino로 만들기 위해 Arduino 보드메이저에 "Gereic STM32H7 Series" 타입으로 등록 했다.
board.txt 파일을 수정해서 보드 메니저에 등록
# ELAB_H7_EV board
GenH7.menu.pnum.ELAB_H7_EV=ELAB_H7_EV
GenH7.menu.pnum.ELAB_H7_EV.upload.maximum_size=2097152
GenH7.menu.pnum.ELAB_H7_EV.upload.maximum_data_size=524288
GenH7.menu.pnum.ELAB_H7_EV.build.board=ELAB_H7_EV
GenH7.menu.pnum.ELAB_H7_EV.build.product_line=STM32H743xx
GenH7.menu.pnum.ELAB_H7_EV.build.variant=ELAB_H7_EV
약간의 핀맵 수정만 해 주면 잘 동작 한다.
STM32H7 Arduino 에서 GPIO 출력 속도를 측정해 보자.
우선 Arduino에서 기본으로 제공하는 GPIO 제어 함수로 속도를 측정해 보면
define LED_BUILTIN PA5
void setup()
{
Serial.begin(115200);
Serial.print("Stm32H7 Arduino GPIO Speed Test\r\n");
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH); //PA5
digitalWrite(LED_BUILTIN, LOW);
}
56ns 로 다른 MCU 코어를 사용한 Arduino 와 비교해서는 빠른것 같다.
STM32H7 GPIO 레지스터를 직접 제어 하여 출력 속도를 측정해 보면
define LED_BUILTIN PA5
void setup()
{
Serial.begin(115200);
Serial.print("Stm32H7 Arduino GPIO Speed Test\r\n");
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
//digitalWrite(19, HIGH); //PA5
//digitalWrite(19, LOW);
GPIOA->BSRR = GPIO_PIN_5;
GPIOA->BSRR = GPIO_PIN_5<<16;
}
26ns 로 측정되며 STM32H7 STM32CubeMX HAL 코드로 GPIO출력 속도 측정 속도와 비슷하게 나온다.
최대 480Mhz로 구동 할수 있는 STM32H743 MCU를 아두이노로 구동하면 성능이 제대로 나올까?
우선 STM32H7 FPU테스트 에 사용했던 코드를 아두이노에서 구동해 보자
void loop() {
d = 0.0;
Serial.println(d);
GPIOA->BSRR = GPIO_PIN_5;
for(i=0;i<10;i++)
{
d += sqrt(2.0);
}
GPIOA->BSRR = GPIO_PIN_5<<16;
Serial.println(d);
delay(10)
}
결과
0.00
14.14
0.00
14.14
측정 결과 1us
옵티마이즈는 -Os
캐시 enable 상태 (캐시 disable 상태에서는 4us 로 측정)
왜 이렇게 느리지? 120ns는 나와야 하는데...
FPU 코드변환이 안된건가?
옵티마이즈는 -O3 로 변경시
1.25us
로 더 느려졌다.