티스토리 뷰

Arduino

[Arduino] ICSP (In-Circuit Serial Programming)

생각많은 소심남 2015. 12. 9. 01:29

아두이노에선 두가지 형태의 프로그램이 존재한다. 하나는 아주 쉽게 개발할 수 있는 User Application 형태의 프로그램이다. 이건 흔히 Sketch라고 부르는 JAVA기반의 IDE에서 개발되는 형태로 유저가 쉽게 개발할 수 있게끔 라이브러리들이 제공되고 있어서 쉬운 문법의 언어를 통해 아두이노를 개발할 수 있다.

 사실 이 글의 제목과 연관이 있는 내용인 다른 하나는 Firmware 형태의 프로그램이다. 이건 사용자 친화적인 문법을 제공하지 않고, 약간 하드웨어를 직접적으로 다루는 형태가 되겠다. 

왜 프로그램이 이 두가지 형태로 제공되는 것일까.. 의문을 가질 수 있다. 결국은 사용자가 개발하는 것인데, 그냥 Firmware 없이 User Program만 가지고 하드웨어를 제어할 수 있으면 얼마나 좋을까 싶은데, 사실 이런 하드웨어를 제어하는데 있어서 가장 필수적인 요소가 Firmware이다. 흔히 Embedded System에만 Firmware가 들어가있는것처럼 보이지만 우리가 쓰고 있는 PC에도 일종의 Firmware가 달려있고, 이 Firmware의 대표적인 예가 바로 Boot Loader이다.

 아두이노에서 BootLoader는 Microcontroller에 올라가는 Firmware를 말하는데, 역할은 아두이노상에 있는 Flash memory나 EEPROM에 있는 어떤 뭔가를 불러주는 것이다. 일종의 칩을 구동시키는 어떤 소프트웨어 시스템이랄까, 보통은 Image라는 프로그램 덩어리를 Memory에 올리고 시작 주소부터 하나씩 실행시켜주는 역할을 한다. 그런데 아마 아두이노를 어느정도 다뤄본 사람들이라도 이런 Firmware를 직접 개발한다는 이야기는 들어본적이 없을 것이다. 그도 그럴것이 흔히 Host PC와 아두이노사이의 통신을 위해서는 보통 USB 케이블을 통해서 하는데, 이 USB Interface로는 User Program Level로만 접근이 가능할 뿐, Firmware을 직접적으로 다룰 수는 없다. 



대표적인게 이 UNO 보드인데, UNO보드에는 두개의 Microcontroller, ATmega328P과 ATmega16u2가 달려있는데, USB Interface를 관장하는 것은 Main Controller인 ATmega328p가 아닌 ATmega16u2이다. 결국 칩에다가 뭔가를 쓰려면 다른 경로를 거쳐서 접근을 해야되는데, 이때 사용되는 통로가 바로 ICSP(In-Circuit Serial Programming)이다. 내가 알기로는 표준화된 Serial Interface를 통해서 Flashing이 가능한 방식을 칩에 구현했다는 걸로 알고 있는데.. 아무튼 이방식이 Firmware를 다룰 수 있는 방법이 된다. 이게 필요한 이유는 바로, Bootloader같은건 스스로 재프로그래밍이 될 수 없기 때문이다. 따라서 이를 변경하기 위한 외부 수단이 필요하게 된 것이고, 이게 별도의 포트인 ICSP인 것이다. 



왼쪽이 Leonardo이고 오른쪽이 UNO인데, 둘다 ICSP 포트는 따로 분리되어 있다. 다만 Leonardo는 기존의 ATmega16u2가 하던 USB Interface 관리를 한칩에 몰아서 함으로써 ICSP 포트가 하나만 나와있고, UNO는 두개의 Controller를 다뤄야 하기 때문에 각각의 ICSP가 나와있는 것을 사진으로 볼 수 있다. 아마 아두이노를 가지고 뭔가를 만들고자 할때 이런 Bootloader를 직접적으로 다룰 일은 없겠지만 이런 방식으로 칩에다가 직접적으로 프로그래밍할 수 있다는 건 유념해두면 좋을거 같다. 참고로 이런 프로그램을 Direct Programming이라고 한다.

댓글