CMSIS

앞의 GPIO를 제어하는 소스 코드에서는 C문법으로 레지스터에 엑세스하기 위해 레퍼런스 메뉴얼에서 레지스터의 베이스 주소와 오프셋을 찾아서 매크로로 작성하여 사용했지요. 하지만, 매번 이러기에는 너무나 번거롭습니다. 한두개면 몰라도 레지스터가 몇갠데…
더 좋은 방법은 CMSIS-CORE를 사용하는 것입니다. CMSIS에 대하여 간단하게 알아볼께요.

What is CMSIS?

CMSISv4_small

CMSIS는 Cortex Microcontroller Software Interface Standard의 줄임말입니다. ARM에서 다음과 같이 설명하고 있습니다.

The Cortex Microcontroller Software Interface Standard (CMSIS) is a vendor-independent hardware abstraction layer for the Cortex-M processor series and defines generic tool interfaces.

칩의 벤더와 구애받지 않는 하드웨어 추상 레이어와 일반 툴 인터페이스를 정의한다? 뭔가 하이레벨스러운 느낌이 나네요. 위쪽에 있는 다이어그램을 보면 아주 복잡하지만 여기서 사용해볼 것은 CMSIS-CORE 와 CMSIS-DRIVER 입니다. 사실 CMSIS-DAP 도 이미 사용하고 있었어요~ ​:smiley:​

CMSIS-CORE

CMSIS-CORE는 Cortex-M 코어에 대한 API 입니다. 이전 코드에서 asm volatile("nop \n\t"::) 이런 코드가 있었죠. nop 인스트럭션을 사용하기 위한 인라인 어셈블리죠. C에는 nop 라는 인스트럭션에 대응되는 함수나 문법이 없기 때문에 사용한 방법입니다. CMSIS-CORE 에서는 동일한 코드를 __NOP()라는 함수로 만들어두었습니다. 이외에도 인터럽트를 활성화하는 __enable_irq(), 인터럽트를 비활성화하는 __disable_irq(), 메모리 배리어 __DSB(), __DMB() 등등 디바이스에서는 제공하지만 C에서는 지원하지 않는 기능이나 연산을 C 함수처럼 사용할 수 있습니다.

CMSIS-DRIVER

CMSIS-DRIVER는 디바이스의 페리퍼럴에 대한 API입니다. 모든 페리퍼럴 레지스터에 대해 작성되어 있구요. 구조체 포인터 형식으로 엑세스합니다. 만약, GPIOA의 ODR 레지스터의 2번 비트를 set 하고 싶다하면 GPIOA->ODR |= GPIO_ODR_ODR2; 또는 GPIOA->ODR |= (1 << 2); 이런 방식으로 쓰면 됩니다.

CMSIS-DAP

cmsis_dap_interface

F103 뉴클리오 보드를 보면 ST-Link 쪽에 48핀짜리 칩이 하나 보이죠. 파츠명을 보면 STM32103CBT군요. 이 칩에 CMSIS-DAP가 사용되고 있어요. PC랑 디바이스 사이에서 동시통역중입니다. :smiley:

How to use

ST에서 제공하는 STM32Cube에 CMSIS 팩이 포함되어 있어서 이걸 써도 되기는 한데요, 이걸 SW4STM32에서 사용하려면 프로젝트에 폴더를 추가하고 링커스크립트에 있는 오타 여러개를 수정해야합니다. 때문에 STM32CubeMX 쓰는 편이 낫습니다.
stm32cubemx_000

New Project를 눌러서 뉴클리오 보드를 선택해줍니다. OK.
stm32cubemx_01_boardSel

왼쪽 목록의 SYS에서 Debug를 JTAG (4 pins)로 설정해줍니다.
stm32cubemx_02

그다음. 툴바의 기어모양 아이콘을 클릭하거나, 메뉴바의 Project-Generate Code를 클릭.

적당한 프로젝트명, workspace 경로 IDE를 선택해줍니다. 다른건 설정할 필요가 없습니다. OK.
stm32cubemx_03

코드가 잘 생성되었다고 하네요.
stm32cubemx_04

이제 SW4STM32에서 이 프로젝트를 가져오기 하면 됩니다.

생성된 프로젝트의 main.c 에는 STM32CubeMX가 생성한 코드가 들어있는데요. 이건 나중에 알아보기로 하고 일단은 모두 지웁시다\~ :smiley:

이전에 작성한 GPIO 코드를 여기다 붙여 넣기한 후, 소스 코드의 가장 위에 #include <stm32f1xx.h> 를 해줍시다.

이제 코드를 수정하고 사용하지 않는 코드를 삭제하면됩니다.

LAB!

이전에 작성한 GPIO 코드를 CMSIS를 이용한 코드로 바꾸어 봅니다. 지저분한 CPP 매크로가 없어져서 깨끗해지겠네요~

References

ARM, CMSIS – Cortex Microcontroller Software Interface Standard

Keil, About CMSIS-DAP

Leave a Reply

Your email address will not be published. Required fields are marked *