Embedded SW 기초

MCU - I/O 레지스터

sg.kim 2024. 7. 1. 00:19

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 내용을 참조하자면

https://developer.arm.com/documentation/101655/0961/Cx51-User-s-Guide/Language-Extensions/Data-Types/Special-Function-Registers

 

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에 의해 처리된다.