[SAMD21E-S EVM] ATSAMD21 MCU 성능 측정 - ATSAMD21 48Mhz 클럭 설정 문제 발생 및 해결
SAMD21은 저렴한 가격에 소형이고 적당한 성능(48Mhz Cortex-M0)에 USB까지 있어 사용할 곳이 많을것 같은 MCU이다.
실제 성능을 한번 측정 해 보자.
우선 단순하게 GPIO 토글 속도를 측정해 봐야 할것 같다.
// Set pin direction to output
gpio_set_pin_direction(PA14, GPIO_DIRECTION_OUT);
gpio_set_pin_function(PA14, GPIO_PIN_FUNCTION_OFF);
/* Replace with your application code */
while (1)
{
delay_ms(1);
PORT->Group[0].OUTSET.reg = 0x4000;
PORT->Group[0].OUTCLR.reg = 0x4000;
}
Atmel START에서 생성된 기본 코드로 동작 시켰더니 500ns 가 걸린다.
기본 설정이라 그런가...
비슷한 코어의 STM32F0 EVM 보드와 비교해 보면 너려도 너무 느리다
우선 클럭 쪽을 좀 들여다 보자.
1Mhz 로 구동되도록 되어 있다.
아래와 같이 DFLL48M으로 설정하고 동작 시켰더니 CPU가 멈춰버린다.
디버깅 해 보면 외부 32khz 클럭을 사용하고 아래 코드에서 멈추는 현상이 있다.
32khz 클럭 소스 자체가 잘못 되었나?
#if CONF_OSC32K_CONFIG == 1
#if CONF_OSC32K_ENABLE == 1
while (!hri_sysctrl_get_PCLKSR_OSC32KRDY_bit(hw))
;
#endif
내부 32khz를 사용해 보자. 잘 동작한다.
외부 클럭만으로 사용해 보자. 잘 동작 한다.
클럭은 문제 없는것 같고...
클럭이 너무 높아서 그런가?
다시 한번 DFPLL48M 을 클럭 소스로 해서 동작 시키면
아래와 같은 에러로 빠져 버린다.
FFFFFFFE ??? Memory out of bounds or read error
DFPLL48M 설정에 문제가 있나?
FDPLL96M 을 사용해 보자. 여전히 같은 증상이다.
클럭을 clock Precalar를 이용하여 8Mhz 이하로 낮추면 정상 동작한다.
Atmel 홈페이지에서는 자료를 아무리 찾아도 설정 관련 내용이 없었는데...
문제 발생
클럭을 8Mhz 이상으로 설정하면 MCU(SAMD21)가 멈추는 현상 발생
항상 새로운 MCU를 사용할때는 문제가 발생 하는것 같다. 이런 문제들이 발생할때 해되면 그 행복감에 또 이런 일 하는 것 아닐까...
문제 해결
48Mhz로 구동시 NVM Wait States 항목을 1로 변경해 주어야 한다.
이것때문에 한참을 고생을 했네...
문제 발생
외부 32.768khz X-tal사용하니 또 멈춰 있는 현상이 발생한다.
문제 해결
X-Tal 사용하려면 "Enable 32KHz output" and "Enable XTAL" 옵션을 체크 해 주어야 한다.
디폴트로 설정되면 좋겠구만... 왜 이렇게 어렵게 해 놓은거야..
컴파일러의 옵티마이즈 옵션에도 성능 차이가 있다.
O-1
while (1)
{
delay_ms(1);
6c2: 4e07 ldr r6, [pc, #28] ; (6e0 <main+0x44>)
PORT->Group[0].OUTSET.reg = 0x4000;
6c4: 001d movs r5, r3
6c6: 2480 movs r4, #128 ; 0x80
6c8: 01e4 lsls r4, r4, #7
delay_ms(1);
6ca: 2001 movs r0, #1
6cc: 47b0 blx r6
PORT->Group[0].OUTSET.reg = 0x4000;
6ce: 61ac str r4, [r5, #24]
PORT->Group[0].OUTCLR.reg = 0x4000;
6d0: 616c str r4, [r5, #20]
6d2: e7fa b.n 6ca <main+0x2e>
6d4: 00000115 .word 0x00000115
6d8: 41004400 .word 0x41004400
6dc: 40004000 .word 0x40004000
6e0: 000002d5 .word 0x000002d5
-O3
while (1)
{
delay_ms(1);
65c: 2001 movs r0, #1
65e: 47b0 blx r6
PORT->Group[0].OUTSET.reg = 0x4000;
660: 61a5 str r5, [r4, #24]
PORT->Group[0].OUTCLR.reg = 0x4000;
662: 6165 str r5, [r4, #20]
664: e7fa b.n 65c <main+0x28>
666: 46c0 nop ; (mov r8, r8)
668: 00000115 .word 0x00000115
66c: 41004400 .word 0x41004400
670: 40004000 .word 0x40004000
674: 00000295 .word 0x00000295
ATMEL Studio 에서 옵티마이즈 옵션 설정
ATSAMD21을 48Mhz로 구동하고 최종적으로 GPIO토글 속도를 측정해 보면 86ns로 측정 된다.
atmel_start_init();
gpio_set_pin_level(LED1, true);
/* Replace with your application code */
while (1)
{
PORT->Group[0].OUTSET.reg = (0x1<<27);
PORT->Group[0].OUTCLR.reg = (0x1<<27);
delay_ms(1);
}
반응형