LCD Memory Map
Address Target Size
0x00000000 SDRAM_CS0_N 32MB
0x08000000 SDRAM_CS1_N 32MB
//0x0~80000000 SDRAM1 > LOW active
//0x80000 ~~ SDRAM2 > "
.....................중략......................
0x20000000 LCD_CS_N 3MB
// Chip Select : LOW active
// 3MB 사이의 주소를 Access
.....................생략......................
LCD controller : 3 Input
( CS/, ADS, DATA )
ADS : Command or Data 구분
DATA : command or Data
MCU 입장)
0x20000000~ 0x 202FFFFF : Access
> LCD_CS_N : LOW
> Command : ADS > HIGH
or DATA : ADS > LOW
ex) Assembly
; Command Issue
LDR R0, #0x20000080 // A[7] : HIGH
LDR R1, #0xABCD
STR R1, [R0]
; Data Issue
LDR R0, #0x20000000 // A[7] : LOW
LDR R1, #0x1234
STR R1, [R0]
>>
STR R1, [R0, #OFFSET_LOW] ; LCD_CS_N 신호를 Low로 설정 // LCD_CS_N가 Low로 떨어지도록..
STR R2, [R0, #OFFSET_HIGH] ; ADS 신호를 High로 설정 // ADS에 High 넣어서 Command가 날아갈 걸 알려줌
or
STR R1, [R0, #OFFSET_LOW]
STR R2, [R0, #OFFSET_HIGH] ; ADS에 Low를 넣어서 Data가 날아갈 걸 알려줌
>> 이게 없는 이유
A[7] > ADS 에 연결되어있음
: A[7] High > ADS High <> LOW >LOW
= 2^7 자리 1 <> 0
> 2^7 = 128 = 0x80
// 1000 0000
>> 0x20000080 에 DATA 작성
> LCD_CS_N 도 LOW Active
+ A[7] HIGH
ex) ADS가 A[0] 이라면?
command > LDR R0, #0x20000001
Data Issue >LDR R0, #0x20000000
>> C language
#define Main_LCD_Write_cmd (cmd) (*(volatile word *)(0x200000080) = cmd
#define Main_LCD_Write_data (data) (*(volatile word *)(0x200000000) = data
Main_LCD_Write_cmd (0xABCD);
Main_LCD_Write_data (0x1234);
volatile:
- 컴파일러 최적화 방지 키워드
- 메모리 맵 I/O : 외부 하드웨어가 값을 변경 가능, 컴파일러가 이를 최적화하지 못하도록 보장
word:
- 데이터 타입, 32비트를 나타냄
- ARM 코어) word: 4바이트 크기의 정수형 타입
>>
(*(volatile word *)(0x200000080) = 0xABCD);
(*(volatile word *)(0x200000000) = 0x1234);
GRAM - Graphic Data를 넣어두는 LCD Controller 내부의 RAM
'임베디드 > 임베디드 레시피' 카테고리의 다른 글
MACRO Technics (0) | 2025.01.14 |
---|---|
shadow, Bit operation (0) | 2025.01.14 |
MCU의 외부통신, 컨트롤 (0) | 2025.01.14 |
Memory Device Control (0) | 2025.01.13 |
Register Setting (0) | 2025.01.13 |