임베디드 레시피

Egloos | Log-in





Register를 Setting 한다는 것과 Memory Mapped IO

우리 흔히들 Register를 Setting한다는 둥, 그런 동작을 하는 Register가 있냐는 둥의 대화를 들을 수 있어요. 도대체 Register를 Setting한다는 건 무얼 의미 하는 건가요? 보통 MCU User Manual이나, Device들의 Data sheet를 보면, Software interface로 Register book이라는 걸 제공하는데요. 이런 Data sheet를 보면 엄청나게 많은 Register들과 그것들의 주소, 그리고 각 bit들에 대한 의미들을 나열해 놓았는데요. 도대체 이 Register들을 setting한다는 건 무슨 의미인지 당췌 알 수 없죠. 예를 들어, 어떤 MCU의 Register에 관련된 내용 하나만 볼까요?
- 실은 삼성 S3C6400 ARM core base의 MCU에요 푸훗 -


PWR_CFG라는 Register가 있고요, Address는 0x7E00F804이고요, Readable, Writable하고요, 처음 Reset 되었을 때, Default Value는 0x00000001 이네요. 32bit 짜리고요. 도대체, 이 Register는 무얼 하는 Register일까요.


꺄옷~ 예제로 잡기에는 너무 많은 양이네요! 하지만, 32bit Register인데, 17~31 까지의 bit는 쓰는 데가 없네요. 여하간 각 bit들은 각각의 쓰임새가 있는 Register들이네요. 자자, 예를 들어 11번 Register를 1로 설정하면, RTC TICK을 wakeup할 수 있고, 0으로 설정하면 Wake할 수가 없네요? 뭐, 내용이야 어쨌던 간에, 이런 식의 Register가 수 없이 많답니다.


Register를 설정한다는 건,
1) 설정하고자 하는 Register의 주소에,
2) 설정하고자 하는 값을 쓴다!
이게 다거든요? 너무 간단한데?

예를 들면,
typedef long unsigned int dword
volatile dword *pwr_cfg;
pwr_cfg = (volatile dword *)0x7E00F804

void set_pwr_cfg (dword value)
{
*pwr_cfg = value
}

이렇게 해 놓고, 11번만 1로 쓰고 싶다면 binary 00000000000000000000100000000000을 써야겠죠. Hex로는 0x00000080이니까,

set_pwr_cfg (0x800); 으로 쓰면 Register에 원하는 bit를 원하는 값을 쓰겠네요.

Register를 설정하면 이런 동작을 한다는 건 알겠는데, 어떻게 이렇게 값을 쓰는 것 만으로 원하는 일이 이루어 진다는 건지요. 차암~ 이상하죠. 안 궁금 해 할지 모르겠지만, 짚고 넘어가야겠어요.

1) 설정하고자 하는 Register의 주소에 ? 라는 건
CPU가 Register 주소의 Address를 발생시켜서 내가 어떤 주소를 Access하려는데 어떻게 생각하느냐? 그 주소에 내가 지금부터 쓰는 Data를 저장하려고 하니, Data Bus좀 연결시켜 주고, 그 주소의 Latch에 Write Enable 신호도 좀 주렴. 이라는 복잡한 Sequence가 발생하지요.
2) 설정하고자 하는 값을 쓴다! ? 라는 건
얘들아, 내가 쓰고자 하는 값은 이 값이니, Latch에 저장 좀 해줘. 그리고, Latch야. 이 값을 계속 유지해야 돼.

라는 스토리 에요.


뭐, 이런 셈이죠.

여기서 주의할 것은 Register 크기 만큼씩 Access 가능하다는 거에요. 위의 PWR_CFG는 32bit Register이고, PWR_CFG[7:0]이 0x7E00F804번지니까 PWR_CFG[11]은 0x7E00F805번지겠네? 그럼 0x7E00F805 요기를 Access하면 되겠다고 하면 곤란합니다.

약간 신기하지 않아요? 지금 32bit Latch가 주소를 갖고 있어요. 주소를 가지고 있다는 건 Memory와 똑같이 취급이 가능하다는 거죠? 그렇습니다. Register는 Memory와 똑같이 취급이 되면서 값을 유지하면서, 그 값을 다른 Hardware Block의 input으로 계속 유지 가능하다는 거죠.

이렇듯 Latch라는 건, Memory 역할을 하면서, Memory된 값을 Latch의 Output에 유지 시켜줄 수 있다는 특성이 있어욧! 이걸 이용해서 MCU내부의 Hardware block들의 설정들을 해줄 수 있지요. 당연히 이런 Latch를 이용해서 MCU외부로의 I/O도 control할 수 있겠죠?

게다가 Latch를 모아 놓으면 Byte 배수 단위의 주소를 가질 수 있는 장점이 있죠. 이렇게 Memory 주소를 갖는 Latch를 이용한 I/O를 구현한 것을 memory mapped I/O라 불러요. 그러니까, Memory나 I/O나 모두 Address가지고 Access 가능하고 Read Write 가능하다니깐요.

잠깐. 한가지 더 주의 할 것이 있는데, Register중에는 Read/ Write가 모두 가능한 Register, Read만 가능한 Register, Write만 가능한 Register 이렇게 있는데, Write만 가능한 Register를 읽거나 하면 쓰레기 값이 읽히니까 주의하세요. 내가 쓴 값이 잘 써졌나 확인하려고 Write한 곳을 읽었는데 어라? 값이 틀리네 하고 한참 고민 마시고, Readable한 Register인지 확인해 주시는 센스! 부탁해요.

by 히언 | 2009/09/07 22:18 | Device컨트롤 | 트랙백 | 핑백(1) | 덧글(5)

Linked at 친절한 임베디드 시스템 개발자.. at 2009/10/01 12:45

... ⓑ Register를 Setting한다는 것과 Memory Mapped I/O</a><a href="http://recipes.egloos.com/5106029"> ... more

Commented by 우정 at 2009/09/08 22:58
좋은강좌 잘봤습니다.

저 같이 몰래와서 슬쩍 보고만 가는 분들이 많은 것 같아 응원의 메세지라도 남기고 갑니다.
정말 감사합니다^^
Commented by 히언 at 2009/09/08 23:11
와우~ 이런 배려깊은 말씀은, 저에게 이만볼트 힘을 준다니깐요!
우정님 감사!
Commented by 고스 at 2009/09/09 17:21
Latch라는 용어의 뜻을 잘 모르겠어요.
Commented by 히언 at 2009/09/09 22:31
아하하~ Register 넌 누구냐 편을 읽어주세요.
Commented by 고스 at 2009/09/11 12:50
넵!! 감사합니다
※ 이 포스트는 더 이상 덧글을 남길 수 없습니다.

◀ 이전 페이지          다음 페이지 ▶