:::: MENU ::::
Posts tagged with: CortexM0

ARM Cortex M0 – 소개

ARM사는 Acorn Computer Group, Apple 컴퓨터, VLSI Technology의 합작투자회사로 1990년에 Advanced RISC Machine Ltd라는 이름으로 설립

ARM Cortex-M0의 특징

  • 적은 게이트수: 12,000
  • 저전력 기능 지원 및 높은 에너지 효율성 – 0.9 DMIPS/MHz
  • 사용하기 쉬운 인터럽트 우선순위 제어를 가진 내장형 인터럽트 콘트롤러
  • Low interrupt latency, 타이밍이 확정적(deterministic)
  • Thumb 지원- 높은 코드 밀도

ARM 프로세서와 아키텍처

  • 2006년에 Cortex-M3 (ARMv7-M 아키텍쳐) 출시
  • Cortex-M0는 ARMv6-M 아키텍쳐기반
  • ARMv6-M 아키텍쳐는 ARMv7-M의 메모리 맵,  프로그래머 모델과 익셉션 모델, Thumb2 시스템과 ARMv6의 Thumb 명령어 셋 그리고 CoreSight Debug 아키켁쳐를 결합한 형태이며, 여기에 저전력에 특화된 설계로 나온 것이 M0이며, FPRGA 특화된 특성을 넣은 것이 M1이다.
arm processor architecture

ARM 프로세서 아키텍처의 진화


CortexM0 보드와 CooCox

NXP LPC1114 보드

이전 블로그를 보니 2011년도 초에 NXP와 Nuvoton의 Cortex M0에 대해 쓴 블로그 포스팅이 있었는데 최근 당시에 CooCox로 부터 받은 보드와 최근에 Nuvoton에서 받은 보드를 테스트를 해봤다. 아래 그림에서 위에 있는 것은 NXP칩을 사용한 LPC1114보드이고, 아래 그림은 Nuvoton의 M0516NBL 을 사용한 보드이다.

CortexM0 보드

최근 이런 개발 보드들의 특징은 디버거를 포함을 하고 있는데, 보드의 좌측 부분이 디버거 기능을 하며,  CMSIS-DAP 기능을 한다.

하지만 몇 년 지난 보드를 다시 PC에 연결을 해보니 일단 연결 부터가 되지 않는다. 아마도 이 보드의 CooCoox의 ColinkEX가 업데이트가 됐는가 싶어서 이 보드의 ColinkEX f/w를 확인해 보니 예상한 대로 f/w가 업데이트 되어 있다. 관련 자료: http://www.coocox.org/CoLinkGuide/CoLinkDIY.htm

  • JP1을 쇼트시키고 USB 전원을 연결하면 LPC1343 칩의 내부 메모리가 “”CRP2 ENABLD” or “CRP DISABLD”의 레이블을 가진 MSD로 잡힌다.
  • 여기에 파일을 제거하고 위 링크에서 F/W를 다운로그해서 카피한다.
  • JP1을 오픈하고 USB 전원을 다시 연결한다.

물론 PC에는 드라이버를 설치를 해야한다.

Nuvoton NuTiny-M051보드

이 보드의 왼쪽 부분의 디버거의 이름은 Nulink이며, 보드를 PC에 연결을 하니 USB-HID로 잡힌다. NXP 보드와 마찬가지로 디버거를 이용해 개발을 하고 양산시에는 보드를 잘라서 F/W를 구울수 있는 구조로 되어 있다. 사용해 보니 mbed에 있는 CMSIS-DAP와 다른 점은 호스트에 연결되는 USB로 시리얼까지 처리를 하지는 않아서 시리얼 출력을 보려면 보드에서 선을 따로 뽑아야 한다. 하지만 NXP 보드는 보드에 RS232C 드라이버 칩과 소켓이 있어서 바로 연결을 할 수 있다.

CooCox 개발 환경

CooCox 역시 당시 블로그 포스팅에도 소개를 했었는데 최근 다시 설치를 해서 확인을 해보니 다양한 Cortex 칩들을 지원을 하고 있고, 커뮤니티도 제법 커져있다. 하지만 당시와 달라진 점은 ARM GCC 를 따로 설치를 해주고 경로를 설정을 해줘야 한다.

위 사이트에서 gcc를 다운로드 받고 설치를 한후, Project >> Select Toolchain Path를 지정을 한다.

CoIDE_Set_1

Blink 테스트

입베디드 보드에서의 Hello World와 같은 LED 깜박이기 예제를 돌려보자. 프로젝트를 만드는 것은 쉽다.

coocox

  • Project >> New Project : 프로젝트 이름을 정한다.
  • 칩 또는 보드를 선택을 하는데, 만약 이 툴에서 제공하는 보드리스트에 사용하는 보드가 있다면 보드를 선택을 하고, 없다면 칩을 선택한다.
  • 사용할 컴포넌트를 선택한다.  만약 GPIO를 선택을 하면  CMSIS Core와 CMSIS Boot는 자동으로 로드 된다. (스텝 3)
  • 좌측 창의 Component 부분의 GPIO에  2개의 예제가 있다고 표시가 된다. 이것을 선택을 하고 Blink예제를 add하면 프로젝트의 main 함수에서 blink 함수를 호출을 한다.
  • Blink.c 파일을 보면 Port2의 GPIO9 를 on/off 하는데, 내가 가지고 있는 보드의 설정과 동일하다. 즉 코드를 수정할 필요가 없다.
  • Project  >> Build (단축키 F7)를 한후, Flash >> Program Download를 선택한다. (보드의 JP2는 쇼트)
  • 보드의 JP2를 오픈하고 리셋 버튼을 누르면 다운로드 한 코드가 동작을 한다.

이상으로 코드 한줄 코딩하지 않고 개발 환경 설정하고 칩에 F/W까지 다운로드해서 동작을 확인했다. 사용을 해보니 참 편한데 한가지 아쉬운 점은 CooCox가 Windows만 지원을 한다는 것. LPCXpresso의 경우는 3가지 OS (Win, MAC, Linux)를 다 지원하는데….


LPC810 ARM CortexM0+ Project -1

Project Description

이 프로젝트의 목적은 가장 작은 MCU에 Ethernet connectivity를 구현하는 것이다. 아마 아래 그림과 같은 형태가 될것이다.

lpc810_ethernet

CortexMo+

NXP에서 출시한 LPC800시리즈는 ARM사의 CortexM0+ 시리즈의 칩이다. ARM의 소개 페이지에 있는 것 처럼 CortexM0와 마찬가지로 8, 16비트 시장을 타겟으로 하고 있다. CortexM0와 비교해서는 파워소모를 더 줄였고 성능은 더 높인 버젼이라고 이해하면 될 듯 하다. TI의 MSP430과 비교를 한 사이트도 있는데, GPIO만 적을뿐 가격, 파워 소모, 성능등 모든 면에서 우월하다.

LPC810

LPC800 시리즈중 눈길을 끄는 칩은 8핀 DIP패키지인 LPC810 이다.

Lpc800 dip8

이 패키지의 내부 구조는 아래 그림과 같다. 전원핀 6, 7번을 제외하면 나머지 핀들은 GPIO와 다른 기능이 multiplex되어 있어서 칩의 핀수를 줄일 수 있다. 더구나 내부 RC발진 회로덕분에 외부에 크리스탈 또는 오실레이터를 연결하지 않아도 된다.

LPC810_Pin

LPC810 시리즈는 아래 그림과 같이 메모리 용량에 따라 DIP8, TSSOP16, SO20, TSSOP20등의 패키지가 존재한다.

LPC810 Ordering

회로도

LPC810_Sch

일단 간단한 동작확인을 위해 Ardafruit에서 LPC810 Mini Starter Pack을 구매하고 Adafruit의 회로를 참고해서 위와 같은 회로를 구성하였다. Adafruit의 회로는 초보자를 위해 Fritzing(이 툴 관련 이전 블로그의 글들)을 이용해서 그려져 있는데 사실 엔지니어가 보기에는 회로도가 더 편하다. 암튼 안정적인 동작을 위해 난 리셋 회로를 추가하고 편의를 위해 ISP에 핀 헤더를 달았다. P0_2에는 LED가 달려있으며, MCP1700 레귤레이터를 통해 5V가 3.3V로 변환되어 칩에 입력이 된다.

프로그래밍

요즘 나오는 칩들이 거의 모두다 그렇지만 이 칩도 내부 ROM에 bootloader가 있고,  ISP(In System Programming)기능을 지원한다. 즉 UART를 통해서 내부 Flash의 업데이트가 가능하다.  그리고 NXP에서 제공하는 개발 환경인 LPCXpresso는 이클립스 기반이라서 Win, MAC, Linux를 모두 지원한다.  Adafruit에서 소개하는 페이지에는 Windows기반에서 설명을 하는데 난 MAC  환경이라서 OS X에서 개발 환경을 구축하였다. LPCXpresso를 다운받으려면 http://lpcxpresso.code-red-tech.com/LPCXpresso/ 여기에 사용자 등록을 해야 다운로드가 가능하다. 문제는  MAC용 Falsh Magic에서 아직 LPC800시리즈를 지원하지 않아서 lpc2isp를 사용해야 한다.

  • LPCXpresso에 프로젝트 등록 : 이 내용은 Adafruit에 자세히 나와 있으니 이곳을 참고. 간단히 설명하면  코드를 Github에서 ZIP 형태로 다운로드해서  받아서 LPCXpresso에서 Import Project를 하면 된다.
  • PL2303드라이버: Adafruit의 USB to TTL Serial Cable 에서 설명하는 Prolific 드라이버를 설치했으나 MAC 에서 인식이 되지 않아 인터넷에서 다른 드라이버를 찾아서 인식시켰다. [wpdm_file id=3]
  • Mac에서 시리얼 포트가 잡혔는지 확인하기: ls /dev/tty.*
  • Flash Magic 대신 lpc2isp사용하기: http://lpc21isp.sourceforge.net/에서 소스를 다운로드 받아서 gcc 로 컴파일 한다. 단 make 파일에서 CFLAG에 -static옵션을 빼야지 제대로 컴파일이 된다.

lpc21isp

  • lpc2isp 사용법은 “lpc21isp hex-file명 serial-port baud-rate clock of MCU(in Khz단위)”이다 여기서 마지막 파라미터인 MCU의 clock을 Khz단위로 넣는 것이 중요하다.  즉: ./lpc21isp LPC810_CodeBase.hex usbserial 115200 12000 을 입력하면 아래 그림과 같이 제대로 flash가 write 된다.

lpc2isp

위와 같이 프로그래밍 끝나면,  점퍼를 제거하고 리셋 버튼을 누르면 코드가 동작을 한다. 아래 그림은 LED를 깜박이는 코드를 로드….

LPC810_Board


CMSIS-Cortex Microcontroller Software Interface Standard


CMSIS – Cortex Microcontroller Software Interface Standard


CMSIS - Cortex Microcontroller Software Interface Standard Image

최근 많은 칩 벤더들이 CortexM 시리즈의 칩들을 내놓고 있습니다. 코아는 같지만 다양한 메모리 옵션과 페리페럴들로 특화된 칩들이 나오고 있죠. 다양한 칩들이 나오다보니 ARM에서 CMSIS라는 CortexM 시리즈칩들의 하드웨어를 억세스하기위한 S/W 인터페이스를 만들었네요. 이것은 벤더에 무관하게 하드웨어를 추상화 시킨 레이어 입니다. 칩 벤더들이 좀 더 쉽게 자신들의 페리페럴 인터페이스 코드를 만들 수 있겠군요. CMSIS는 약 1K정도의 코드 메모리와 10바이트 미만의 램을 필요로 하답니다.10 Bytes RAM).

ARM에서 아래 보이는 칩 벤더 및 툴 벤더와 작업을 했다는데, ABC순서군요. ^^

AtmelCode RedEnergy MicroFreescale  HitexIAR  Keil  Micrium NXP Segger STMicroelectronics Texas InstrumentsToshiba

ARM에서는 이 CMSIS를 Ethernet, SD/MMC, 디버그 인터페이스 같은 미들웨어 레이어까지 확장할 계획이라고 하니 S/W 개발자 측면에서는 점점더 개발이 쉬워지는 느낌은 있으나, 기술의 겉만 보고 핵심은 파악하지 못하는 개발자가 많이 생길 것 같은 우려도 동시에 되는 군요.