:::: MENU ::::
Posts tagged with: Cortex M0

가장 작은 MCU

응용에 따라서 작은 MCU가 필요할 때가 있다. 검색을 해보니 Top 5 Smallest Microcontrollers 기사가 있다.

  • ATtiny20 – 3 x 3
  • PSoC 4000 – 1.45 x 1.56
  • KL02 – 2 x 1.61
  • PIC12LF1552 – 2 x 3
  • C8051T606 – 3 x 3

이중에서 4번째, 5번째는 각각 PIC, 8051 코어라서 패스, ATtiny는 그냥 평범한 작은 AVR. 따라서 가장 작은 PSoC4000과 KL02이 선택의 대상이 된다. 가격은 PSoC4000이 1K에 1,451원 KL02가 1,741원 정도이고 PSoC4000이 리드 타임도 더 좋다. 하지만 칩의 스펙은 KL02가 Clock 48Mhz(16Mhz *괄호안은 PSoC4000), Flash 32KB(16KB), SRAM 4KB(2KB), ADC, SPI, UART, Timer2개로 훨씬 더 좋다. 단 PSoC4000은 동작 전압이 1.71 V to 5.5 V로 KL02(3.3V)대비 더 넓고,  Capacitive Sensing 기능이 있다.

이 다음 더 고려할 사항은 주변 회로가 얼마나 줄어드는지, 개발환경은 어떤지 여부이다.


ARM Cortex M0 – 기술적 개요

일반적인 정보

  • 폰노이만 아키텍처(단일버스 인터페이스)를 가지는 32비트 RISC 프로세서
  • ARMv6 아키텍쳐 : M0, M1(FPGA에 최적화)이 ARMv6 아키텍쳐이며, M3는 ARMv7 아키텍처임. 상위호환이 가능해 M0코드가 M3로 쉽게 이식이 가능.
  • 56개의 명령어: Thumb 명령어 지원, Thumb-2 명령어의 일부 지원

Cortex-M0 block diagram

ARM Cortex-M0의 특징

  • 0.9DMIPS/MHz
  • 프로세스 코어는 3단계 파이프라인
  • NVIC: 프로그램 가능한  4개의 서로 다른 우선 순위 레벨을 가질 수 있으며, 32개까지의 interrrupt request를 받을 수 있다.
  • WIC (Wakeup Interrupt Controller)는 옵션
  • OS지원을 위한 System Tick지원

ARM Cortex-M0의 장점

  • 에너지 효율성 – 슬립모드와 연계되어 있다. 즉 평소에는 슬립모드에 있다가 인터럽트가 발생을 하면 빨리 처리하고 다시 슬립모드로 들어감.
  • 8, 16비트의 제약을 극복 – 32비트 linear address 사용(더 큰 메모리의 사용 가능), 더 큰 스텍사용(참고로 8051은 256바이트), 향상된 명령어 셋으로 더 작은 크기의 코드 가능( 참고로 8051은 항상 ACC를 사용해야 함)

저전력을 가능하게 하는 요소들

  • 적은 게이트수 : 최소 설정으로는 12K, 일반적으로 17~25K
  • 높은 효율성 : 0.9 DMIPS/MHz (80486DX가 0.81 DMIPS/MHz 였다는…)
  • 슬립모드 : WIC(Wakeup Interrupt Controller), 2 개의 슬립모드: WFI(Wait for Interrupt ), WFE(Wait for Event)
  • 로직셀 향상 : Ultra Low Leakage 로직 셀 라이브러리 도입

average current

즉 물리적으로 누설전류가 적은 로직셀, 최적화된 게이트 수를 통해 성능이 좋은 칩으로 슬립모드를 제공하므로 저전력이 가능하다.

관련자료 다운로드


ARM Cortex M0 – 아키텍처

Programmer’s Model

CortexM0 Processor mode

ARMv6-M 아키텍처에서는 쓰레드 모드와 핸들러 모드가 거의 같다. 유일한 차이는 쓰레드 모드에서는 CONTROL이라는 특별 레지스터의 설정으로 shadow된 스텍포인터를 사용한다는 것이다.

레지스터

201402061550.jpg

로드 스토어 아키텍쳐: 메모리에 있는 데이터를 처리하기 위해 이 데이터는 메모리로 부터 레지스터 뱅크의 레지스터에 옮겨져서 내부 프로세서에 의해 처리되고, 이것이 다시 메모리에 쓰여진다.
Cortex-M0는 13개의 32비트 범용 레지스터와 몇개의 특별(special)레지스터를 가진다.

R0-R12

범용 레지스터이며, 대부분의 16비트 Thumb 명령어들은 R0-R7, 하위(Low)레지스터만 액세스 가능하다. 이 레지스터들은 리셋시에 초기값이 정해져 있지 않다.

R13, SP (스텍 포인터)

2개의 스텍포인터가 존재하며, Push, Pop은 32비트 명령이기 때문에 스텍포인터는 항상 32비트의 최하위 2 비트는 항상 0이다.

-. MSP (SP_main) : 메인 스텍 포인터 – 리셋시에 사용되는 기본 설정 스텍포인터이며, 익셉션 핸들러가 실행될 때도 사용이 됨, 초기값은 스타트업 동작시 벡터테이블에서 처음 32비트 워드를 가져온다.
-. PSP (SP_process) : 프로세스 스텍 포인터 – 쓰레드 모드(익셉션을 처리하지 않을 때)에서만 사용됨, 초기값이 정해지지 않음.

R14, LR (링크 레지스터)

함수 호출 또는 서브루틴의 복귀주소를 저장하기 위해 사용이 된다.

R15, PC (프로그램 카운터)

읽기시에는 파이프라인설계 특성 때문에 현재 명령어 주소 + 4값이 읽혀진다.

PSR, 프로그램 상태 레지스터

이 레지스터는 다음 3개의 레지스터들로 구성이 된다.

-. Application PSR (APSR) : 조건 분기를 위해 N(음수), Z(제로), C(캐리 또는 바로우), V(오버플로우)
-. Interrupt PSR (IPSR) : 현재 실행중인 ISR(인터럽트 서비스 루틴)의 번호를 표시한다.
-. Execution PSR (EPSR) : Cortex-M0에서 T비트는 항상 1 (Thumb 상태를 표시), 만약 이 비트가 0이면 Hard Fault 익셉션이 발생한 것이다.

201402061613.jpg

이 세개의 레지스터는 xPSR 라 불리는 하나의 레지스터를 통해 액세스 된다.

PRIMASK: 인터럽트 마스크 특별 레지스터

201402061621.jpg

PRIMASK를 설정하면 NMI나 Hard Fault 익셉션을 제외한 모든 인터럽트를 차단한다.

CONTROL: 특별레지스터

201402061622.jpg

리셋이 된 후(Active stack pointer = 0)에는 MSP가 사용이되지만 , 쓰레드 모드에서 Active stack pointer가 1로 되면 PSP가 선택이 된다. 간단한 응용에서는 MSP만 사용이 되지만 OS가 사용이 될 경우 PSP가 사용이 되는 데 이것은 빠른 Context switching을 위한 것이다. MSP의 초기값은 프로그램 메모리의 시작 부분에 저장이 되지만 PSP의 초기값은 정해지지 않으며, 사용하기전에 프로그램에 의해 초기화가 되야 한다.

메모리 시스템의 개요

201402061628.jpg

스텍 메모리 동작

  • First-in, Last-out 동작 메카니즘
  • Push – 스텍에 메모리를 저장, 스텍 포인터의 주소는 감소한다.
  • Pop – 메모리에 저장된 데이터를 복구, 스텍 포인터의 주소는 증가한다.
  • Cortex-M0의 경우 full descending 스텍 모델 – 이것은 스텍 포인터가 항상 스텍 메모리의 마지막에 저장된 데이터를 가리킨다는 의미인다.
  • Push를 했는데 Pop을 하지 않을 경우 스텍 오버플로우 발생

익셉션과 인터럽트

201402061654.jpg
Vector table

NVIC

  • Flexible 인터럽트 관리: s/w로 인터럽트를 enable / disable 가능, Pending 상태를 set / clear가능
  • 중첩된 인터럽트 지원 – 선점형(preemption)
  • 벡터 방식의 익셉션 진입
  • 인터럽트 마스팅

디버그 시스템

Halt mode debug, stepping, register access를 제공하고, BPU(Breakpoint Unit), DWT(Data Watch point)같은 디버그 기능을 제공한다.JTAG 연결(nTRST, TCK, TDI, TMS, TDP등 5핀 사용)과 Serial-Wire 연결(Serial Write Clock, Serial Write Data등 2핀 사용)은 동일한 컨넥터를 사용이 가능하다. 즉 TCK와 Serial Write Clock이 공유되고, TMS와 Serial Write Data핀이 공유되며 나머지는 NC이다.

Startup Sequence

IMG_0003

프로세서가 리셋이 되면 다음과 같은 순서로 동작을 한다.

1. 0x00000000 번지에 저장이 되어 있는 MSP의 초기값을 읽는다. MSP의 초기값 = 스텍의 시작 번지

2. 0x00000004 번지에 저장이 되어 있는 리셋 벡터를 읽는다.

3. 리셋 벡터에 저장된 번지의 명령어를 패치한다.

만약 부트코드가 0x000000C0 번지부터 시작을 하면, Thumb 코드임을 나타내기 위하여 최하위 비트를 1로 설정한 값이 리셋 벡터에 저장이 되어 있어야 한다.


STmicro의 Cortex M0 칩

최근의 MCU vendor들은 너나 할 것 없이 ARM사의 Cortex 코아를 내장한 칩을 출시하고 있다.
Cortex M3를 필두로 M4, M0까지…
기존의 NXP, Nuvoton등 많은 MCU 벤더들이 이미 M0기반의 칩을 출시했듯이, 이번에 ST도 M3, M4에 이어 M0기반의 칩을 출시했다.
ST의 Press release 기사: http://www.st.com/internet/com/press_release/p3275.jsp

좀 SRAM사이즈가 작은 듯하지만…

CortexM0와 M3, ARM7 과의 비교자료는 이전 포스트 “Cortex M0 비교 자료“참고..


CooCox

Nuvoton의 Cortex M0 칩관련 포스팅 중에 잠시 CooCox를 언급한 적이 있습니다.

CooCox는 무료 ARM Cortex M3 and Cortex M0 Development Tools 이며, ARM  gcc를 사용을 합니다. 홈페이지를 확인해 보니 중국 대학에서 만들었네요. 
ARM Connected Community Member,  NXP Partner,  Nuvoton Tools Partner, Energy Micro 3rd Party 이기도 합니다.

실제로 IDE를 받아서 설치를 하고 간단한 코드를 만들어 동작을 시켜보니 잘 돌아가네요.
처음 프로젝트를 만들때 디바이스를 선택하고 Repository에서 필요한 라이브러리를 선택을 할 수 있도록 되어 있어서 사용하기가 쉽네요.다운로드를 개별적으로도 받을 수 도 있고 CooCox CoCenter라는 프로그램을 받아서 다운로드 및 설치가 가능합니다.



Nuvoton의 Cortex M0 칩

제가 알기로는 현시점(2011년 1월)에서 Cortex M0 코어 칩은 NXPLPC11xxx 시리즈NuvotonNuMicro M051™ 시리즈가 유일 합니다.
Nuvoton은 대만에 본사가 있는데 Winbond로 부터 분사한 회사 같군요.
칩들은 메모리와 페리페럴별로 다양한 라인업이 준비가 되어 있으며, 온라인상에서 제품을 선택을 할수 있는 
On-line Products Slection Guide도 잘 준비가 되어 있네요.


칩의 성능이나 편이성등은 실제로 써봐야 알겠지만 ST나 NXP등의 업체에서 제공하는 자료들을 거의 모두 다 갖추었네요.
특이한 것은 개발툴 지원에 KEIL, IAR 말고
CooCox라는 Free & Open Cortex M3, Cortex M0 개발 환경도 지원하네요.