ENGLISH 简体中文 日本語 한국어  


애플리케이션 노트  3477

무료 SDCC C 컴파일러를 사용하여 DS89C430/450 마이크로컨트롤러 제품군용 펌웨어 개발

개요: SDCC(Small Devices C Compiler)는 8비트 마이크로컨트롤러를 위해 개발된 무료 C 컴파일러이다. 이 애플리케이션 노트에서는 SDCC를 사용하여 초고속 8051 호환 마이크로컨트롤러 DS89C430/450 제품군용 펌웨어를 개발하는 방법을 알려준다. SDCC 무료 C 컴파일러의 설치에 대해서도 설명한다.

개요

SDCC(Small Devices C Compiler)는 8비트 마이크로컨트롤러를 위해 개발된 무료 C 컴파일러이다. 이 SDCC 컴파일러는 여러 다양한 구조와 호환되지만 8051 코어 기반 소자에 대한 지원을 확장하였다. 이 애플리케이션 노트는 Maxim/Dallas Semiconductor의 초고속 8051 호환 마이크로컨트롤러 DS89C430/450 제품군용 펌웨어 개발에 초점을 맞춘다.

SDCC는 프로세서, 컴파일러, 어셈블러, 링커(linker) 및 최적화기(optimizer)를 포함하는 명령 행(command line), 펌웨어 개발 툴이다. 설치 파일과 함께 gdb(GNU Debugger)와 유사한 소스 레벨 디버거인 SDCDB도 번들로 포함된다. 오류 없는 프로그램이 컴파일되고 SDCC와 링크되면 Intel hex 형식의 로드 모듈이 생성된다. 이 파일은 직렬 로더(serial loader)를 사용하여 DS89C430/450 마이크로컨트롤러의 플래시 메모리로 로드할 수 있다. (펌웨어를 장치로 다운로드하는 작업에 대한 자세한 내용은 DS89C430/450 문서 및 애플리케이션 노트를 참조한다).

SDCC에 대한 최신 정보에 대해서는 http://sdcc.sourceforge.net을 방문하거나 SDCC 매뉴얼 sdccman.pdf (설치 시 사용자의 하드 드라이브에 복사됨)을 참조한다. 또한 온라인 SDCC 메시지 포럼 또는 SDCC 웹페이지의 "Support" 항목에 있는 메일링 리스트에 질문을 보낼 수 있다.

SDCC 무료 C 컴파일러 설치

SDCC를 설치하려면, SDCC 웹사이트 http://sdcc.sourceforge.net의 "Download" 항목에서 최신 버전을 다운로드한다. 야간에 구성된 소프트웨어를 이용할 수 있지만, 일반적으로 완벽하게 시험된 최신 출시 버전을 다운로드하는 것이 가장 안전하다.

"Download" 페이지에서 다양한 운영체제에 맞게 SDCC의 구성이 가능하다. Microsoft Windows를 실행하는 PC에서 작업할 경우, win32 자동 실행 SDCC 설치 파일을 다운로드하고 이 실행 파일을 실행한다.

프로그램 설치 시, 프로그램 바이너리가 포함된 디렉토리를 사용자의 경로에 추가할 것인지 묻는 Prompt가 나타난다. 이 사항이 권장되고, 이하 이 애플리케이션 노트에서는 사용자가 그렇게 경로를 추가한 것으로 가정한다.

SDCC 컴파일러를 사용하여 간단한 C 프로그램 컴파일

SDCC를 하드 드라이브에 올바로 설치하려면, Command prompt를 열고 sdcc --version을 입력한다. [Enter]를 누르면 그림 1과 같이 표시되는 문장이 화면에 나타난다 (실제 문장은 다운로드된 SDCC 버전에 따라 다르다).


그림 1. 버전 확인을 통해 SDCC의 올바른 설치를 확인

포함 경로를 시험하려면 sdcctest.c라는 파일을 생성하고 이 파일에 다음과 같은 소스 코드를 복사한다.

#include 

char str[6] = "MAXIM";
bit  flag;

void main(void)
{
     if (strcmp(str,"MAXIM") == 0)
          flag = 0;
     else
          flag = 1; 

     while(1); // program loop
}
이 파일을 일반 ASCII 형식(즉, Microsoft Notepad 사용)으로 저장한다. Command prompt에서 sdcc sdcctest.c를 입력하고 [Enter]를 누른다. 그림 2와 같이 아무것도 나타나지 않으면 프로그램은 성공적으로 컴파일된 것이다.


그림 2. 간단한 SDCC 프로그램 컴파일

소스 코드를 성공적으로 컴파일하면 SDCC에 의해 많은 파일들이 생성된다. 사용자가 컴파일한 디렉토리에서 다음 파일들을 찾는다.

  • sdcctest.asm: 프로그램용 어셈블러 파일
  • sdcctest.lst: 프로그램용 리스팅 파일
  • sdcctest.rst: 링커에 의해 업데이트된 프로그램용 리스팅 파일
  • sdcctest.map: 링커에 의해 업데이트된 최종 메모리 맵
  • sdcctest.ihx: 형식으로 된 로드 모듈. 이 파일은 마이크로컨트롤러로 다운로드되어야 함.
다른 파일들도 생성된다(그 중 대다수는 소스 레벨 디버거 용임). 자세한 내용은 SDCC 문서를 참조한다.

SDCC 특유의 데이터 유형

SDCC는 대부분의 ANSI-C 데이터 유형을 지원한다. SDCC는 또한 8051 구조를 이용하기 위해 여러 확장 데이터 유형(스토리지 클래스라고도 함)을 지원한다. 이러한 데이터 유형은 다음 항목에서 예제와 함께 제시된다.

일부 상용 8051 마이크로컨트롤러 개발 툴과 달리, SDCC는 오직 특수 기능 레지스터를 비트 및 바이트 주소 지정 가능으로 소거할 수 있다. 공유 비트와 바이트 주소 지정 가능 RAM은 8051 어셈블리 언어에 의해 지원되지만 SDCC에 의해서는 지원되지 않는다. 이것을 증명하려면 다음 코드 샘플과 컴파일된 어셈블러 코드를 관찰한다.

C 소스 코드:

union
{
  unsigned char a_byte;
  struct
  {
    unsigned char bit0 : 1;
    unsigned char bit1 : 1;
    unsigned char bit2 : 1;
    unsigned char bit3 : 1;
    unsigned char bit4 : 1;
    unsigned char bit5 : 1;
    unsigned char bit6 : 1;
    unsigned char bit7 : 1;
  } a_bit;
} a;

bit b;

void main(void)
{
     a.a_byte     = 0x05;
     a.a_bit.bit6 = 1;
     b            = 1;

     while(1); // program loop
}

Assembly listing (.rst file):

                            ...
                            159 ;sdcctest.c:21: a.a_byte = 5;
                            160 ;     genPointerSet
                            161 ;     genNearPointerSet
                            162 ;     genDataPointerSet
   0031 75 21 05            163 	mov	_a,#0x05
                            164 ;sdcctest.c:23: a.a_bit.bit6 = 1;
                            165 ;     genPointerSet
                            166 ;     genNearPointerSet
   0034 78 21               167 	mov	r0,#_a
                            168 ;     genPackBits
   0036 E6                  169 	mov	a,@r0
   0037 44 40               170 	orl	a,#0x40
   0039 F6                  171 	mov	@r0,a
                            172 ;sdcctest.c:25: b = 1;
                            173 ;     genAssign
   003A D2 00               174 	setb	_b
                            175 ;sdcctest.c:27: while(1); // program loop
                            ...
"a"의 선언문에 있는 비트 필드가 비트 주소 지정 메모리처럼 보이지만, 어셈블리 리스트 (SDCC가 생성한 .rst 파일에서 비롯된)는 변수가 비트 주소 지정을 사용하지 않는다는 것을 보여준다. 리스트에서 "a"와 "_a"를 혼동하지 않도록 한다. "a"는 누적기(accumulator)를 의미하고 "_a"는 변수를 의미한다.

이 애플리케이션 노트의 "절대 주소 지정" 항목에서는 메모리가 진정한 비트 주소 지정 가능 메모리로서 동작하도록 메모리를 할당하는 흥미로운 방식을 제시한다.

near/data
near 또는 data 스토리지 클래스가 있는 변수를 선언하면 변수가 8051 코어에서 직접 주소 지정이 가능한 RAM에 위치된다. DS89C430/450 마이크로컨트롤러 제품군은 128바이트의 직접 주소 지정 가능 메모리를 갖는다. 이것은 8051이 액세스할 수 있는 가장 빠른 메모리 유형이고 이 RAM 영역에서 데이터를 읽거나 쓰기 위해 생성된 어셈블리 코드는 단일 MOV 명령을 필요로 한다.

#include "sdcc_reg420.h"

data unsigned char outPort0 = 0x4A;

void main(void)
{
     P0 = outPort0;

     while (1); // program loop
}
이 예에서 사용된 sdcc_reg420.h 정의 파일은 부록 A에 있다.

far/xdata
far 또는 xdata 스토리지 클래스가 있는 변수를 선언하면 변수는 외부 RAM에 위치한다. 이것은 개발자에게 훨씬 더 큰 RAM 공간에 대한 액세스를 제공하지만, 이 메모리를 읽고 쓰기 위해 생성된 어셈블리 코드는 외부 메모리 주소를 데이터 포인터로 로드해야 하는 MOVX 명령을 사용한다.

DS89C430/450 마이크로컨트롤러 제품군은 far/xdata와 함께 선언된 변수를 위해 사용될 수 있는 1킬로바이트 내부 SRAM을 포함하고 있다. 이 메모리가 초기화 또는 사용될 수 있으려면 전력 관리 레지스터 (PMR)의 DME1:0 비트가 내부 SRAM 모드에 대해 설정되어야 한다.


#include "sdcc_reg420.h"

xdata unsigned char ioPorts[2];

void main(void)
{
     PMR  |= 0x01; // Enable internal 1K SRAM

     ioPorts[0] = 0x4A;
     ioPorts[1] = 0x56;

     P0         = ioPorts[0];
     P1         = ioPorts[1];

     while (1); // program loop
}
idata
idata 스토리지 클래스를 가진 변수를 선언하면 이 변수는 8051 코어 내부의 간접적으로 주소 지정되는 메모리에 위치한다. 간접 주소 지정 메모리는 8051 코어에서 128바이트를 사용할 수 있기 때문에 (특수 기능 레지스터 불포함) 직접 주소 지정 메모리와 유사하다. 그러나 idata에 액세스하려면 RAM 주소를 동작 레지스터로 이동시키기 위한 추가 MOV 명령이 필요하다.
#include "sdcc_reg420.h"

idata unsigned int port0_x2;

void main(void)
{
     while (1) // program loop
     {
          port0_x2 = P0 * 2;
     }
}
pdata
pdata 스토리지 클래스는 호출된 외부 데이터 메모리에 액세스하기 위해 사용된다. 이 메모리 유형은 이 애플리케이션 노트에서는 다루지 않으며 관심있는 독자는 SDCC 문서의 pdata 항목을 검토하길 바란다.

code
code 스토리지 클래스가 있는 변수를 선언하면 변수는 프로그램 메모리 안에 위치한다 (특히 DS89C430/450 마이크로컨트롤러 내부 플래시 메모리). 변수는 SDCC에 대해 읽기 전용이므로, code를 사용하여 프로그램에서 상수(룩업 테이블 등)를 선언한다.

#include "sdcc_reg420.h"

code unsigned char out[10] = {0x03,0x45,0xFA,0x43,0xDD,
                              0x1A,0xE0,0x00,0x87,0x91};

void main(void)
{
     data unsigned char i = 0;

     while (1) // program loop
     {
          P0 = out[i++];
          if (i==10)
               i=0;
     }
}
bit
bit 스토리지 클래스가 있는 변수를 선언하면 변수는 8051 코어 내부의 비트 주소 지정 가능 메모리에 위치한다. 8051 코어는 비트 주소 지정 메모리 (바이트 0x20 ~ 0x2F)로 행동할 수 있는 16바이트의 직접 주소 지정 RAM을 가지며, 총 128개의 주소 지정 비트를 제공한다. 이러한 유형의 변수는 플래그를 위한 효율적인 메모리 사용이다.
#include "sdcc_reg420.h"

#define ESCAPE 0x1B

bit esc_char_flag = 0;

void main(void)
{
     P1 = 0x00;

     while (!esc_char_flag)
     {
          if (P0 == ESCAPE)
               esc_char_flag = 1;
     }

     P1 = 0xFF;

     while (1); // program loop
}
sfr
sfr 스토리지 클래스는 8051 코어에 있는 특정 특수 기능 레지스터(SFR)를 정의한다. 부록 A에 제시된 정의 파일은 sfr 식별 기호를 사용하여 DS89C430/450 마이크로컨트롤러에 있는 모든 SFR을 정의한다.

다음 예는 SFR을 정의한다. 따라서 sdcc_reg420.h 정의 파일을 포함시킬 필요가 없다.

sfr at 0x80 P0;
sfr at 0x90 P1;

void main(void)
{
     P0 = 0x00;
     P1 = 0xFF;

     while (1); // program loop
}
sbit
sbit 스토리지 클래스는 비트 주소 지정 가능 SFR 내부에 있는 특정 비트를 정의한다. 8051 코어에서 0 또는 8(hex)로 끝나는 주소를 가진 모든 SFR은 비트 주소 지정이 가능하다. 부록 A에 제시된 정의 파일은 sbit 식별 기호를 사용하여 DS89C430/450 마이크로컨트롤러에 있는 모든 SFR 주소 지정 가능 비트를 정의한다.
sfr  at 0x80 P0;   // Port 0

sbit at 0x80 P0_0; // Port 0 bit 0
sbit at 0x81 P0_1; // Port 0 bit 1
sbit at 0x82 P0_2; // Port 0 bit 2
sbit at 0x83 P0_3; // Port 0 bit 3
sbit at 0x84 P0_4; // Port 0 bit 4
sbit at 0x85 P0_5; // Port 0 bit 5
sbit at 0x86 P0_6; // Port 0 bit 6
sbit at 0x87 P0_7; // Port 0 bit 7

void main(void)
{
     P0   = 0x00; // P0 = 0x00

     P0_4 =    1; // P0 = 0x10

     while (1);   // program loop
}
절대 주소 지정
절대 주소 지정은 at 식별 기호를 사용하여 SDCC에 의해 지원된다. 불행히 SDCC는 절대 주소에 선언된 변수를 추적하지 않으며 변수가 겹치지 않도록 다른 변수를 선언할 수 있다.

다음 프로그램 예는 흥미로운 잠재적인 버그를 나타낸다.

#include "sdcc_reg420.h"

unsigned char           a     = 0x4A;
unsigned int            b     = 0x0000;
unsigned char           c[64] = {0x00};

unsigned char at 0x0010 y;
unsigned char at 0x0010 z;

void main(void)
{
     for(b=0; b<64; b++)
          c[b] = 0xAA;

     y = 0xF1;
     z = 0xF2;

     a = c[5];

     while (1); // program loop
}
SDCC를 사용하여, 이 예에서는 2개의 변수 "y"와 "z"가 동일한 위치에 지정되기는 하지만 오류 또는 경고가 없이 컴파일된다. 그 다음, 이 프로그램을 실행시킬 경우, 이 프로그램에서 (a = c[5]) 최종 지정 "a"를 0xAA로 설정하도록 연구한다. 그러나 이것은 그 경우가 아니다. 최종 지정 후 "a"의 실제 값은 0xF2이다.

우리는 각 변수에 대해 사용된 실제 주소를 나타내는 SDCC에 의해 생성된 .map 파일에서 다음 행을 검사하여 이러한 이상한 결과의 이유를 알아볼 수 있다.

Area                               Addr   Size   Decimal Bytes (Attributes)
--------------------------------   ----   ----   ------- ----- ------------
.  .ABS.                           0000   0000 =      0. bytes (ABS,OVR)

      Value  Global
   --------  --------------------------------
     ...
     0010    _y
     0010    _z
     ...

Area                               Addr   Size   Decimal Bytes (Attributes)
--------------------------------   ----   ----   ------- ----- ------------
DSEG                               0008   0043 =     67. bytes (REL,CON)

      Value  Global
   --------  --------------------------------
     0008    _a
     0009    _b
     000B    _c
변수 이름의 처음에 있는 밑줄은 컴파일러에 의해 추가된다. "c"가 주소 0x000B에 위치하고 길이가 어레이 64바이트일 경우, 주소 0x0010에서 "y"와 "z" 변수는 겹치게 된다.

절대 주소 지정의 용도는 비트 주소 지정 가능 변수를 묘사하는 것이다. 다음 예에서 비트 주소 지정 가능 메모리에서 마지막 바이트 위치에 변수 n_byte를 정의하기로 한다. 그 다음, 8051 코어의 비트 주소 지정 가능 메모리의 마지막 8비트 위치에 n_bit0 ~ n_bit7을 정의한다. 이것들이 겹치기 때문에, n_byte 변수는 n_bit0 ~ n_bit7 변수를 사용하여 비트 주소 지정이 가능하다.

#include "sdcc_reg420.h"

data unsigned char at 0x002F n_byte;

bit                at 0x78   n_bit0;
bit                at 0x79   n_bit1;
bit                at 0x7A   n_bit2;
bit                at 0x7B   n_bit3;
bit                at 0x7C   n_bit4;
bit                at 0x7D   n_bit5;
bit                at 0x7E   n_bit6;
bit                at 0x7F   n_bit7;

void main(void)
{
     n_byte = 0x00;
     n_bit4 = 1;

     P0     = n_byte; // P0 = 0x10

     while (1);       // program loop
}

메모리 모델
SDCC는 소형 및 대형, 2개 메모리 모델을 지원한다. 소형 메모리 모델을 사용할 경우, SDCC는 내부 RAM에서 저장장치 클래스 (즉, data, idata, xdata, pdata, bit, code) 없이 모든 변수를 선언한다. 대형 메모리 모델을 사용할 경우, SDCC는 외부 RAM에서 저장장치 클래스 없이 모든 변수를 선언한다.

소형 메모리 모델은 SDCC를 사용하여 컴파일할 때 기본값이다. SDCC가 특정 메모리 모델을 사용하도록 하려면 다음 명령 행 파라미터를 추가한다.

sdcc --model-small sdcctest.c
또는
sdcc --model-large sdcctest.c
서로 다른 저장영역 클래스로 컴파일된 모듈 또는 객체 파일을 결합하지 않도록 한다.

SDCC에서 인터럽트
인터럽트 서비스 루틴(ISR: Interrupt Service Routine)을 정의하려면 다음 형식을 사용해야 한다.

void interrupt_identifier (void) interrupt interrupt_number using bank_number
{
     ...
}
interrupt_identifier는 임의의 유효한 SDCC 함수 이름일 수 있다. interrupt_number는 인터럽트 벡터 표 안에 있는 인터럽트의 위치이다. 표 1은 DS89C430/450 마이크로컨트롤러 제품군에 의해 지원되는 모든 인터럽트의 인터럽트 번호를 나타낸다. bank_number는 SCDD에게 ISR에 로컬 변수를 저장할 레지스터 뱅크를 표시하는 옵션 파라미터이다.

표 1. DS89C430/450 인터럽트 서비스 루틴의 인터럽트 번호
Interrupt Name Interrupt Vector Interrupt Number
External Interrupt 0 0x03 0
Timer 0 Overflow 0x0B 1
External Interrupt 1 0x13 2
Timer 1 Overflow 0x1B 3
Serial Port 0 0x23 4
Timer 2 Overflow 0x2B 5
Power Fail 0x33 6
Serial Port 1 0x3B 7
External Interrupt 2 0x43 8
External Interrupt 3 0x4B 9
External Interrupt 4 0x53 10
External Interrupt 5 0x5B 11
Watchdog Interrupt 0x63 12

SDCC는 스택에 누적기 및 데이터 포인터를 저장하고 스택으로부터 이것들을 복구하는 일과 같은 ISR 프로그래밍과 관련된 많은 세부사항을 처리한다. (이것은 실제로 모든 기능에 대해서도 수행된다. 이러한 변수를 스택에 저장하는 기능을 디스에이블하려면 SDCC 매뉴얼의 _naked 키워드를 참조한다.) 다른 세부사항은 SDCC에 의해 처리되지 않으며 (합당한 이유로 인해) 이 때문에 내장 프로그래밍을 처음 접하는 개발자들은 곤경에 처하기도 한다. 이러한 문제들은 대부분 이 글의 범위를 벗어나는 고급 프로그래밍 개념이지만, 내장 프로그래밍 설명서와 SDCC 매뉴얼도 더 많은 통찰력을 제공할 수 있다.

인터럽트 사용 시 다음 규칙을 따라야 한다.

  • ISR 내부에 기록될 수 있고 ISR 외부에서 액세스되는 모든 전역 변수는 volatile로 선언되어야 한다. 이렇게 하면 최적기는 이 변수와 관련된 명령을 제거하지 않는다.
  • 극미하지 않은 방식(non-atomic way)으로 데이터를 사용할 때마다(즉, 16비트/32비트 변수에 액세스할 때마다) 인터럽트를 디스에이블한다. 변수에 대한 액세스는 프로세서가 데이터를 메모리에 저장하고 메모리로부터 로드하는 ISR을 가로챌 수 없을 때 극미하다.
  • ISR 내부로부터 기능 호출을 피한다. 이 작업을 해야 할 경우, RAM이 아닌 스택에 있는 함수에 모든 로컬 변수를 할당하는 재진입자reentrant로서 기능을 선언한다 (SDCC 설명서 참조).
SDCC 프로그램이 main() 함수를 포함하는 소스 파일 이외의 소스 파일에 위치한 ISR을 사용할 경우, main() 함수를 포함하는 소스 파일은 이러한 각각의 ISR을 위한 함수 프로토타입을 포함해야 한다.

아래 예는 직렬 통신 인터페이스 1 (SCI_1) 인터럽트 서비스 루틴을 처리할 ISR을 정의한다. 프로그램은 SCI_1 수신기로부터 1개 바이트를 수신하고, 이 바이트를 1만큼 증가시킨 다음, SCI_1 송신기를 통해 계속해서 송신한다.

#include "sdcc_reg420.h"

volatile unsigned char n = 0x4A;

void sci1ISR (void) interrupt 7
{
    if (RI_1)
    {
        n     = SBUF1+1;     // Save Rx byte
        RI_1  = 0;           // Reset SCI_1 Rx interrupt flag
    }
    else if (TI_1)
    {
        SBUF1 = n;           // Load byte to Tx
        TI_1  = 0;           // Reset SCI_1 Tx interrupt flag
    }
}

void main(void)
{
    // 1. Init Serial Port
    EA    = 0;              // Enable global interrupt mask
    SCON1 = 0x50;           // Set SCI_1 to 8N1, Rx enabled
    TMOD |= 0x20;           // Set Timer 1 as Mode 2
    TH1   = 0xDD;           // Set SCI_1 for 2400 baud
    TR1   = 1;              // Enable Timer 1
    ES1   = 1;              // Enable interrupts for SCI_1
    EA    = 1;              // Disable global interrupt mask

    // 2. Initiate SCI_1 Tx
    SBUF1 = n;

    // 3. Program loop...
    while (1);
}
인라인 어셈블리
인라인 어셈블리는 SDCC에 의해 완벽하게 지원된다. 이 기능을 사용하려면 _asm_endasm 식별자 사이에 어셈블리 코드를 내포시킨다. 또한 인라인 어셈블리 코드는 변수 이름의 첫 부분에 배경 문자 하나를 위치시킴으로써 C 변수에 액세스할 수 있다. 다음 예는 인라인 어셈블리를 사용하여 nop 명령 (마이크로컨트롤러 내부에서 클록 사이클을 낭비하기 위해 사용되는)을 수행한 다음 변수 "a"를 1만큼 증가시킨다.
#include "sdcc_reg420.h"

unsigned char a;

void main(void)
{
    // program loop...
    while (1)
    {

          a = P0;

          _asm
               nop
               nop
               nop
               inc _a
          _endasm;

          P1 = a;
    }
}
SDCC는 C와 어셈블리 기능을 인터페이스할 수도 있다. 이것은 고급 단계의 주제이며 자세한 내용은 SDCC 매뉴얼을 참조한다.

부록 A: DS89C430/450을 위한 SFR 정의 파일 (sdcc_reg420.h)

/*
 * sdcc_reg420.h
 *
 * MAXIM INTEGRATED PRODUCTS
 *
 * Special Function Register definitions file
 * DS89C420/430/440/450 Ultra-High Speed 8051-compatible uCs
 *
 */

#ifndef __REG420_H__
#define __REG420_H__

/*  BYTE Registers  */
sfr at 0x80 P0;
sfr at 0x81 SP;
sfr at 0x82 DPL;
sfr at 0x83 DPH;
sfr at 0x84 DPL1;
sfr at 0x85 DPH1;
sfr at 0x86 DPS;
sfr at 0x87 PCON;
sfr at 0x88 TCON;
sfr at 0x89 TMOD;
sfr at 0x8A TL0;
sfr at 0x8B TL1;
sfr at 0x8C TH0;
sfr at 0x8D TH1;
sfr at 0x8E CKCON;
sfr at 0x90 P1;
sfr at 0x91 EXIF;
sfr at 0x96 CKMOD;
sfr at 0x98 SCON0;
sfr at 0x99 SBUF0;
sfr at 0x9D ACON;
sfr at 0xA0 P2;
sfr at 0xA8 IE;
sfr at 0xA9 SADDR0;
sfr at 0xAA SADDR1;
sfr at 0xB0 P3;
sfr at 0xB1 IP1;
sfr at 0xB8 IP0;
sfr at 0xB9 SADEN0;
sfr at 0xBA SADEN1;
sfr at 0xC0 SCON1;
sfr at 0xC1 SBUF1;
sfr at 0xC2 ROMSIZE;
sfr at 0xC4 PMR;
sfr at 0xC5 STATUS;
sfr at 0xC7 TA;
sfr at 0xC8 T2CON;
sfr at 0xC9 T2MOD;
sfr at 0xCA RCAP2L;
sfr at 0xCB RCAP2H;
sfr at 0xCC TL2;
sfr at 0xCD TH2;
sfr at 0xD0 PSW;
sfr at 0xD5 FCNTL;
sfr at 0xD6 FDATA;
sfr at 0xD8 WDCON;
sfr at 0xE0 ACC;
sfr at 0xE8 EIE;
sfr at 0xF0 B;
sfr at 0xF1 EIP1;
sfr at 0xF8 EIP0;

/* BIT Registers  */

/* P0 */
sbit at 0x80 P0_0;
sbit at 0x81 P0_1;
sbit at 0x82 P0_2;
sbit at 0x83 P0_3;
sbit at 0x84 P0_4;
sbit at 0x85 P0_5;
sbit at 0x86 P0_6;
sbit at 0x87 P0_7;

/* TCON */
sbit at 0x88 IT0;
sbit at 0x89 IE0;
sbit at 0x8A IT1;
sbit at 0x8B IE1;
sbit at 0x8C TR0;
sbit at 0x8D TF0;
sbit at 0x8E TR1;
sbit at 0x8F TF1;

/* P1 */
sbit at 0x90 P1_0;
sbit at 0x91 P1_1;
sbit at 0x92 P1_2;
sbit at 0x93 P1_3;
sbit at 0x94 P1_4;
sbit at 0x95 P1_5;
sbit at 0x96 P1_6;
sbit at 0x97 P1_7;

/* SCON0 */ 
sbit at 0x98 RI_0;
sbit at 0x99 TI_0;
sbit at 0x9A RB8_0;
sbit at 0x9B TB8_0;
sbit at 0x9C REN_0;
sbit at 0x9D SM2_0;
sbit at 0x9E SM1_0;
sbit at 0x9F SM0_0;
sbit at 0x9F FE_0;

/* P2 */
sbit at 0xA0 P2_0;
sbit at 0xA1 P2_1;
sbit at 0xA2 P2_2;
sbit at 0xA3 P2_3;
sbit at 0xA4 P2_4;
sbit at 0xA5 P2_5;
sbit at 0xA6 P2_6;
sbit at 0xA7 P2_7;

/* IE */
sbit at 0xA8 EX0;
sbit at 0xA9 ET0;
sbit at 0xAA EX1;
sbit at 0xAB ET1;
sbit at 0xAC ES0;
sbit at 0xAD ET2;
sbit at 0xAE ES1;
sbit at 0xAF EA;

/* P3 */
sbit at 0xB0 P3_0;
sbit at 0xB1 P3_1;
sbit at 0xB2 P3_2;
sbit at 0xB3 P3_3;
sbit at 0xB4 P3_4;
sbit at 0xB5 P3_5;
sbit at 0xB6 P3_6;
sbit at 0xB7 P3_7;

/* IP0 */
sbit at 0xB8 LPX0;
sbit at 0xB9 LPT0;
sbit at 0xBA LPX1;
sbit at 0xBB LPT1;
sbit at 0xBC LPS0;
sbit at 0xBD LPT2;
sbit at 0xBE LPS1;

/* SCON1 */
sbit at 0xC0 RI_1;
sbit at 0xC1 TI_1;
sbit at 0xC2 RB8_1;
sbit at 0xC3 TB8_1;
sbit at 0xC4 REN_1;
sbit at 0xC5 SM2_1;
sbit at 0xC6 SM1_1;
sbit at 0xC7 SM0_1;

/* T2CON */
sbit at 0xC8 CP_RL_2;
sbit at 0xC9 C_T_2;
sbit at 0xCA TR_2;
sbit at 0xCB EXEN_2;
sbit at 0xCC TCLK;
sbit at 0xCD RCLK;
sbit at 0xCE EXF_2;
sbit at 0xCF TF_2;

/* PSW */
sbit at 0xD0 PARITY;
sbit at 0xD0 P;
sbit at 0xD1 F1;
sbit at 0xD2 OV;
sbit at 0xD3 RS0;
sbit at 0xD4 RS1;
sbit at 0xD5 F0;
sbit at 0xD6 AC;
sbit at 0xD7 CY;

/* WDCON */
sbit at 0xD8 RWT;
sbit at 0xD9 EWT;
sbit at 0xDA WTRF;
sbit at 0xDB WDIF;
sbit at 0xDC PFI;
sbit at 0xDD EPFI;
sbit at 0xDE POR;
sbit at 0xDF SMOD_1;

/* EIE */
sbit at 0xE8 EX2;
sbit at 0xE9 EX3;
sbit at 0xEA EX4;
sbit at 0xEB EX5;
sbit at 0xEC EWDI;

/* EIP0 */
sbit at 0xF8 LPX2;
sbit at 0xF9 LPX3;
sbit at 0xFA LPX4;
sbit at 0xFB LPX5;
sbit at 0xFC LPWDI;

#endif


의견을 보내주세요!
위 내용이 도움이 되셨나요?
여러분의 의견을 기다립니다 — Maxim은 보내주신 정정이나 제안사항을 반영하고 있습니다. 이 페이지를 평가하고 의견을 보내주십시오.


자동 업데이트
관심있는 분야의 애플리케이션 노트가 나올 때 자동으로 업데이트 받고 싶으세요? 그렇다면 EE-Mail™을 신청하십시오.



추가 정보  APP 3477: Nov 09, 2005
DS89C430 초고속 플래시 마이크로컨트롤러 전체 데이터 시트
(PDF, 1.5MB)
무료 샘플
DS89C450 초고속 플래시 마이크로컨트롤러 전체 데이터 시트
(PDF, 1.5MB)
무료 샘플
 

다운로드, PDF 형식다운로드, PDF 형식 (45kB)
 AN3477, AN 3477, APP3477, Appnote3477, Appnote 3477



         


      개인정보보호 정책    법적 고지

      Copyright © 2008 by Maxim Integrated Products, Dallas Semiconductor