MCU - I/O 레지스터
I/O 레지스터
I/O(Input/Output) register는 입출력 레지스터로 주변 소자의 기능을 제어하기 위해 사용된다.
이 레지스터는 SRAM 영역에 주소가 할당되어있다.
I/O 레지스터의 일반적인 제어 방법
- I/O 포트를 제어하기 위해 sfrb, sfrw 키워드가 제공된다.
- I/O 레지스터의 주소는 헤더 파일에 정의되어 있다.
sfrb : byte 단위 특수 기능 레지스터를 지정하는 지시어다.
sfrw : word 단위 특수 기능 레지스터를 지정하는 지시어다.
C8051 I/O Register
User's Guides for Keil C51 Development Tools 내용을 참조하자면
Documentation – Arm Developer
developer.arm.com
Special-Function-Registers(SFR)에 접근하기 위한 별도의 메모리 영역을 제공한다.
SFR은 프로그램에서 타이머, 카운터, 직렬 I/O, 포트 I/O 및 주변 장치를 제어하는 데 사용된다.
SFR은 주소 0x80~0xFF에 있으며 비트, 바이트 및 단어로 액세스할 수 있다.
Cx51 컴파일러는 sfr , sfr16 및 sbit 데이터 유형을 사용하여 SFR에 대한 액세스를 제공합니다.
- 8bit 특수 기능 레지스터
'sfr 변수이름 = sfr의 주소(상수)'의 형태로 나타낸다.
sfr P0 = 0x80; /* Port-0, address 80h */
sfr P1 = 0x90; /* Port-1, address 90h */
sfr P2 = 0xA0; /* Port-2, address 0A0h */
sfr P3 = 0xB0; /* Port-3, address 0B0h */
- 16bit 특수 기능 레지스터
'sfr16 변수이름 = 16bit sfr의 주소(상수)'의 형태로 나타낸다.
sfr16 T2 = 0xCC; /* Timer 2: T2L 0CCh, T2H 0CDh */
sfr16 RCAP2 = 0xCA; /* RCAP2L 0CAh, RCAP2H 0CBh */
주의
sfr 변수는 함수 내부에서 선언할 수 없습니다. 함수 본문 외부에서 선언해야 된다.
sfr 변수는 항상 휘발성입니다. 컴파일러는 이 유형의 변수에 대한 액세스를 최적화하지 않는다.
- sfr 내의 비트
sbit name = sfr-name ^ bit-position;
sfr PSW = 0xD0;
sbit OV = PSW^2;
sfr IE = 0xA8;
sbit EA = IE^7;
자세한 내용은 위 링크 참조
Example
C8051F38x datasheet
Code
I/O 레지스터의 비트단위 제어 방법
- I/O 레지스터 영역 중 비트 단위의 제어가 가능한 영역에서 사용할 수 있는 방법이다.
- '레지스터.비트번호'와 같은 형태로 접근할 수 있다.
- 비트 단위 접근은 실제 어셈블리 명령어 CBI, SBI, SBIC, SBIS에 의해 처리된다.