• 검색 결과가 없습니다.

Training Kit - Daum

N/A
N/A
Protected

Academic year: 2024

Share "Training Kit - Daum"

Copied!
57
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

Training Kit

(실습노트 Rev1.1)

CyberLab

www.armkorea.com

(2)

등록 상표

ARM은 Advanced RISC Machine사의 등록상표입니다.

ArmDown은 CyberLab사의 등록상표입니다.

알림

문서의 내용 및 교육용 보드에 사용되는 기술은 저작권법에 의한 보호를 받고 있습니다.

따라서 본 제품(교육자료 및 교육용 보드에 대한 아이디어 및 설명서, 기타 등등)의 어떠한 부분도 사전에 폐사와의 문서 동의없이 변경, 재생산할 수 없으며 다른 언어로도 번역될 수 없습니다. 이를 준수하지 않아 생길 수 있는 문제에 대해서는 폐사에서는 어떠한 책임도 지 지 않으므로 주의하시기 바랍니다.

본 문서의 내용 및 보드의 기능은 사전 통보없이 변경될 수 있습니다.

인쇄 내역

제 2판, 2002년 12월

Copyright 2002 By CyberLab All Rights Reserved

(3)

I. 이론편

(4)

이론편

1. ARM 이란..

ARM(Advanced RISC Machine)은 영국에 본사를 두고 있는 디자인하우스입니다. 즉, 이 회사에서는 반도체 칩을 생산하는 것이 아니라 칩의 핵심 부분인 코어(core)만을 설계하여 판매합니다. (그런데, 그 코어의 이름 역시 ARM 이지요.) 그러면 삼성, 인텔, 모토롤라와 같 은 전세계 반도체들은 이 코어를 사다가 여러 주변장치를 추가하여 IC를 제작, 생산, 판매 합니다.

ARM의 특징들을 살펴보면 다음과 같습니다.

■ 고성능(Very High Performance)

기존 임베디드 시장에서는 주로 8/16비트의 프로세서가 주류를 이루고 있었습니다. 하지 만 시장에서 요구되는 응용분야가 점차 음성, 영상, 통신 등의 고성능 처리가 필요하게 됨 에 따라 32비트 고성능 프로세서가 등장하게 되었습니다. 기존에 존재하던 32비트 프로세 서는 성능은 우수한 반면에 가격, 시스템의 크기, 전력소모 면에서는 8/16비트 프로세서에 비해 불리한 면이 많았습니다. ARM 프로세서는 이러한 단점을 최소화하면서도 고성능의 처 리 능력을 가지도록 설계되어, 많은 분야에서 그 수요가 급증하고 있습니다.

■ 저전력(Very Low Power Consumption)

개인용 컴퓨터 분야에서는 전력 소모보다는 처리 속도가 더 우선시 되었습니다. 처리속도 를 증가시키기 위한 각종 기술이 추가되었으나, 이에 비례하여 전력소모나 발열이 더욱 커 지게 되었지요. 하지만 요즘과 같은 모바일(mobile) 시대에서 요구되는 특징은 처리속도도 빠르면 좋겠지만, 이보다는 전력소모가 적은 것이 더 우선시되고 있습니다.

핸드폰, PDA, e-book등은 모두 밧데리로 동작되고 있습니다. 처리속도도 중요하지만, 밧 데리의 동작시간을 연장시키려면 전력소모를 줄이는 방법이 최선입니다. ARM 프로세서는 전력소모를 줄이기 위해, 전력소모 면에서 최적화 된 설계를 지향하고 있습니다. 일부 기능 을 보면, 처리속도가 감소되는데도 불구하고 전력소모를 줄이기 위해 선택한 부분도 발견할 수 있습니다.

■ 적은 크기의 다이 싸이즈(Very Small Die Size)

IC를 만들기 위해서는 원형의 실리콘 웨이퍼 상에 회로를 구성합니다. 웨이퍼의 크기가 고정되어 있으므로, IC를 구현하기 위한 크기가 작을수록 많은 IC들을 만들 수가 있습니다.

즉, 저가격의 IC를 만들 수 있다는 의미입니다. IC를 구현하는 부분(die)를 작게 하기 위해 서는 당연히 회로가 간단해야 합니다. 이 문제는 처리속도, 저전력, 저가격과 맞물려 있습니 다.

(5)

이론편

IC를 구성하는 회로가 간단할수록, 다이의 크기가 작아집니다. 이에 따라 가격, 전력소모 도 비례하여 작아지겠죠? 반면에 처리속도는 감소하게 됩니다. ARM 프로세서는 최적화 된 회로를 통해 저가격, 저전력을 구현하면서도 처리속도는 크게 떨어지지 않도록 설계되었습 니다.

■ 적은 크기의 코드 싸이즈(Very Small Code Size or Good Code Density)

동일한 명령을 수행하는데 필요한 코드의 길이가 짧다는 것을 의미합니다. 다르게 표현하 자면, 일정한 기능을 수행하는 프로그램을 작성하였을 경우 코드의 길이가 짧다면 전체 프 로그램의 크기도 짧다는 의미입니다. 이것은 단순히 짧다는 의미를 넘어 시스템 전체의 저 전력, 저가격, 고성능과 맞물려 있는 문제입니다. ARM 프로세서에서는 ARM 명령어 이외에, THUMB이라는 압축된 형태의 16비트 명령어를 지원합니다. THUMB 명령어의 코드길이의 타 프로세서의 동일 명령어에 비해 상당히 짧은 특징을 가지고 있습니다.

(6)

이론편

2. S3F441FX

Training Kit는 ARM7TDMI Core의 삼성 S3F441FX를 메인 CPU로 하고 있습니다. CPU의 자세한 스펙은 삼성 홈페이지(www.samsungsemi.com)에서 관련 매뉴얼을 찾아보심 좋을 듯 합니다. 물론 저희 사이버랩의 홈페이지(www.armkorea.com)의 자료실에도 매뉴얼을 업 로드하였습니다. 참고하시구요.

이 장에서는 간단히 그 특징들만 알아보겠습니다.

2-1 개요

ARM7TDMI CPU core를 채택하고 있으며, 16/32 bit RISC 아키텍처입니다. 40MHz로 동작 하지만, 내장된 PLL을 이용하여, 그 동작 속도를 소프트웨어적으로 변경할 수 있습니다.

32bit 버스폭에 25/50ns의 고속으로 동작하는 메모리가 내장되어 있어 ARM의 처리속도 저 하를 줄여줍니다. 또한 전력 소모, 가격 경쟁력 및 시스템 크기를 줄일 수 있다는 장점도 있습니다. 8/16 bit 마이크로컨트롤러 분야의 CPU를 대치하는데 가장 적합한 CPU인듯..^^*

2-2 내부구성

Memory

- 3개의 메모리 뱅크를 가지고 있습니다. 256KB 플래쉬메모리와 8KB의 램이 내 장되어 있지만, 추가로 3개까지 외부 메모리 연결이 가능합니다. 연결할 수 있 는 메모리는 뱅크 당, 최대 256KB까지 가능합니다.

- 0 에서 7 wait cycle 까지 메모리 억세스 타임을 소프트웨어도 조정할 수 있습 니다.

I/O Port

- 19개의 I/O Port가 있습니다. 이 포트들은 그 기능을 소프트웨어적으로 설정할 수 있습니다.

- 이 중 3개는 외부 인터럽트 핀으로 사용될 수 있습니다. Normal mode(IRQ)와 Fast mode(FIQ)를 지원합니다.

Timer

- Interval, capture, match & overflow mode를 지원하는 16-bit 타이머/카운터가 6개 있습니다.(Timer0/1/2/3/4/5)

- 8-bit 카운터(basic Timer), 3-bit 카운터(Watch dog timer)

(7)

이론편

Uart - 1channel

Power down mode - IDLE mode - STOP mode

동작 전압 - 3.0V~3.6V

Clock Control

UART

Timer 0, 1, 2, 3, 4, 5

I/O Port Controller PLL

Bus Router

Interrupt Controller

Basic Timer & WDT

System Bus Controller Bus Interface Bus Arbitration ROM/SRAM Controller

System Manager

256KByte Flash 8KByte SRAM CPU

(ARM7TDMI)

[그림2-1] S3F441FX Block Diagram

(8)

이론편

3. 441FX_Training Kit

3-1 구성 품목

Main Board 1EA

Serial Cable(Ex_Cable) 1EA 9V 500mA Adapter 1EA 실습 교재

CD ( 매뉴얼, 예제소스, ARMDOWN 등의 관련 자료 포함)

3-2 제품 사양

Size : 168 mm × 123 mm 프로세서 : S3C441FX (ARM7TDMI) Internal Flash : 256Kbyte (32bit data bus) Internal SRAM : 8Kbyte(32bit data bus)

External Flash : AT29C010A (8bit data bus) – 128Kbyte (5V, DIP) AT29C020A (8bit data bus) – 256Kbyte (5V, DIP)

AT29LV010A (8bit data bus) – 128Kbyte (3.3V, DIP) AT29LV020A (8bit data bus) – 256Kbyte (3.3V, DIP) External SRAM : NVRAM 기능 지원

HY62V8100B (8bit data bus) – 128Kbyte (3.3V, TSOP) HY62V8200B (8bit data bus) – 256Kbyte (3.3V, TSOP) USB 인터페이스 : PDIUSBD12 (3.3V)

Character LCD : 16X2, NANYA Sound 출력 : 핸드폰 스피커

Status LED ( Power -1, USB -1, System status –3 ) 스위치 ( Reset-1, EINT-3 )

UART : 1 channel JTAG 인터페이스

회로 확장을 위한 만능기판

전원 : DC 9V 500mA 또는 USB Power(5V 500mA)

: 기본적으로는 제공되지 않으며, 확장 가능하다는 의미입니다.

(9)

이론편

[그림 3-1] Training Kit (Layout)

3-3 Board Configuration

Jumper State Description

(1-2) Adapter J1, J2

(2-3) USB Power Selection Close Internal ROM

JP1 Open External ROM Boot Selection (1-2) 5V Flash

J3, J4

(2-3) 3.3V Flash

External Flash Power Selection

표에서 진한 글씨가 Default 입니다.

POWER Selection

Main Board는 입력 전원을 선택적으로 공급할 수 있습니다.

가) J1의 (1-2)이 연결되었을 경우 :

어댑터를 통해 인가된 9V의 전압이 7805를 거쳐 5V의 전압을 만들어냅니다.

(10)

이론편

나) J1의 (2-3)이 연결되었을 경우 :

PC의 USB Host에서 5V의 전압이 공급됩니다.

5V의 전압은 레귤레이터인 1117을 거쳐 3.3V를 만들어냅니다. 바로 이 전압이 ARM 에 공급됩니다.

Boot Selection

S3F441FX에는 내부에 256Kbyte의 플래쉬가 내장되어 있습니다. 따라서 초기에 부 팅될 부트 코드를 내부 플래쉬에 저장하여 부팅되도록 할 수도 있고, 외부에 플래쉬를 통해 부팅되도록 할 수도 있습니다. 이는 JP1를 이용하여 선택합니다.

즉, JP1이 Close 되면, ARM 내부의 플래쉬로 부팅되고, JP1이 Open되면 외부에 연결 된 플래쉬(U7)로 부팅됩니다.

내부 256KB 플래쉬 부팅시 메모리 맵

SFR

8KB Internal SRAM

CS2 (USB)

CS1 (External SRAM)

Internal 256KB Flash ROM

0x00000000 0x0003FFFF 0x00800000 0x0083FFFF 0x00C00000 0x00C3FFFF 0x01FF0000 0x01FF2000 0x01FFFFFF

(11)

이론편

외부 플래쉬 부팅시 메모리 맵

SFR

256K Internal Flash ROM

CS2 (USB)

CS1 (External SRAM)

CS0 (External Flash ROM)

0x00000000 0x0003FFFF 0x00800000 0x0083FFFF 0x00C00000 0x00C3FFFF 0x01FF0000 0x01FF2000 0x01FFFFFF

8KB Internal SRAM

0x01F3FFFF

0x01F00000

External Flash Power Selection

Training Kit에는 DIP Type의 플래쉬를 사용할 수 있도록 제작되어 있습니다.

아시다시피.. ARM이 3.3V의 전압으로 동작되기 때문에, 플래쉬도 3.3V으로 동작하는 것을 이용하셔야 합니다. 그런데, 이 플래쉬는 5V용 플래쉬에 비해 가격도 비싸구..

구입하시기도 쉽지 그리 쉽지 않습니다.

Training Kit에서는 이러한 문제를 보완하기 위해 3.3V / 5V용 플래쉬를 선택적으로 사 용할 수 있도록 제작되었습니다. 이것은 J3, J4 (회로도 J4)를 이용하여 선택합니다.

(12)

이론편

가) J4의 (1-2)이 연결되었을 경우 :

플래쉬(U7)에 5V의 전압이 공급됩니다. 따라서 3.3V의 플래쉬를 부착하시면..

뒷일은 책임지지 않습니다.. 주의 하세요~~

나) J4의 (2-3)이 연결되었을 경우 :

플래쉬(U7)에 3.3V의 전압이 공급됩니다. 원래는 3.3V 전용 플래쉬를 부착하여 야 하는데, 5V용 플래쉬를 부착할 수도 있습니다. 하지만 이 경우는, ARM에서 직접 write는 불가능하구요.. 플래쉬 내의 코드를 Read 하는 것만 가능합니다.

3-4 회로도

POWER

7805

U1 7805

1 2 3

IN GND OUT

D1 1N5819

2 1

J2

Adapter Input 1 2 3

Adapter_PWR

R1 200 USB_PWR

VCC_5.0 VCC_3.3

C1 + 220uF/10V(DIP)

R2

330

U3 EZ1117A

3 2

1

VIN VOUT

ADJ

Adapter_PWR

+ C2

220uF/10V(DIP) J1

JUMPER3

13

2

(13)

이론편

USB

nCS2

VCC_3.3

nOE VCC_3.3

D6 D0

EINT2

R12 47K

D3 LED

21

D7

R15 1M

D5 D3 VCC_3.3

R14 1M BC7

0.1uF

R13 1M BC8

0.1uF

U6

PDIUSBD12 1

2 3 4 6 7 8 5

9 10 11 12 13

14 15

16 17 18 19 20 21 22 23 24 25 26 27 DATA0 28

DATA1 DATA2 DATA3 DATA4 DATA5 DATA6 GND

DATA7 ALE CS_N SUSPEND CLKOUT INT_N RD_N

WR_N DMREQ DMACK_N EOT_N RESET_N GL_N XTAL1 XTAL2 VCC D- D+

VOUT3.3 A0

R8 330

D1

A0

D4

J3

CON4 1 2 3 R11 18 4

nWE

USB_PWR R10 18

GPIO4

EXTCLK D2

R9 4.7K

R16 1M nRESET

ARM

GPIO0

nRESET(SRAM)

BC2 0.1uF

A16nWAIT

D1 nTRST nWE

GPIO4

VCC_3.3

EINT2 VCC_3.3

A15

TCK D6 D7

U2 S3F441FX

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

17 18 32 31 30 29 28 27 26 25 23 22 21 20 19 24

33343536373839404142434445464748

49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64

TCK TMS TDI RXD/GPIO15 TXD/GPIO14 VDD0 VSS0 nTRST MD0 MD1 A17/GPIO13 A16/GPIO12 nRESET A15/GPIO11 A14/GPIO10 A13/GPIO9 A12/GPIO8

VDD4 VDD1 A0 A1 A2 A3 A4 A5 VSS1 A7 A8 A9 A10 A11 A6

nWEnOEnCS0nCS1nCS2nWAITVSS2D7D6D5D4VDD2D3D2D1D0

VSS3 EXTCLK EINT0 EINT1 EINT2 TIN/GPIO7 GPIO0 VDD3 GPIO1 GPIO2 GPIO3 GPIO4 GPIO5 PLLCAP GPIO6 TDO

A9 A3

D0 nOE

GPIO7 VSS

A4

A13

BC5 0.1uF

D2

GPIO6

TDI

BC1 0.1uF

A8

MD0

A1 EXTCLK

A11

D4

EINT0

TxD nCS2

BC4 0.1uF

(USB)

A10 EINT1

A12 C3

680pF

A7 BC3

0.1uF

RxDD3

GPIO3 GPIO5 GPIO2

VCC_3.3

TMS MD1

GPIO1

nCS1

A0

D5

A5 A2

TDO

(FLASH)

A6

A17

PLLCAP

A14nCS0

(14)

이론편

SRAM

D0 D5 U5

HY62V8200B(TSOP) 1

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

32 31 30

17 18 19 20 21 22 23 24 25 26 27 28 29 A11

A9 A8 A13 /WE CS2 A15 Vcc A17 A16 A14 A12 A7 A6 A5 A4

/OE A10 /CS1

A3 A2 A1 A0 DQ1 DQ2 DQ3 Vss DQ4 DQ5 DQ6 DQ7 DQ8

nOE

(DIP) A8

A3 A12

VCC_RTC

D1 A16

D6

RTC_PWR Q1 PNP 1

23

VCC_RTC

A17 A13

A2 D7

A14 A7

D2 nWE

VCC_3.3

A6 A1

D3

C5 0.1uF nCS1

A11 VCC_RTC

A5

A0

A15 D4

BC9 0.1uF

C10 0.1F1 A10

A9

A4

FLASH

DQ0

BC10 0.1uF

DQ4 A2

D5 D1 DQ3

VCC_5.0 DQ1

A11

DQ0

A13 A1

DQ6 DQ2

A14

D0

A15

D6 A12

A3

nCS0 A9

A6 A5

A16

DQ5 U7

AM29C010(DIP) 12

11 10 9 8 7 6 5 27 26 23 25 4 28 29 3

13 14 15 17 18 19 20 21

22 24 31 32

16 2

30

1 A0

A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15

DQ0 DQ1 DQ2 DQ3 DQ4 DQ5 DQ6 DQ7

nCE nOE nWE VCC

GND A16

A17

NC

DQ1

A0 VCC_3.3

D7 A8

DQ6

J4 JUMPER3

1 3

2

DQ2

nWE

DQ7 DQ7

D3 DQ5

DQ3

A10

DQ4

D4 D2

nOE

R18

R-1K

1 8

2 7

3 6

4 5

A7 A4

R17

R-1K

1 8

2 7

3 6

4 5

A17

LCD

GPIO6

VR1 10K

13

2

LCD_D3 LCD_E LCD_D6

U9

74HC595 14 11 10 12 13

15 1 2 3 4 5 6 7 9

168

SER SRCLK SRCLR RCLK G

QA QB QC QD QE QF QG QH QH

VCCGND

J5

LMM73X021X2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 LCD_D5

VCC_5.0

LCD_D4 LCD_E GPIO5

LCD_D0 LCD_RW

LCD_D1

LCD_D6 R20

R-330

1 8

2 7

3 6

4 5

VCC_5.0

LCD_D7 LCD_D2

LCD_RS nRESET

LCD_D7 nQH

LCD_D5 LCD_RS VCC_5.0

GPIO7

LCD_D4 LCD_RW

(15)

이론편

Serial

BC11 0.1uF

VCC_3.3

RxD C9 0.1uF

TxD C6

0.1uF

C7 0.1uF U8

SP3232EC(TSSOP) 11 10 12 9 14

7 13 8

2 1

3 4

5

6 16

15

T1IN T2IN R1OUT R2OUT T1OUT T2OUT R1IN R2IN

V+

C1+

C1- C2+

C2-

V- VDD

GND C8

0.1uF

(FEMALE) P1 Serial

5 9 4 8 3 7 2 6 1 VCC_3.3

JTAG

nRESET TCK

R22 0 CN1

E_ICE 1 3 5 7 9 11 13 2 4 6 8 10 12 14

TDO VCC_3.3

nTRST TMS VCC_3.3

TDI R19

R-10K

1 8

2 7

3 6

4 5

(16)

이론편

I/O

D5

LED 2 1

D2

LED 2 1

S4 EINT2

D4

LED 2 GPIO1 1

EINT0

S2 EINT0

EINT1

D6 PWR_LED

21

VCC_3.3

U4F

74HC14

13 12

147

GPIO0

VCC_3.3

EINT2

U4E

74HC14

11 10

147

GPIO2

R7

R-330

1 8

2 7

3 6

4 5

S3 EINT1

U4D

74HC14

9 8

147

Xtal 발진회로

X1

6MHz 1

2

3

R3 10

C11 CAP

R5 1M

U4C

74HC14

5 6

147

EXTCLK C12 CAP

(17)

이론편

RESET 회로

U4B

74HC14

3 4

147

C4 0.1uF VCC_3.3

nRESET

S1 RESET R4

100K U4A

74HC14

1 2

147

(18)

이론편

4. 개발 환경 꾸미기

1. ARMDOWN

ArmDown 은 CyberLab 에 의해 자체 개발된 프로그램으로, 이미지 파일을 타겟보드로 다운로드 하는데 사용됩니다.

(단, 이 프로그램은 CyberLab 에서 제공하는 bootstrap 코드를 내장한 보드에서만 사용 가능합니다.)

사용 가능한 PC 환경 - Windows 98

- Windows NT 계열( Windows 2000, Windows XP)

특 징

1. 편리한 유저 인터페이스로 타겟보드에 손쉽게 이미지 파일(*.rom/*.bin)을 전송할 수 있습니다.

2. Windows NT 계열의 단점을 보완하고자 내부에 터미널 창을 내장하였습니다.

(19)

이론편

Windows 98 의 경우에는 직접 하드웨어를 제어하여 하이퍼터미널이나 이야기와 같은 시리얼을 사용하는 외부 터미널프로그램과 함께 사용할 수 있습니다.

3. SDRAM 뿐 아니라 Flash 나 기타 메모리로도 다운로드가 가능합니다. 따라서 SDRAM 으로 다운로딩하여 개발한 후, 양산시 Flash 로 바로 적용이 가능합니다.

2. 사용방법

Step 1. 준 비

1. 시리얼 케이블을 이용하여 컴퓨터와 타겟보드를 연결합니다.

2. ArmDown2.3 를 설치한 후, 실행시킵니다.

Step 2. 디바이스 설정

[설정>통신설정>시리얼 설정]

ArmDown Ver2.3 은 시리얼 다운로드만을 지원합니다.

1. 사용할 시리얼 포트(COM1 또는 COM2)를 설정합니다.

(20)

이론편

2. 제어방식을 설정합니다.

- API : Windows의 인터페이스를 사용하여 시리얼 포트를 제어하는 방식을 말합니다.

- Direct : Windows의 인터페이스를 사용하지 않고, 직접 하드웨어를 제어하 는 방식을 말합니다. 따라서 터미널 프로그램처럼 같은 시리얼을 사용하는 프로그램과 동시에 작업할 수 있습니다.

단, 이 방식은 Windows 98 계열에서만 지원되므로 이 옵션은 windows98 계열에서만 선택할 수 있습니다.

<Windows 98계열>

<Windows NT계열>

(21)

이론편

3. 확인을 누른후 아래쪽의 상태창에 디바이스 설정 정보를 확인합니다.

Step 3. 드라이버 설정

[설정>통신설정>드라이버 선택]

1. 설정의 드라이버를 선택하면 드라이버에 대한 자세한 내용이 아래의 정보 창에 나옵니다.

ArmDown Ver2.3에서는 삼성의 S3F441FX (Flash), S3C3410X (SDRAM/Falsh), S3C44B0X (SDRAM/Flash), S3C2400X (SDRAM)로의 다운로드를 지원합니다.

(22)

이론편

2. 적절한 드라이버를 선택한 후, 확인버튼을 누릅니다.

3. 아래쪽의 상태바에 선택된 드라이버의 정보가 맞는지 확인합니다.

Step 4. 실행할 이미지 파일 선택

1. ‘찾기’ 버튼을 눌러 다운로딩할 이미지 파일(*.rom/*.bin)을 선택합니다.

Step 5. 다운로드

1. 다운로드 준비가 완료되면 '다운로드’ 버튼을 누른 후, 곧바로 타겟보드의 리셋 버튼을 누릅니다.

2. 진행상황에 두 번의 상태바가 움직이면 다운로드가 완료된 것임을 의미합니다.

(23)

이론편

3. 컴파일러 설정하기

제공된 예제 소스는 메트로워크사의 코드워리어 1.1 로 컴파일되었습니다. 이는 ARM 사의 ADS1.2 버전과 동일한 컴파일러입니다.

ARM 컴파일러마다 그 사용 방법은 조금씩 다르겠으나 기본적으로 설정해 주어야 할 값들은 유사합니다.

다음은 Training Kit 를 위한 설정값 입니다. 컴파일러 사용시 참고하시기 바랍니다.

Architecture or Processor : ARM7TDMI Byte Order : Big Endian

Initial State : ARM State

Floating Point : Pure-Endian softfp

C Source language : ANSI/ISO Standard C Linker Image Base

Read Only(RO) Base : 0x0000_2000 Read Write(RW) Base : 0x01ff_0000

(24)

II. 실습편

(25)

실습편

실험 1. I/O Port를 이용한 LED 제어

S3F441FX에는 총 19개의 포트가 있습니다. 이 포트들은 일반 입출력 핀으로 사용될 수도 있고, 데이터 버스나 제어 신호처럼 특별한 기능을 하는 핀으로 사용될 수도 있습니다. 놀 라운 것은 이 모든 기능들이 하드웨어적으로 결정되어 있는 것이 아니라 사용자가 원하는대 로 그 기능을 설정할 수 있다는 것입니다. 그것도 비트 단위루요..^^*

자, 그럼..

I/O 포트를 소프트웨어적으로 제어하는 방법을 알아보고, 이를 활용하여 LED를 제어해 볼 까요..?

[그림1-1]은 LED 관련 회로도입니다.

회로도를 보시면, 3개의 LED가 GPIO0/GPIO1/GPIO2에 각각 연결되어 있습니다. LED에 는 보통 10mA 정도의 전류가 흐르면 불이 켜집니다. 꼭 10mA 이어야 한다는 것은 아니구 요. 그 이상의 전류가 흐르면 좀 더 밝게, 그 이하의 전류가 흐르면 좀 어둡게 LED가 켜진 다는 것입니다. 즉, 10mA란 권고사항(?)이 되겠습니다.

[그림1-1] LED 제어

(26)

실습편

눈치 빠르신 분들은 벌써 짐작하셨겠지만, 여러분이 LED를 켜기 위해서는 다음과 같은 순서로 코딩하셔야 합니다.

1. GPIO의 기능을 설정한다.

LED 제어를 위해서는 GPIO0/GPIO1/GPIO2를 출력 핀으로 설정합니다.

2. GPIO에 원하는 데이터를 뿌려준다.

LED의 불을 켜고 싶으면 ‘1’을, 불을 끄고 싶으면 ‘0’을 써 주시면 되겠네요.

<소스 프로그램>

다음은 LED를 1초마다 점멸하는 소스 프로그램입니다.

void Main(void) {

int i;

Delay(0); // Calibrate Delay() using the WDT Uart_Init(115200); // 115200bps

Delay(100);

Uart_Printf("₩n₩nEx02. 테스트 I/O 포트 ₩n");

rP0CON|=0x07; // GPIO0/1/2 is Output

while(1) {

rP0&=~0x07; // LED OFF Delay(5000); // 0.5초 Delay rP0|=0x07; // LED ON Delay(5000); // 0.5초 Delay Uart_Printf("."); // Serial Test

} // end of while(...)

} // end of main(...)

(27)

실습편

참말 익숙한 C 소스이지요.. 이 책을 보고 계시는 분들이라면 한번쯤은 다 사용해보신 언 어일 것입니다. 그런데, C 코딩을 위해서는 어셈블리어로 엄청난 준비작업을 해 주어야 한 답니다. 하드웨어를 다루어 보지않고 PC 환경하에서만 C 코딩을 해보신 분들은 바로 이 점 이 매우 어렵고 생소하게 느껴지실겁니다.

하지만 Training Kit에 맞게 C 프로그램을 위한 환경은 이미 구축해 놓았으니, 고민하시지 마시구요.. 좀 더 깊이있는 공부를 하고 싶으신 분들은 그 소스(startup.s)를 열심히 분석해 보시기 바랍니다.

그럼, 다시 본론으로 돌아가서..

I/O Port는 크게 세 그룹으로 나누어져 있습니다. 비슷한 것끼리 그룹지어 놓았다고 해야 할까요..? [표1-1]은 S3F441FX의 I/O Port Configuration을 나타낸 것입니다.

Port Configuration Option Programmability

0

• General CMOS push-pull I/O Port with pull-up resistor

• Port 0 consists of GPIO[7:0]

• GPIO7 is multiplexed with TIN

Bit Programmable

1

• General CMOS push-pull I/O Port with pull-up resistor

• Port 1 consists of GPIO[15:8]

• GPIO[15:8] is multiplexed with RxD, TxD and A[17:12]

Bit Programmable

2 • External Interrupt Input or output port Bit Programmable [표1-1] I/O Port Configuration

Port 0 그룹은 8개의 포트로 구성되어 있는데, GPIO[6:0]은 입력 또는 출력 포트로 사용 할 수 있습니다. GPIO[7]은 입/출력 포트 외에 타이머 입력(TIN)으로 사용되기도 합니다.

Port 1 그룹은 입/출력 외에 어드레스 버스나 시리얼 입/출력으로 사용할 수 있습니다.

Port 2 그룹은 주로 외부 인터럽트 입력 핀으로 사용되는데, 그렇지 않은 경우는 출력 포 트로 사용될 수 있습니다.

이러한 다양한 포트의 기능들을 설정하기 위해서 포트 그룹마다 컨트롤 레지스터와 데이 터 레지스터 그리고 풀업 레지스터가 각각 하나씩 존재합니다. 여기서 컨트롤 레지스터란, 이름 그대로 포트의 기능을 제어하는 레지스터입니다. 즉, 포트를 입력으로 할지, 출력으로 할지, 그 기능을 설정해주는 레지스터이지요. 한편, 데이터 레지스터는 포트로 실제 입출력 될 값을 나타내는 레지스터를 말합니다. 마지막으로 풀업 레지스터라는 것이 있지요..? 풀 업(Pull-up) 저항/풀다운(Pull-down) 저항이라는 용어는 들어보셨는지..

어쨌든 이번 LED 실험에서는 사용되지 않으니 잠시 접어두도록 하지요.

(28)

실습편

[표1-2]는 Port 0와 관련된 3개의 레지스터들을 보여주고 있습니다.

Register Name Bit Description

Data Register

(P0) [7:0] • 포트로 실제 입출력되는 값을 의미합니다.

0 • Port 0의 GPIO0를 설정합니다.

0 : CMOS Input Mode

1: CMOS push-pull Output Mode 1 • Port 0의 GPIO1를 설정합니다.

0 : CMOS Input Mode

1: CMOS push-pull Output Mode 2 • Port 0의 GPIO2를 설정합니다.

0 : CMOS Input Mode

1: CMOS push-pull Output Mode 3 • Port 0의 GPIO3를 설정합니다.

0 : CMOS Input Mode

1: CMOS push-pull Output Mode 4 • Port 0의 GPIO4를 설정합니다.

0 : CMOS Input Mode

1: CMOS push-pull Output Mode 5 • Port 0의 GPIO5를 설정합니다.

0 : CMOS Input Mode

1: CMOS push-pull Output Mode 6 • Port 0의 GPIO6를 설정합니다.

0 : CMOS Input Mode

1: CMOS push-pull Output Mode Control Register

(P0CON)

7 • Port 0의 GPIO7를 설정합니다.

0 : TIN/CMOS Input Mode 1: CMOS push-pull Output Mode Pull-up Register

(P0PUR) [7:0]

• GPIO[7:0]에 풀업 저항을 달아줄지를 설정합니다.

0 : Disable Pull-up register 1 : Enable Pull-up register

[표1-2] Port 0 Register

표의 내용이 대충 이해가 되시나요..? 정말 간단하지요..? ^^*

(29)

실습편

만약 여러분께서 GPIO0를 출력핀으로 설정하고 싶으시다면, P0CON 레지스터의 bit[0]에

‘1’ 이라고 써주시면 됩니다. 하지만 여기서도 주의할 점이 있답니다. 2페이지의 소스코드를 다시 살펴봅시다.

rP0CON |= 0x07; // GPIO0/1/2 is Output

이 코드를 길게 늘여쓰면,

rP0CON = (rP0CON|0x07);

이 됩니다. 여기서 rP0CON이란, POCON 레지스터를 가르킵니다. 실제로는 P0CON 레지스 터가 가르키는 주소 영역을 포인터를 이용하여 지정해 주어야 하는데, 자주 쓴다고는 하지 만, 그 주소들을 다 외울수는 없는 노릇이니까요.. 헤더 파일에 define 해 놓으면 소스 코드 가 훨씬 간단해지겠지요..? S3F441FX.h 라는 헤더파일을 참조하시기 바랍니다.

소스 코드는 rP0CON과 0x07을 OR하여 rP0CON에 다시 넣습니다. 그럼, rP0CON의 하위 세 비트[2:0]가 ‘111’ 이 되어 GPIO0/1/2가 출력 포트로 설정됩니다.

rP0 &= ~0x07; // LED OFF

위의 소스코드 역시

rP0 = rP0&(~0x07);

을 의미하는데, 여기서 rP0는 Port 0의 데이터 레지스터를 의미합니다. 하위 세 비트를

‘000’으로 clear 시켰으니, LED의 불이 꺼집니다.

rP0| = 0x07; // LED ON

이번엔 하위 세 비트를 ‘111’로 set 시켰으니 LED 불이 켜지겠네요.

이처럼, 컨트롤 레지스터를 이용하여 기능을 설정하고, 데이터 레지스터에 원하는 값을 적 어주면, LED를 맘대로 제어할 수 있습니다.

(30)

실습편

< 좀 더 알아보기 >

1. LED를 0.5초 간격으로 좌우로 움직이는 프로그램을 작성해봅시다.

2. [그림1-2]의 스위치 입력값을 터미널 창에 표시하는 프로그램을 작성해봅시다.

(Hint, 터미널 창에 출력은 Uart_Printf()를 사용하세요.)

[그림1-2] Input Port Test

(31)

실습편

실험 2. Uart를 이용한 통신

UART(Universial Asynchronous Receiver/Transmitter)란 CPU가 외부 주변장치나 다른 CPU와 데이터 통신을 할 수 있도록 해 줍니다. S3F441FX는 내부에 한 개의 UART block을 내장하고 있습니다. 이것은 인텔사의 i8051과 같은 임베디드 프로세서 내부에 내장되는 장 치와 거의 유사하다 할 수 있습니다.

Tx Control Tx. B uffer Reg

Data Bus

Tx. Shift Reg

Rx. Shift Reg

Rx. B uffer Reg Data B us

LCO N/U C O N /U SS R Data Bus

Rx Control

Interrupt Control

Serial Clock G enerator Tx

Rx

CK CK

B aud Rate G enerater 16-bit Prescaler

Status

M CLK UTCLK

UBRDR

Data B us

[그림2-1] UART Block Diagram

상위 모델의 경우에는 송수신 각 채널에 16바이트의 FIFO가 내장되어 보다 빠른 속도 로 동작하는데 반하여, S3F441FX는 FIFO가 없습니다. 단, 송수신 각각에 2개의 레지스터 가 있는 double-buffer 구조로 되어 있습니다.

특징

1. ARM 프로세서는 그 동작속도가 매우 빠르기 때문에 UART의 속도도 이에 비례하여 빠르게 동작할 수 있습니다. 물론 PC와의 통신의 경우에는 매력이 없답니다. PC의 최대 속도가 115200bps로 제한되어 있기 때문이지요. 하지만 카메라 센서의 영상 데이타 전송 과 같이 데이터의 크기가 큰 경우에는 8비트 프로세서에 비해 매우 유용합니다. 또한 블 루투스와의 인터페이스 등에서도 전송속도가 중요하게 작용하지요.

(32)

실습편

2. 기존 UART와는 달리 IrDA 통신을 지원합니다.

IrDA는 적외선 센서를 사용한 광량방식의 통신방식으로 IrDA 1.0의 경우 최대 4Mbps의 빠른 전송속도를 자랑합니다. 무선통신과 유사한 듯 하지만, 동일 주파수 사용 등의 제약사 항이 없다는 것이 장점입니다.

441FX에 내장되어 있는 것은 UART 혹은 IrDA를 선택해서 사용할 수 있으며, IrDA를 사 용하는 경우 IR Tx Encoder, IR Rx Decoder가 동작하게 됩니다.

다음은 Uart 관련 레지스터에 대해 설명하였습니다.

LCON (UART line control register)

이 레지스터는 UART 통신시, 데이터의 비트수, 패리티 등의 설정을 하기 위한 레지스터 입니다. 통신이 이루어지기 위해서는 통신하는 2개의 시스템 설정이 동일해야만 합니다.

Bit Description

[1:0] Word-length Per Frame (WL)

• 데이터의 비트를 결정합니다. 통상 8비트를 사 용합니다.

00 : 5-bit 01 : 6-bit 10 : 7-bit 11 : 8-bit [2] Number of Stop Bits at

End of Frame

• 1/1.5/2bit 세가지를 지원하는 것이 일반적이지 만, 441FX는 1/2bit만을 지원합니다.

0 : 1 Stop Bit 1 : 2 Stop Bit

[5:3] Parity Mode • 패리터 비트의 설정을 합니다.

0xx : No Parity Bit 100 : Odd Parity 101 : Even Parity

110 : Parity forced/checked as 1 111 : Parity forced/checked as 0

[6] Baud Rate Clock Selection • UART 장치의 동작속도를 결정하기 위한 기준 클럭소스를 선택합니다. MCLK은 ARM 프로세서가 동작하는 클럭이고, UTCLK는 UART&TIMER를 위 한 클럭입니다.

(33)

실습편

0 : Internal Clock Source(MCLK) 1 : UTCLK

[7] Infra-Red Mode Selection UART 혹은 IrDA 중 어느 동작상태로 설정할 것인 지를 결정합니다.

0 : Normal mode

1 : Infra-red Tx/Rx mode [표2-1] UART Line Control Register (LCON)

UCON (UART Control register)

Bit Description

[1:0] Reserve interrupt enable 00 : Do not generate receive interrupt 01 : Generate receive interrupt 10 : Not used

11 : Not used [2] Receive status in interrupt

enable

0 : Do not generate receive status interrupt 1 : Generate receive status interrupt [4:3] Transmit interrupt enable 00 : Do not generate transmit interrupt

01 : Generate transmit interrupt 10 : Not used

11 : Not used [5] Reserved

[6] Send break 0 : Do not generate receive status interrupt 1 : Generate receive status interrupt [7] Loop break enable 0 : Normal UART operating

1 : Infra-red Tx/Rx mode [표2-2] UART Control Register (UCON)

USSR (UART status register)

UART 장치의 상태정보를 확인하기 위한 레지스터입니다. 에러(Overrun, Parity, Frame Error)가 발생하였는지를 확인하기 위한 비트와 데이터 송수신 상태를 확인하기 위한 비트 가 있습니다.

(34)

실습편

Bit Description

[0] Overrun Error 0 : No overrun error during receive 1 : Overrun Error

[1] Parity Error 0 : No Parity error during receive 1 : Parity Error

[2] Frame Error 0 : No Frame error during receive 1 : Frame Error

[3] Break Interrupt

[4] Send break 0 : Do not generate receive status interrupt 1 : Generate receive status interrupt

[5] Receive Data Ready • 수신된 데이터가 있는지 없는지를 확인하기 위 한 비트입니다.

0 : No valid data

1 : Valid data in receive buffer register [6] Transmit Holding Register

Empty

• 송신하고자 하는 데이터는 홀딩버퍼와 실제 쉬 프트가 되는 버퍼 2개를 통해 송신되는데, 이 중 송신 동작을 통해 홀딩 버퍼가 비었는지를 확인하 는 비트입니다. 이곳이 비게 되면, 송신을 위한 새 로운 데이터를 쓸 수 있습니다.

0 : Valid data in transmit holding register 1 : No valid data

[7] Transmit Empty • 실제 쉬프트 동작을 하는 버퍼의 상태를 나타냅 니다.

0 : Transmitter not empty 1 : Transmitter empty [표2-3] UART Status Register (USSR)

TBR (Serial transmit buffer register)

송신버퍼 레지스터입니다. 홀딩버퍼로 이곳에 송신을 위한 데이터를 라이트하면, 쉬프 트를 위한 레지스터로 옮겨지게 됩니다.

RBR (Serial receive buffer register)

수신버퍼 레지스터입니다. 쉬프트 작업이 완료된 수신 데이터가 저장됩니다. USSR 상 태레지스터를 확인한 결과, 수신 데이터가 있는 상황이면 이 레지스터에서 데이터를 읽어 가면 됩니다.

(35)

실습편

UBRDR (Baud rate divisor register)

UART의 송수신 동작속도를 설정하기 위한 레지스터입니다. 일종의 프리스케일러입니다.

전송속도는 아래의 계산식에 의하여 결정됩니다.

Baud rate = source clock/((Divisor value + 1)*16)

소스 클럭은 MCLK, UTCLK 중에서 선택된 것을 사용합니다.

16으로 나누어주는 것은 송수신 데이터 1비트 구간동안 샘플링을 16번하기 때문입니다.

동기방식이 아니라 이러한 과정을 통해 정확한 데이터 값을 얻도록 하고 있습니다. 계산 을 하면, 소수점이하가 0으로 정확히 나누어지지 않는 경우가 있는데 이를 에러율이라고 합니다.

이를 해결하기 위해서는 외부 클럭이 UART의 정수배이어야 합니다.

(예:18.432MHz, 3.6864MHz 등등)

(36)

실습편

실험 3. Uart를 활용하여 계산기 프로그램 작성

자.. Uart의 원리는 다들 이해하셨나요..? 그럼 이제 활용을 해 보아야겠죠..?

이 장에서는 간단한 계산기를 만들어보도록 합시다.

<소스 프로그램>

다음은 한 자리의 연산을 실행하는 계산기 프로그램 소스입니다.

void Main(void) {

int i=0;

int op1=0, op2=0, op;

Delay(0); // Calibrate Delay() using the WDT.

Port_Init();

Uart_Init(115200);

Delay(100);

Uart_Printf("₩n₩nEx03. 계산기 프로그램 ₩n");

while(1) {

op1=Uart_Getch();

Uart_SendByte(op1);

op1-='0';

op =Uart_Getch();

Uart_SendByte(op);

op2=Uart_Getch();

op2-='0';

Uart_SendByte(op2+'0');

Uart_Printf("₩n");

if(op == '+')

Uart_Printf("Answer = %d ₩n", op1+op2);

(37)

실습편

else if(op == '-')

Uart_Printf("Answer = %d ₩n", op1-op2);

else if(op == '*')

Uart_Printf("Answer = %d ₩n", op1*op2);

else if(op == '/')

Uart_Printf("Answer = %d ₩n", op1/op2);

} // end of while(...)

} // end of main(...)

(38)

실습편

실험 4. 타이머 제어

타이머란 수를 세는 것을 말합니다. 아니, 그건 카운터라구요..? 하하.. 그렇지요..^^;

사실, 타이머랑 카운터는 구분하기가 좀 모호합니다. 혹자는 그 차이를 이렇게 정의하더군 요..

“ 타이머란 규칙적인 내부 시스템 클럭을 이용하여 일정 주기별로 작업할 때 사용되는 것을 말하며, 카운터란 외부핀에서 입력되는 불규칙적인 클럭 혹은 이벤트를 세는 것이 다.” 라구요.

사실, 타이머와 카운터의 하드웨어 구조는 동일합니다. 그런데도 그 두가지를 분류하는 것은 그 쓰임새 때문이 아닐까 싶네요. 어쨌든 저는, 감히 그것들을 정의 내리기는 힘들구 요.. 다만 그 차이를 다음과 같이 설명드리고 싶습니다. 예를들어, 1초에 한번씩 카운팅되는 시스템에서 10 클럭 만큼이 지났을 때, 이것을 10번 이라고 체크하면 카운터인 것이고, 이 를 10초라 인식하면 타이머라구요. ☺

S3F441FX에는 16-bit 타이머가 6개나 있습니다. 이러한 타이머들은 보통 인터럽트와 연 관되어 주로 사용됩니다. 타이머 인터럽트라는 말 많이 들어보셨지요..? 이번 실험에서는 타이머의 동작 원리와 타이머를 제어하기 위한 컨트롤 레지스터의 설정 방법 등을 알아보고 직접 제어해 보도록 합시다.

TnCON.6

8-bit Prescaler

Clear

UTCLK

TnCON.7

MUX 16-bit Up Counter (TnCNT)

16-bit Comparator

Timer n Buffer Register

Timer n Data Register (Read/Write)

TnCON.6

INTPND INTMASK

TnCON.5-.3 TIN

R Clear

Data Bus TnOVF

INTPND

INTMASK TnINT

TnCON.5-.3

Data Bus

Match Signal TnCLR TnOVF

Timer n Control Register where, n = 0, 1, 2, 3, 4 and 5 Match

TnCON.2

[그림4-1] 16-bit Timer Block Diagram

(39)

실습편

• Prescaler

프리스케일러는 카운터 레지스터로 입력되어지는 클럭을 원하는 비율로 분주시키는데 사 용됩니다. S3F441FX는 8bit의 프리스케일러를 가지고 있으므로 0-255까지 최대 256분주가 가능합니다.

• Counter

카운터는 입력 클럭에 따라 0부터 업카운팅 합니다. 16비트로 구성되어 있기 때문에 0- 65535까지 카운팅이 되면, 오버플로우 신호를 내보낸 후, 자동으로 0으로 초기화됩니다.

• Comparator

비교기는 카운터 레지스터값과 데이터 레지스터의 값을 비교하는데 사용됩니다. 만약 그 두 레지스터의 값이 같아지면, Match 신호를 내보냅니다.

다음은 타이머를 제어하는데 사용되는 타이머 컨트롤 레지스터를 나타내었습니다.

Bit Description

[1:0] Reserved

[2] Timer n Input Clock Selection Bits

0 : EXTCLK 1 : TIN [5:3] Timer n Operation Mode

Selection Bits

000 : Interval mode

001 : Match & Overflow mode 010 : Reserved

011 : Reserved

100 : Capture mode (Falling edge) 101 : Capture mode (Rising edge)

110 : Capture mode (Rising or falling edge) [6] Timet n Counter 0 : No

1 : Clear the timer n counter [7] Timer n input clock enable bit 0 : Disable timer n input clock

1 : Enable timer n input clock [표4-1] Timer n Control Register(TnCON)

위의 표를 보시면 Mode Selection Bit[5:3]가 있습니다. 카운팅 하는 방법에 따라 그 동 작 방식을 구분하는데, 이것을 동작 모드라 합니다. S3F441FX의 타이머에는 3가지의 동작 모드가 있습니다.

(40)

실습편

1. Interval Mode Operation

UTCLK

TnCNT clock

TnCNT

TnPRE=3

99 100 0 1

The timer match interrupt will occur.

NOTE: If the prescaler value is n, the prescaler factor is n + 1.

[그림4-2] Interval mode Example (TnDATA=100, TnPRE=3), UTCLK is Timer Source)

[그림4-2]을 보시면 TnCNT라는 16-bit 업 카운터가 있습니다. 이 카운터는 입력되는 클 럭에 맞추어 수를 업 카운팅 하는데, 이렇게 카운터 레지스터(TnCNT)의 값이 증가하다가 데이터 레지스터(TnDATA)의 값과 일치하게 되면 다시 0부터 카운팅을 시작합니다. 즉, 정 해진 값만큼만 카운팅을 하기 때문에 이를 Interval mode(시간간격모드)라 부릅니다.

2. Capture Mode Operation

이 방식은 이름 그대로 캡처를 하는 모드입니다. 캡처한다는 의미가 무엇인지는 아시져..?

관건은 무엇을 캡처하느냐인데요.. 잠깐 [실험1]로 되돌아가봅시다.

Port0는 일반 CMOS I/O Port로 사용됩니다. 그 중 GPIO7은 일반 입출력 포트 외에 TIN의 기능을 하도록 설정할 수 있습니다. 여기서 TIN이 바로 Capture input pin으로 사용됩니다.

TIN으로부터 입력 신호가 들어온 순간, 16비트 카운터 레지스터의 값은 타이머 데이터 레지 스터로 이동하게 되는데, 만약 TIN이 인가되는 순간 인터럽트 처리를 하여 그 데이터를 읽 어들이도록 프로그래밍을 한다면, 캡처가 되는 두 순간의 시간차이를 측정할 수 있게 되는 것입니다. 즉, 이 모드는 외부에서 발생하는 두 이벤트 사이의 시간차를 측정하는 목적으로 사용됩니다.

3. Match & Overflow Mode Operation

이 방식은 카운터 레지스터(TnCNT)의 값이 증가하다가 데이터 레지스터(TnDATA)의 값과 일치하게 되면, 레지스터의 값이 다시 0으로 초기화 되는 것이 아니라 Match 신호만 내보 낸 후, 카운팅을 계속합니다. 계속 증가하다가 레지스터가 다 차면(overflow) overflow 신호 를 내보내고 다시 0부터 카운팅을 합니다.

(41)

실습편

<소스 프로그램>

다음은 타이머 인터럽트를 초기화하는 방법을 설명하기 위한 소스 프로그램입니다.

void Isr_Init(void) {

rSYSCON&=~0x100; // Disable global interrupt control.

rINTMODE=0x0; // all IRQ

rINTPEND=0x0; // clear all pending bits rINTMASK=0x0; // disable

rINTMASK|=BIT_T0MC; // Enable Timer0 Match Interrupt pISR_T0MC=(unsigned)Tmr0MC;

rSYSCON|=0x100; // Enable global interrupt control.

}

void Tmr0Init() {

rT0PRE=0;

rT0DATA=(1000-1);

rT0CON=(1<<7)|(1<<6)|(0<<3)|(0<<2);

} // end of Tmr0Init(...)

void __irq Tmr0MC(void) {

rINTPEND=~BIT_T0MC;

cnt++;

} // end of Tmr0MC(...)

(42)

실습편

실험 5. 타이머를 이용한 멜로디 구현

저희 CyberLab에서 얼마전 441FX Training Kit를 이용하여 ‘말하는 시계’를 만들었답니다.

똑딱똑딱 시간이 가다가 스위치를 누르면 현재 시간을 말해주는 시계이지요. 궁금하심 한번 오세요.. 구경시켜드릴께요..^^*

여러분은 소리가 어떻게 만들어지는지 아시나요..? 화려한 핸드폰 벨소리를 들어보면 뭔 가 대단한 원리가 숨어있는 듯 하지만, 사실, 소리라는 것은 주파수가 일정한 구형파일 뿐 이랍니다. 왜 음파(소리를 내는 파형)라는 용어도 있잖아요..

요것(→)이 구형파입니다. 다들 아시죠..?

사인파, 삼각파, 톱니파 등등.. 모르시는 분들은 재빨리 전자회로 책을 살펴보시기 바랍니다.

Training Kit에서는 위와 같은 구형파를 만들어내기 위해서 다음과 같은 디지털 회로를 사 용하였습니다.

Sound_out Q2

2N2222A VCC_5.0

Q3 2N3906 1

23

R21

1K GPIO3

LS1 JMP2

두개의 Tr (2N2222/2N3906)은 스위치의 역할을 하여, GPIO3로 “1”이 나오면 “1”이,

“0”이 나오면 “0”이 출력됩니다. 따라서 일정한 주파수만 만들어내면 원하는 소리가 만 들어지는 것이지요. 여기서 정확하고도 일정한 주파수를 만들어내기 위해 이전 실험에서 다루었던 타이머가 필요한 것입니다.

(43)

실습편

그럼, 프로그램밍을 위해 단계별로 살펴보겠습니다.

1. GPIO3를 출력 포트로 설정합니다. 설정 방법은 아시져..? 기억이 안나시는 분들은 재빨리 [실험1] I/O Port를 살펴봅시다.

2. 일정한 주기를 만들어내기 위해 타이머(Timer0)를 사용합니다. 따라서 타이머를 초 기화 해주어야 하구요. ‘0’과 ‘1’이 교대로 출력되도록 하기 위해, 타이머 서비스 루 틴에서는 GPIO3의 값을 토글(toggle)시키는 작업만 해주면 됩니다.

3. 소리가 나오는지 귀를 쫑긋.. 투~~~하는 소리를 들으실 수 있으실거예요.

단, 사람의 가청 주파수는 20Hz~20KHz입니다. 타이머의 주기 설정할 때, 주의하 세요~

<좀더 알아보기>

1. 주파수를 점진적으로 증가시키거나 감소시켜 사이렌 소리를 만들어봅시다.

2. 위의 예제를 활용하여 좋아하는 노래를 연주해봅시다.

(44)

실습편

실험 6. 외부 인터럽트 제어

인터럽트란 현재 실행중인 프로그램을 일시 중지시키고, 다른 프로그램을 실행해서 사건 을 처리하는 상황을 말합니다. 타이머 인터럽트를 예로들면, 메인 함수에서 어떤 일을 실행 하다가 일정한 시간이 되면(이는 타이머가 설정하지요.) 타이머 인터럽트 서비스 루틴으로 점프하여 그 일을 수행합니다. 물론 그 사건을 다 처리하면 다시 제자리로 돌아가 원래 하 던 일을 마저 수행하구요.. 외부 인터럽트도 같은 원리입니다. 차이점은 인터럽트 소스가

‘정해진 시간’이 아니라 ‘외부로부터의 이벤트’라는 것이지요. 이번 실험에서는 인터럽트를 위한 환경 설정과 그 수행 과정 등에 대해 알아보도록 하겠습니다.

S3F441FX는 총 19개의 인터럽트 소스를 가지고 있습니다.

[18] EINT2 external interrupt.

[17] EINT1 external interrupt.

[16] EINT0 external interrupt.

[15] Basic Timer Interrupt.

[14] Timer 5 Match/Capture interrupt.

[13] Timer 5 Overflow interrupt.

[12] Timer 4 Match/Capture interrupt.

[11] Timer 4 Overflow interrupt.

[10] Timer 3 Match/Capture interrupt.

[9] Timer 3 Overflow interrupt.

[8] Timer 2 Match/Capture interrupt.

[7] Timer 2 Overflow interrupt.

[6] Timer 1 Match/Capture interrupt.

[5] Timer 1 Overflow interrupt.

[4] Timer 0 Match/Capture interrupt.

[3] Timer 0 Overflow interrupt.

[2] UART error.

[1] UART transmit interrupt.

[0] UART receive interrupt.

이 소스들은 인터럽트를 요청하기 위해 자신에게 해당되는 인터럽트 펜딩 비트를 ‘1’로 셋(set) 하는데, 그러면 CPU는 펜딩비트를 폴링하여 인터럽트 요청을 확인하게 됩니다. 이 때, 펜딩 비트를 어떤 순서로 폴링하느냐에 따라 그 우선 순위가 결정됩니다. 현재 제공되 는 스타트업 소스(startup.s)에는 하위 비트부터 폴링하도록 프로래밍되어 있습니다. 따라서

(45)

실습편

동시에 여러 인터럽트가 발생한다면, UART receive interrupt가 일순위로 EINT2가 마지막으 로 처리될 것입니다.

사실, 인터럽트의 일련의 과정을 이해하시려면, 익셉션이란 개념을 아셔야 합니다. 다른 프로세서에는 나오지 않은 개념이라 이해하시기 좀 힘드실 수도 있겠네요. 간단히 살펴보도 록 하지요.

ARM은 7가지의 익셉션 모드를 지원합니다.

• Reset Exception

리셋이 걸리면 진입하는 모드입니다. 즉, 어떤 메모리 영역에서 작업이 수행되다가, 리셋이 걸리면 무조건 메모리의 0번지로 분기합니다.

• Undefined Instruction Exception

명령어를 읽었는데, 알 수 없는 명령어가

수치

[그림  3-1] Training Kit (Layout)

참조

관련 문서