[SAMD21 EVM] 아두이노 제로(Arduino Zero) 보드 만들기




Arduino Zero 보드는 ATSAMD21G18을 이용한 보드 이다. [SAMD21 EVM] 보드에 부트로더만 다운로드 하면 쉽게 Arduino Zero 보드를 제작 할 수 있다. 


테스트는 [SAMD21 EVM] 보드와 모든 포트가 출려되는 STM32-48 EXP 확장 테스트 보드를 이용 하여 진행 하였다.


먼저 ARDUINO 최신 프로그램부터 다운로드 한다.



Arduino Zero 부트로더 설치

부트로더는 아래 폴더에 있고 JTAG를 이용하여 다운로드 하면 된다.

arduino-1.7.8\hardware\arduino\samd\bootloaders\zero

Bootloader_D21_M0_150515.hex

Bootloader_D21_M0_Pro_150427.hex


Bootloader_D21_M0_150515.hex




J-Link Lite를 이용하여 부트로더를 먼저 다운로드 한다. 

https://www.segger.com/jlink-software.html

(기존 SAM 시리즈와 같이 SAM-BA 를 통해 다운로드 할수 있도록 했으면 완벽할것 같은데.... 아쉬운점이다.)




ARDUINO M0 부트로더가 정상적으로 다운로드 되었다면 USB연결하고 ARDUINO CC로 테스트 프로그램을 다운드 해 보자.




USB연결하면 Arduino M0 장치를 검색하고 드라이버를 찾는다.  

아래와 같이 aruino 설치한 폴더에 드라이버 파일을 찾을 수 있다.

D:\arduino-1.7.8\drivers








Arduino 환경 설정

보드는 Arduino M0 Pro (Native USB Port)를 선택한다.



시리얼 포트는 USB로 인식힌 시리얼 포트를 선택 한다.




Arduino 기본 예제 테스트

간단히 GPIO를 토글 하는 예제를 테스트 해 보았다.

컴파일 완료 되고 다운로드도 문제없이 진행 되는것을 확인 했다.

이제 간단히 Arduino 프로그램을 이용하여 간단히 [SAMD21 EVM] 보드를 제어할 수 있다.




Arduino 기본 예제 테스트 동영상

Arduino CC의 기본 제공 예제인 PIN12(PA17), PIN13(PA19)를 토글 하는 예제이다.




Arduino Zero 보드를 테스트 해보고...

기존 AVR을 이용한 Arduino 보드와 비교해 보면 성능면에서는 상당히 좋은것 같다.

다만 SAMD21의 고유 기능들을 모두 사용하려면 까다로운 설정을 해 주어야 하고 기존 기능과 호환성을 위해서 성능면에서 포기 해야 하는것들이 많이 있는것 같다.



소프트웨어 측면에서 간단히 사용하기는 좋을것 같은데 제한된 리소스(비용) 내애서 최대 성능을 끌어내야 하는 하드웨어 측면에서 보면 Arduino를 포팅해서 사용할 필요가 있을까 싶다.(순전히 하드웨어 엔지어어 입장에서 생각해 본 의견이다.)


컴파일도 IAR보다는 속도나 성능면에서 떨어지는것 같고프로그램 다운로드도 JTAG를 사용하는것 보다 불편한점이 많은것 같다.




Ardunio Zero 핀맵

 * + Pin number +  ZERO Board pin  |  PIN   | Label/Name      

 * +------------+------------------+--------+-----------------

 * |            | Digital Low      |        |                 

 * +------------+------------------+--------+-----------------

 * | 0          | 0 -> RX          |  PA11  |                 

 * | 1          | 1 <- TX          |  PA10  |                 

 * | 2          | ~2               |  PA08  |                 

 * | 3          | ~3               |  PA09  |                 

 * | 4          | ~4               |  PA14  |                 

 * | 5          | ~5               |  PA15  |                 

 * | 6          | ~6               |  PA20  |                 

 * | 7          | ~7               |  PA21  |                 

 * +------------+------------------+--------+-----------------

 * |            | Digital High     |        |                 

 * +------------+------------------+--------+-----------------

 * | 8          | ~8               |  PA06  |                 

 * | 9          | ~9               |  PA07  |                 

 * | 10         | ~10              |  PA18  |                 

 * | 11         | ~11              |  PA16  |                 

 * | 12         | ~12              |  PA19  |                 

 * | 13         | ~13              |  PA17  | LED             

 * | 14         | GND              |        |                 

 * | 15         | AREF             |  PA03  |                 

 * | 16         | SDA              |  PA22  |                 

 * | 17         | SCL              |  PA23  |                 

 * +------------+------------------+--------+-----------------

 * |            |SPI (Legacy ICSP) |        |                 

 * +------------+------------------+--------+-----------------

 * | 18         | 1                |  PA12  | MISO            

 * | 19         | 2                |        | 5V0             

 * | 20         | 3                |  PB11  | SCK             

 * | 21         | 4                |  PB10  | MOSI            

 * | 22         | 5                |        | RESET           

 * | 23         | 6                |        | GND             

 * +------------+------------------+--------+-----------------

 * |            | Analog Connector |        |                 

 * +------------+------------------+--------+-----------------

 * | 24         | A0               |  PA02  |                 

 * | 25         | A1               |  PB08  |                 

 * | 26         | A2               |  PB09  |                 

 * | 27         | A3               |  PA04  |                 

 * | 28         | A4               |  PA05  |                 

 * | 29         | A5               |  PB02  |                 

 * +------------+------------------+--------+-----------------

 * |            | LEDs             |        |                 

 * +------------+------------------+--------+-----------------

 * | 30         |                  |  PB03  | RX              

 * | 31         |                  |  PA27  | TX              

 * +------------+------------------+--------+-----------------

 * |            | USB              |        |                 

 * +------------+------------------+--------+-----------------

 * | 32         |                  |  PA28  | USB HOST ENABLE 

 * | 33         |                  |  PA24  | USB_NEGATIVE    

 * | 34         |                  |  PA25  | USB_POSITIVE    

 * +------------+------------------+--------+-----------------

 * |            | EDBG             |        |                 

 * +------------+------------------+--------+-----------------

 * | 35         |                  |  PB22  | EDBG_UART TX    

 * | 36         |                  |  PB23  | EDBG_UART RX    

 * +------------+------------------+--------+-----------------

 * | 37         |                  |  PA22  | EDBG_SDA        

 * | 38         |                  |  PA23  | EDBG_SCL        

 * +------------+------------------+--------+-----------------

 * | 39         |                  |  PA19  | EDBG_MISO       

 * | 40         |                  |  PA16  | EDBG_MOSI       

 * | 41         |                  |  PA18  | EDBG_SS         

 * | 42         |                  |  PA17  | EDBG_SCK        

 * +------------+------------------+--------+-----------------

 * | 43         |                  |  PA13  | EDBG_GPIO0      

 * | 44         |                  |  PA21  | EDBG_GPIO1      

 * | 45         |                  |  PA06  | EDBG_GPIO2      

 * | 46         |                  |  PA07  | EDBG_GPIO3      

 * +------------+------------------+--------+-----------------

 * |            |32.768KHz Crystal |        |                 

 * +------------+------------------+--------+-----------------

 * |            |                  |  PA00  | XIN32           

 * |            |                  |  PA01  | XOUT32          

 * +------------+------------------+--------+-----------------





저작자 표시 비영리 변경 금지

[SAMD21 EVM] - UART 테스트

[ATMEL]/SAMD21 | 2016.02.14 02:15
Posted by nexp

[SAMD21 EVM] - UART 테스트





SAM D 시리즈의 특징으로 멀티 SERCOM모듈을 들수 있다. SERCOM 은 I2C, SPI or USART를 쉽게 할당해서 유연하게 사용 할 수 있는 장점이 있다. 특히 IO핀을 다양한 형태로 할당 할 수 있으므로 PCB설계에 있어 자유롭게 제작 가능하다. 





SAMD21 UART 초기화 설정 코드

SAMD21 EVM의 UART는 SERCOM2의 PA13(PAD1)->RXD, PA14(PAD2)->TXD 에 할당이 되어 있으므로 아래와 같이 핀맵 설정할 수 있다.

struct usart_config usart_conf;


usart_get_config_defaults(&usart_conf);

usart_conf.mux_setting = USART_RX_1_TX_2_XCK_3;

usart_conf.pinmux_pad0 = PINMUX_UNUSED;

usart_conf.pinmux_pad1 = PINMUX_PA13C_SERCOM2_PAD1; //RXD

usart_conf.pinmux_pad2 = PINMUX_PA14C_SERCOM2_PAD2; //TXD

usart_conf.pinmux_pad3 = PINMUX_UNUSED;

usart_conf.baudrate    = baudrate;


       stdio_serial_init(&_UART0, SERCOM2, &usart_conf);

usart_enable(&_UART0); 




SAMD21 UART 송수신 함수 코드 

unsigned char U0_GetByte(void)

{

    uint16_t  temp = 0;

    while(STATUS_OK != usart_read_wait(&_UART0, &temp));


    return temp;

}


void U0_PutByte(unsigned char Data)

{

    while(STATUS_OK !=usart_write_wait(&_UART0, Data));

}




SAMD21 UART 테스트 소스코드

int main(void)

{

_SystemInit();


//config_led();

    Led1Init();

    Led2Init();

    Led1On();

    Led2On();

    

    U0_Init(BAUD_115200);

    DebugPrint("SAMD21 UART Test\r\n");


while (true)

    {

        Led1Toggle(); 

        

        U0_PutByte(U0_GetByte());

}

}






SAMD21 UART 하드웨어 설계시 주의 사항


SAMD 시리즈 데이터 시트를 보면 시리얼 포트 설정은 SERCOM_PAD로해서 소프트웨어로 쉽게 할당 가능한것 처럼 되어 있다.




하지만 아래와 같이 실제로 각 포트의 PAD에 할당 가능한 기능이 제한적이다. PAD1의 경우 TXD 할당이 안된다. PAD1의 핀을 사용하려면 주의가 필요하다. 장점만 내세우고 있지만 제약사항이 있어 이런점이 아쉬운 점이다. GPIO 할당에 있어 SWITCH MAXRIX 를 지원하는 LPC800 시리즈와 비교해 보면 상당히 아쉬운점이 있는것 같다.



SAMD21 EVM 보드의 UART는 PA13(PAD1)->TXD, PA14(PAD2)->RXD 로 디자인 했지만 PAD1에 TXD 할당이 되지 않아 두 핀을 바꿔서 사용하고 있다.



참고로 SAMD21 부트로더 기본 시리얼 포트는 아래와 같다. 다음 디자인에는 고려 해봐야 할것 같다.

PA23 (115200, 8, N, 1) SERCOM3 PAD1 (UART RXD)


PA22 (115200, 8, N, 1) SERCOM3 PAD0 (UART TXD)


저작자 표시 비영리 변경 금지

[SAMD21 EVM] - 타이머 인터럽트 테스트





Cortex-M0 코어를 사용하는 CPU와 거의 유사하게 사용할 수 있는것 같다.


SAMD21 타이머 인터럽트 핸들러

void SysTick_Handler(void)

{

    Led2Toggle();

}




ATSAMD21 타이머 인터럽트 테스트 예제코드

int main(void)

{

system_init();


    //1ms setting

    SysTick_Config(48000);


Led1Init();

Led2Init();

    

    while (true)

    {


    }

}


저작자 표시 비영리 변경 금지

[SAMD21 EVM] CPU 클럭 설정 및 성능 측정 실험





SAMD 시리즈는 Cortex-M0 코어의 48Mhz 로 동작하고 여러 다양한 기술로 페리의 병목현상을 줄여 성능 향상을 했다고 한다. 일단 GPIO 제어로 간단히 속도 테스트를 해보도록 하자.


우선 아래 코드와 같이 ATMEL에서 제공하는 코드를 이용하여 GPIO 토글 속도 테스를 해 보았다.


int main(void)

{

system_init();


       Led1Init();

       Led2Init();

    

while (true)

      {

         port_pin_toggle_output_level(PIN_PB30);

}

}



GPIO토글 속도600khz로 출력된다.

느리다. 아무래도 클럭 설정에 문제가 있는것 같다.


conf_clocks.h 파일에 클럭 설정하는 부분이 있다.

디폴트로 8Mhz로 설정되어 있다. PLL을 이용해서 48Mhz까지 동작 시킬 수 있다.


1)48Mhz로 동작시키면 WAIT 값을 높여 주어야 한다.

/* System clock bus configuration */

#  define CONF_CLOCK_CPU_CLOCK_FAILURE_DETECT     false

//#  define CONF_CLOCK_FLASH_WAIT_STATES            0

#  define CONF_CLOCK_FLASH_WAIT_STATES            2




2)DFLL 설정을 enable 한다.

/* SYSTEM_CLOCK_SOURCE_DFLL configuration - Digital Frequency Locked Loop */

//#  define CONF_CLOCK_DFLL_ENABLE                  false

#  define CONF_CLOCK_DFLL_ENABLE                  true




3)MAIN CLK를 DFLL로 설정해 준다.

/* Configure GCLK generator 0 (Main Clock) */

#  define CONF_CLOCK_GCLK_0_ENABLE                true

#  define CONF_CLOCK_GCLK_0_RUN_IN_STANDBY        true

//#  define CONF_CLOCK_GCLK_0_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_OSC8M

#  define CONF_CLOCK_GCLK_0_CLOCK_SOURCE          SYSTEM_CLOCK_SOURCE_DFLL



이렇게 설정하니 1.8Mhz로 동작 한다.

ATMEL에서 제공하는 코드라 아무래도 함수로 접근해서 느려지는것 같다.



코드 수정해서 레지스터 직접제어로 테스트 해 보았다.  


int main(void)

{

system_init();


       Led1Init();

       Led2Init();

    

while (true)

      {

          //Led1Toggle(); 

          PORT->Group[1].OUTTGL.reg = BIT30; ;

}

}


레지스터 직접 제어로 변경하니 4Mhz로 출력된다.


다른 MCU들의 성능 측정 결과비교하면 만족할 만한 수준은 아닌것은데... 다양한 페리로 실험해 보면서 성능 테스를 해 볼 필요가 있을것 같다.






저작자 표시 비영리 변경 금지

[SAMD21 EVM] 개발환경 설정 - IAR 을 이용한 환견 설정


SAMD21 시리즈를 위한 개발환경은 여러가지가 있지만  익숙하고 간단히 사용할 수 있는 IAR 컴파일러를 이용하면 편리하다. 무엇보다 JLINK를 지원하기 때문에 좋은것 같다.

IAR 7.2 이상 필요하다.


ATMEL에서 제공하는 소프트웨어로 AVRSOFTWAREFRAMEWORK를 이용하면 쉽게 개발 환경을 구축 할 수 있다.


http://www.atmel.com/tools/AVRSOFTWAREFRAMEWORK.aspx


다만 ATMEL에서 제공하는 다양한 MCU를 지원하다보니 복잡하고 불필요 한 것들이 너무 많은것 같다.



IAR 7.2버전을 이용하여 프로젝트를 생성하고 칩셋을 선택 한다. ATSAMD21J18A 를 잉용하여 보드를 제작했기 때문에 아래와 같이 설정한다.





ATMEL 제공 예제는 여러가지 복잡한것들이 포함되어 있는데 실제로 필요한 부분은 아래와 같다. 일단 가장 간단하게해서 테스트 해 보자





다음으로 preprocessor를 설정한다. 복잡해 보이지만 sam0, common 폴더만 잡아주면 된다.


$PROJ_DIR$/../../../sam0/utils/cmsis/samd21/source
$PROJ_DIR$/../../../sam0/drivers/system/interrupt
$PROJ_DIR$/../../../sam0/drivers/system/power
$PROJ_DIR$/../../../sam0/drivers/system/reset
$PROJ_DIR$/../../../sam0/utils/preprocessor
$PROJ_DIR$/..
$PROJ_DIR$/../../../sam0/utils
$PROJ_DIR$/../../../sam0/drivers/port
$PROJ_DIR$/../../../sam0/boards
$PROJ_DIR$/../..
$PROJ_DIR$/../../../sam0/common/utils
$PROJ_DIR$/../../../sam0/drivers/system/interrupt/system_interrupt_samd21
$PROJ_DIR$/../../../sam0/utils/cmsis/samd21/include
$PROJ_DIR$/../../../sam0/drivers/system/power/power_sam_d_r
$PROJ_DIR$/../../../sam0/boards/samd21_xplained_pro
$PROJ_DIR$/../../../sam0./drivers/system/reset/reset_sam_d_r
$PROJ_DIR$/../../../common/boards
$PROJ_DIR$/../../../sam0/drivers/system/pinmux
$PROJ_DIR$/../../../sam0/drivers/system
$PROJ_DIR$/../../../sam0/utils/header_files
$PROJ_DIR$/../../../sam0/drivers/system/clock
$PROJ_DIR$/../../../sam0/drivers/system/clock/clock_samd21_r21_da
$PROJ_DIR$/.
$PROJ_DIR$/../../../common/utils



 

ARM_MATH_CM0PLUS=true
__SAMD21J18A__
BOARD=SAMD21_XPLAINED_PRO



이렇게 해서 컴파일 해보면 문제 없이 동작하는것을 확인 할 수 있다.

무료 버전은 사이즈 제한이 있지만 기존 IAR환경에서 쉽게 테스트 해 볼 수 있는 장점이 있는것 같다.







저작자 표시 비영리 변경 금지

블로그 이미지

nexp

카테고리

분류 전체보기 (1496)
[MyProject] (39)
[TI] (75)
[NXP] (50)
[ST_MICRO] (118)
[FreeScale] (30)
[MSP430] (122)
[Microchip] (123)
Cortex-M (36)
[ATMEL] (28)
[AnalogDevice] (22)
ARM9 (24)
[AVR] (80)
[DSP] (111)
[8051] (21)
[MCU] (49)
[INTERFACE] (209)
[AppBoard] (23)
[ROBOT] (25)
[MODULE] (125)
[SENSOR] (40)
[DATA] (21)
[FPGA/PLD] (29)
[EVB] (1)
[Proramming] (38)
[MyLog] (6)
[IDEA] (0)
[Utility] (19)
[Book] (24)
취미생활 (4)
[Link] (2)

티스토리 툴바