Arm 강좌

3,369 views
3,174 views

Published on

Published in: Technology, Business
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,369
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
0
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide
  • Stored program 명령어와 데이터를 같은 메모리 시스템에 저장한다 . 필요할 경우 명령어를 데이터로 취급할 수 있도록 한다 . ( 프로그램이 로딩될 경우에는 데이터처럼 취급하고 실행될 때는 명령어를 실행하게 할 수 있다.)
  • Single-bit adders Multiplexers Decoder Flip-flops
  • 모든 명령어는 메모리에서 레지스터로 옮겨져 처리되고 처리한 데이터는 다시 메모리로 이동 memory indirect 모드는 없다 . mov ax, 0x100, load/store 명령만으로 데이터 이동 모든 inst. 는 32 비트 워드로 구성 , (x86 의 경우 1 바이트 부터 여러 워드까지 다양 ), inst. 개수가 적으며 주소는 상대주소방식 (26 비트 ), 상수값은 32 비트 그대로 넣을수 없다 . 빅 / 리틀 간단히 설명 fiq 는 뒤에서 설명 load/store 에서 자세히 설명 , c 에서의 a++, --a; ldm/stm 지원 x86 에서 jz, jc 등의 명령처럼 arm 에서는 모든 인스트 .. 이 조건부로 실행
  • general purpose 란 특정한 제한 없이 일반 inst. 의 operand 로서 쓸수 있다는 의미 ( 상태레지스터는 오직 msr,mrs 명령만으로 접근 ) ARM core 는 7 개의 mode 지원 , 모드별로 visible 한 별도의 레지스터가 있음 -> 예외 부분에서 설명 실제적으로 pc 만 special purpose, lr, sp 는 범용 레지스터이나 모드별로 별로의 lr, sp 가 있고 , lr 은 branch 명령시만 특별 , sp 는 편이를 위해 stack pointer 로 사용 ( 커널 모드 / 사용자모드에서 별개의 sp 사용 )
  • x86 의 EFLAGs 와 비슷한 역할 spsr 은 이전 모드의 cpsr 저장
  • 뱅크드 레지스터는 각 모드에서만 보이는 레지스터 add r0, r1, sp 의 경우 사용자 모드에서는 add r0, r1, r13_usr 의 뜻 irq 모드에서는 add r0, r1, r13_irq 의 뜻 fiq 는 뱅크드 레지스터가 많아 모드 전환시 레지스터 저장 명령을 줄일수 있다 .
  • 뱅크드 레지스터는 각 모드에서만 보이는 레지스터 add r0, r1, sp 의 경우 사용자 모드에서는 add r0, r1, r13_usr 의 뜻 irq 모드에서는 add r0, r1, r13_irq 의 뜻 fiq 는 뱅크드 레지스터가 많아 모드 전환시 레지스터 저장 명령을 줄일수 있다 .
  • 리눅스 커널에서는 user/supervisor 모드만 쓴다 . 인터럽트 / 예외 발생시 해당 모드로 전환되나 강제적으로 수퍼바이저 모드로 바꾼다 .
  • 각 address 는 해당 예외가 발생 했을 경우 pc 의 내용을 대체할 값들이다 . x86 과 비교하는 그림 그린다 . x86 은 해당벡터에 핸들러 주소가 있고 , arm 은 핸들러 주소로 분기할 명령이 있다 .
  • 예외발생시 cpu 하는일 1. lr 에 해당 예외와 관련한 복귀 번지를 저장한다 . ( 자세한 내용은 50100 User manual 2-10 을 보라 ) 2. 해당 예외의 spsr 에 cpsr 을 저장한다 . 3. cpsr 의 mode 부분을 강제로 해당 예외의 모드로 전환한다 . 4. pc 를 강제로 해당 예외의 Vector Address 로 바꾼다 . 그리고 예외 핸들러에서 복귀할 경우 다음을 수행한다 . 1 lr 에 저장되어 있는 ( 해당 예외와 관련한 ) 복귀번지를 pc 로 옮긴다 . ( 이 코드는 사용자의 코드이다 .) 2 spsr 을 다시 cpsr 로 옮긴다 . 3 핸들러에서 인터럽트 금지 플래그가 설정되었으면 해제한다 .
  • movs pc, r14 쓰는 이유 – swi 명령은 다시 실행안해도 됨
  • 리눅스 코드에서 abort 관련 코드 본다 . (arch/arm/kernel/entry-armv.S)
  • 복귀 명령에서 4, 8 을 빼주는 이유는 예외 발생시킨 명령이 재시작 되어야 하기 때문
  • 리눅스에서는 이 모드를 통해 인터럽트 핸들러 구현 fiq 안씀 => 수퍼바이저모드로 바꿈 ..
  • arch/arm/kernel/entry-armv.S 667 __irq_svc: sub sp, sp, #S_FRAME_SIZE 668 stmia sp, {r0 - r12} @ save r0 - r12 669 ldr r7, .LCirq 670 add r5, sp, #S_FRAME_SIZE 671 ldmia r7, {r7 - r9} 672 add r4, sp, #S_SP 673 mov r6, lr 674 stmia r4, {r5, r6, r7, r8, r9} @ save sp_SVC, lr_SVC, pc, cpsr, old_ro 675 1: get_irqnr_and_base r0, r6, r5, lr 676 movne r1, sp 677 @ 678 @ routine called with r0 = irq number, r1 = struct pt_regs * 679 @ 680 adrsvc ne, lr, 1b 681 bne do_IRQ 682 ldr r0, [sp, #S_PSR] @ irqs are already disabled 683 msr spsr, r0 ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr arch/arm/kernel/entry-armv.S 769 __irq_usr: sub sp, sp, #S_FRAME_SIZE 770 stmia sp, {r0 - r12} @ save r0 - r12 771 ldr r4, .LCirq 772 add r8, sp, #S_PC 773 ldmia r4, {r5 - r7} @ get saved PC, SPSR 774 stmia r8, {r5 - r7} @ save pc, psr, old_r0 775 stmdb r8, {sp, lr}^ 776 alignment_trap r4, r7, __temp_irq 777 zero_fp 778 1: get_irqnr_and_base r0, r6, r5, lr 779 movne r1, sp 780 adrsvc ne, lr, 1b 781 @ 782 @ routine called with r0 = irq number, r1 = struct pt_regs * 783 @ 784 bne do_IRQ 785 mov why, #0 786 get_current_task tsk 787 b ret_to_user arch/arm/kernel/entry-common.S 50 /* 51 * "slow" syscall return path. "why" tells us if this was a real syscall. 52 */ 53 reschedule: 54 bl SYMBOL_NAME(schedule) 55 ENTRY(ret_to_user) 56 ret_slow_syscall: 57 ldr r1, [tsk, #TSK_NEED_RESCHED] 58 ldr r2, [tsk, #TSK_SIGPENDING] 59 1: teq r1, #0 @ need_resched => schedule() 60 bne reschedule 61 teq r2, #0 @ sigpending => do_signal() 62 blne __do_signal 63 restore_user_regs 64 65 __do_signal: 66 mov r0, #0 @ NULL 'oldset' 67 mov r1, sp @ 'regs' 68 mov r2, why @ 'syscall' 69 b SYMBOL_NAME(do_signal) @ note the bl above sets lr arch/arm/kernel/entry-header.S 84 .macro restore_user_regs 85 ldr r0, [sp, #S_PSR] @ Get calling cpsr 86 mov ip, #I_BIT | MODE_SVC 87 msr cpsr_c, ip @ disable IRQs 88 msr spsr, r0 @ save in spsr_svc 89 ldr lr, [sp, #S_PC] @ Get PC 90 ldmia sp, {r0 - lr}^ @ Get calling r0 - lr 91 mov r0, r0 92 add sp, sp, #S_FRAME_SIZE 93 movs pc, lr @ return & move spsr_svc into cpsr 94 .endm 146 .macro restore_user_regs 147 ldmia sp, {r0 - lr}^ 148 mov r0, r0 149 ldr lr, [sp, #15*4] 150 add sp, sp, #15*4+8 151 movs pc, lr 152 .endm arch/arm/kernel/irq.c 150 /* 151 * do_IRQ handles all normal device IRQ's 152 */ 153 asmlinkage void do_IRQ(int irq, struct pt_regs * regs) 154 { 155 struct irqdesc * desc; 156 struct irqaction * action; 157 int cpu; 158 159 irq = fixup_irq(irq); 160 161 /* 162 * Some hardware gives randomly wrong interrupts. Rather 163 * than crashing, do something sensible. 164 */ 165 if (irq >= NR_IRQS) 166 goto bad_irq; 167 168 desc = irq_desc + irq; 169 170 spin_lock(&irq_controller_lock); 171 desc->mask_ack(irq); 172 spin_unlock(&irq_controller_lock); 173 174 cpu = smp_processor_id(); 175 irq_enter(cpu, irq); 176 kstat.irqs[cpu][irq]++; 177 desc->triggered = 1; 178 179 /* Return with this interrupt masked if no action */ 180 action = desc->action; 181 182 if (action) { 183 int status = 0; 184 185 if (desc->nomask) { 186 spin_lock(&irq_controller_lock); 187 desc->unmask(irq); 188 spin_unlock(&irq_controller_lock); 189 } 190 191 if (!(action->flags & SA_INTERRUPT)) 192 __sti(); 193 194 do { 195 status |= action->flags; 196 action->handler(irq, action->dev_id, regs); 197 action = action->next; 198 } while (action); 199 200 if (status & SA_SAMPLE_RANDOM) 201 add_interrupt_randomness(irq); 202 __cli(); 203 204 if (!desc->nomask && desc->enabled) { 205 spin_lock(&irq_controller_lock); 206 desc->unmask(irq); 207 spin_unlock(&irq_controller_lock); 208 } 209 } 210 211 /* 212 * Debug measure - hopefully we can continue if an 213 * IRQ lockup problem occurs... 214 */ 215 check_irq_lock(desc, irq, regs); 216 217 irq_exit(cpu, irq); 218 219 if (softirq_pending(cpu)) 220 do_softirq(); 221 return; 222 223 bad_irq: 224 irq_err_count += 1; 225 printk(KERN_ERR "IRQ: spurious interrupt %d
    ", irq); 226 return; 227 }
  • 리눅스에서는 안쓴다 .
  • 프로그램이 하드디스크로 부터 메모리에 로딩되어 cpu 까지 가는 그림 그린다 . 각 필드가 어떤 의미를 갖는지 간략한 cpu 다이어 그램 그린다 .
  • cmp r1, r2 moveq r3, r4
  • 주소지정에는 수치주소지정, 레지스터 주소지정, 베이스 주소지정, pc-상대주소지정 등이 있음.
  • rn 이 오퍼랜드 1, rd 는 데스티네이션 , rs 가 오퍼랜드 2
  • shifts 간단히 그림 그려 설명 rrx : 1bit right rotate cpsr 의 c 를 31 비트에 입력 1 비트는 cpsr 의 c 에… immediate..: 0xff, 0x3fc0, 0xff0, 0xff00 등의 값 가능 .
  • =expression => 어셈블러가 해당 상수값을 특정공간에 모아서 삽입해주고 (Literal Pool) pc 를 베이스로 해서 명령 코드를 만든다 . r15 : write back 을 쓸때는 베이스 레지스터로 쓸수 없다 , 베이스 레지스터로 쓸때에는 pc 는 다다음 명령어를 가리키고 있다 .(+8) r15 는 레지스터 옵셋으로 쓸수 없다 . r15 가 str 의 rd 로 지정된 경우는 +12 값을 가진다 .
  • push ax push bx push cx push dx ---------------------------------------- STR r0,[sp],#4 STR r1,[sp],#4 STR r3,[sp],#4 STR r4,[sp],#4 ---------------------------------------- STMEA sp!,{r0,r1,r2,r4} ------------------------------------------- {r0, r2} , {r0-r5}, {r0-r4, r6-r9}
  • push ax push bx push cx push dx ---------------------------------------- STR r0,[sp],#4 STR r1,[sp],#4 STR r3,[sp],#4 STR r4,[sp],#4 ---------------------------------------- STMEA sp!,{r0,r1,r2,r4} ------------------------------------------- {r0, r2} , {r0-r5}, {r0-r4, r6-r9}
  • push ax push bx push cx push dx ---------------------------------------- STR r0,[sp],#4 STR r1,[sp],#4 STR r3,[sp],#4 STR r4,[sp],#4 ---------------------------------------- STMEA sp!,{r0,r1,r2,r4} ------------------------------------------- {r0, r2} , {r0-r5}, {r0-r4, r6-r9}
  • E : stm 에서 레지스터를 입력하고 나중에 주소를 증가 시키면 레지스터를 입력하기 전에 스택은 비어있다 . 그러므로 post 의 경우 Empty ldm 의 경우 위에서 입력한 것을 읽으려면 주소를 먼저 감소시키고 읽어야 한다 . 레지스터를 읽기전에 스택은 비어 있다 . 그러므로 post 로 저장한 것은 pre 로 읽어야 한다 .  ( 그림 하나 그려 놓자… ) Decending / Ascending 은 스택이 Decending 이냐 Ascending 이냐를 뜻함
  • ARM system onchip architecture 110p
  • Arm 강좌

    1. 1. The ARM Architecture
    2. 2. 목 차 <ul><li>Introduction </li></ul><ul><li>Register </li></ul><ul><li>Processor Modes </li></ul><ul><li>Exception </li></ul><ul><li>Instruction Set </li></ul><ul><li>Sample Code </li></ul>
    3. 3. <ul><li>Founded in November 1990 </li></ul><ul><ul><li>Spun out of Acorn Computers </li></ul></ul><ul><li>Designs the ARM range of RISC processor cores </li></ul><ul><li>Licenses ARM core designs to semiconductor partners who fabricate and sell to their customers. </li></ul><ul><ul><li>ARM does not fabricate silicon itself </li></ul></ul><ul><li>Also develop technologies to assist with the design-in of the ARM architecture </li></ul><ul><ul><li>Software tools, boards, debug hardware, application software, bus architectures, peripherals etc </li></ul></ul>
    4. 4. ARM Partnership Model
    5. 5. ARM Powered Products
    6. 6. Processor란? <ul><li>메모리에 저장된 명령어 를 실행하는 finit-state automation </li></ul>The state of system 메모리 상에 있는 명령어의 값과 Processor 내부의 임의의 register 에 있는 값 에 의해 정의됨 메모리 체계 : SDRAM - cache(SRAM) - register Stored program 명령어와 데이터를 같은 메모리 시스템에 저장한다 . 필요할 경우 명령어를 데이터로 취급할 수 있도록 한다 . Instruction Set (RISC & CISC) 각각의 명령어는 전체상태가 변화하는 특정방법을 정의하고 , 어떤 명령어가 다음에 실행되어져야 할지를 정의한다 . Instruction set – register transfer level description – logic gate – TR – CMOS or bipolar logic gate : IC – LSI - VLSI CMOS tech : 소형화 / 저가 / 고속화 / 소전력화
    7. 7. Absraction in H/W design The transistor circuit of a static 2-input CMOS NAND gate The logic symbol and truth table for a NAND gate Logic Gate Processor system ALU Register memory …… XScale core I, D-cache MMU Buffer …… PXA320 SDRAM Flash CS8900 truth table A B O u t p u t 0 0 1 0 1 1 1 0 1 1 1 0 A B output Logic symbol
    8. 8. PXA320 Block Diagram
    9. 9. Hybus 320 TKU SYSTEM
    10. 10. Introduction <ul><li>32bit RISC Processor </li></ul><ul><ul><li>load-store Architecture </li></ul></ul><ul><ul><li>Uniform & fixed length instruction fields </li></ul></ul><ul><li>Big / Little endian Mode (Little Default) </li></ul><ul><li>Fast Interrupt Response </li></ul><ul><li>Excellent high level language support </li></ul><ul><ul><li>Auto-increment/decrement addressing mode </li></ul></ul><ul><li>Simple & Powerful Instruction Set </li></ul><ul><ul><li>Load / Store mutiple instructions </li></ul></ul><ul><ul><li>Conditional excution of all instructions </li></ul></ul>12 34 56 78 78 56 34 12 Low High Big 통신 Motoralla Little Intel CP15 의 bit.. 을 바꾸면 Little/Big endian change Linux 에서는 IRQ 만 사용한다 . (FIQ 사용안함 )
    11. 11. Register (1) <ul><li>ARM has a total of 37(32bit) registers. </li></ul><ul><ul><li>30 general purpose / 6 status / pc </li></ul></ul><ul><ul><li>At any one time, sixteen are visible, the other registers used to speed up exception. </li></ul></ul><ul><li>Special Purpose General Register </li></ul><ul><ul><li>Program counter (r15=pc) </li></ul></ul><ul><ul><ul><li>A pointer to the instruction </li></ul></ul></ul><ul><ul><li>Link register (r14=lr) </li></ul></ul><ul><ul><ul><li>To hold the address of the next instruction after a Branch with Link </li></ul></ul></ul><ul><ul><ul><li>At all other times, r14 can be used as a general-purpose register </li></ul></ul></ul><ul><ul><li>Stack Pointer (r13=sp) </li></ul></ul><ul><ul><ul><li>Software will normally use r13 as a stack pointer </li></ul></ul></ul>BL branch_address Mov pc, lr
    12. 12. Program Status Registers(1) <ul><li>Condition code flags </li></ul><ul><ul><li>N = N egative result from ALU </li></ul></ul><ul><ul><li>Z = Z ero result from ALU </li></ul></ul><ul><ul><li>C = ALU operation C arried out </li></ul></ul><ul><ul><li>V = ALU operation o V erflowed </li></ul></ul><ul><li>Sticky Overflow flag - Q flag </li></ul><ul><ul><li>Architecture 5TE/J only </li></ul></ul><ul><ul><li>Indicates if saturation has occurred </li></ul></ul><ul><li>J bit </li></ul><ul><ul><li>Architecture 5TEJ only </li></ul></ul><ul><ul><li>J = 1: Processor in Jazelle state </li></ul></ul><ul><li>Interrupt Disable bits. </li></ul><ul><ul><li>I = 1: Disables the IRQ. </li></ul></ul><ul><ul><li>F = 1: Disables the FIQ. </li></ul></ul><ul><li>T Bit </li></ul><ul><ul><li>Architecture xT only </li></ul></ul><ul><ul><li>T = 0: Processor in ARM state </li></ul></ul><ul><ul><li>T = 1: Processor in Thumb state </li></ul></ul><ul><li>Mode bits </li></ul><ul><ul><li>Specify the processor mode </li></ul></ul>27 31 N Z C V Q 28 6 7 I F T mode 16 23 8 15 5 4 0 24 f s x c U n d e f i n e d J
    13. 13. Program Status Registers(2) <ul><li>Status Register </li></ul><ul><ul><li>CPSR (Currunt Program Status Register) : 현재 cpsr 상태 </li></ul></ul><ul><ul><li>SPSR (Saved Program Status Register) : 이전모드의 cpsr 상태 </li></ul></ul>31 30 29 28 8 7 6 5 4 3 2 1 0 M0 M1 M2 M3 M4 T F I V C Z N Undefined Instruction 11011 Abort 10111 Supervisor 10011 IRQ 10010 FIQ 10001 User 10000 Mode M[4:0]
    14. 14. Processor Modes <ul><li>The ARM has seven basic operating modes: </li></ul><ul><ul><li>User : unprivileged mode under which most tasks run </li></ul></ul><ul><ul><li>FIQ : entered when a high priority (fast) interrupt is raised </li></ul></ul><ul><ul><li>IRQ : entered when a low priority (normal) interrupt is raised </li></ul></ul><ul><ul><li>Supervisor : entered on reset and when a Software Interrupt </li></ul></ul><ul><ul><li> instruction is executed </li></ul></ul><ul><ul><li>Abort : used to handle memory access violations </li></ul></ul><ul><ul><li>Undef : used to handle undefined instructions </li></ul></ul><ul><ul><li>System : privileged mode using the same registers as user mode </li></ul></ul>
    15. 15. Mode-Dependent “Shadow” Registers
    16. 16. Abort Mode Abort Mode r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r15 (pc) cpsr r13 (sp) r14 (lr) spsr r13 (sp) r14 (lr) spsr r13 (sp) r14 (lr) spsr r13 (sp) r14 (lr) spsr r8 r9 r10 r11 r12 r13 (sp) r14 (lr) spsr Current Visible Registers Banked out Registers User FIQ IRQ SVC Undef r13 (sp) r14 (lr)
    17. 17. Register Organization Summary User mode r0-r7, r15, and cpsr r8 r9 r10 r11 r12 r13 (sp) r14 (lr) spsr FIQ User r13 (sp) r14 (lr) spsr IRQ User mode r0-r12, r15, and cpsr r13 (sp) r14 (lr) spsr Undef User mode r0-r12, r15, and cpsr r13 (sp) r14 (lr) spsr SVC User mode r0-r12, r15, and cpsr r13 (sp) r14 (lr) spsr Abort User mode r0-r12, r15, and cpsr Thumb state Low registers Thumb state High registers Note: System mode uses the User mode register set r8 r9 r10 r11 r12 r13 (sp) r14 (lr) r15 (pc) cpsr r0 r1 r2 r3 r4 r5 r6 r7
    18. 18. Mode-Dependent “Shadow” Registers Mode change : CPSR 의 0~4bit 가 변경됨 . Exception Program CP Reg. Bank Memory Status Reg. str ldr msr mrs mrc mcr
    19. 19. Processor mode Runs privileged operating system tasks (sys) System 7 Supports software emulation of hardware coprocessors (und) Undefined 6 Implements virtual memory and/or memory protection (abt) Abort 5 A protected mode for the operating system (svc) Supervisor 4 Used for general purpose interrupt handling (irq) IRQ 3 Supports a high-speed data transfer or channel process (fiq) FIQ 2 Normal program execution mode (usr) User 1 Description Processor mode
    20. 20. Processor mode – CPSR mode bits
    21. 21. Exceptions 3 4 Reserved 2 5 6 6 1 Priorities FIQ FIQ 0x0000001C IRQ IRQ 0x00000018 Reserved Reserved 0x00000014 Abort Abort (data) 0x00000010 Abort Abort (prefetch) 0x0000000C Supervisor Software interrupt 0x00000008 Undefined Undefined instruction 0x00000004 Supervisor Reset 0x00000000 Mode on Entry Exception Address
    22. 22. Reset <ul><li>When the processor’s Reset input asserted, this exception occur </li></ul><ul><li>Performed Actions </li></ul><ul><ul><li>r14_svc = unpredictable value </li></ul></ul><ul><ul><li>SPSR_svc = CPSR </li></ul></ul><ul><ul><li>CPSR[5:0] = 0b010011 (SuperVisor mode) </li></ul></ul><ul><ul><li>CPSR[6] = 1 (FIQ Disable) </li></ul></ul><ul><ul><li>CPSR[7] = 1 (IRQ Disable) </li></ul></ul><ul><ul><li>PC = 0x0 </li></ul></ul>
    23. 23. Undefined instruction exception <ul><li>If no coprocessor responds, or an attempt is made to execute an instruction that is undefined, This exception occurs </li></ul><ul><li>Performed Action </li></ul><ul><ul><li>r14_und = address of undefined inst. + 4 </li></ul></ul><ul><ul><li>SPSR_und = CPSR </li></ul></ul><ul><ul><li>CPSR[5:0] = 0b011011 </li></ul></ul><ul><ul><li>CPSR[6] = unchanged </li></ul></ul><ul><ul><li>CPSR[7] = 1 </li></ul></ul><ul><ul><li>PC = 0x4 </li></ul></ul><ul><li>Return instruction </li></ul><ul><ul><li>movs pc, r14 </li></ul></ul><ul><ul><ul><li>S 의 의미는 SPSR_und 의 값을 CPSR 로 옮기라는 의미이다 . </li></ul></ul></ul><ul><ul><ul><li>이를 통해서 동작모드가 이전 상태의 모드로 변한다 . </li></ul></ul></ul>
    24. 24. Software Interrupt (swi) <ul><li>When “swi” instruction executed, This exception occurs </li></ul><ul><li>Performed Action </li></ul><ul><ul><li>r14_svc = address of swi inst. +4 </li></ul></ul><ul><ul><li>SPSR_svc = CPSR </li></ul></ul><ul><ul><li>CPSR[5:0] = 0b010011 </li></ul></ul><ul><ul><li>CPSR[6] = unchanged </li></ul></ul><ul><ul><li>CPSR[7] = 1 </li></ul></ul><ul><ul><li>PC = 0x8 </li></ul></ul><ul><li>Return instruction </li></ul><ul><ul><li>movs pc, r14 </li></ul></ul><ul><ul><ul><li>S 의 의미는 SPSR_svc 의 값을 CPSR 로 옮기라는 의미이다 . </li></ul></ul></ul><ul><ul><ul><li>이를 통해서 동작모드가 이전 상태의 모드로 변한다 . </li></ul></ul></ul>
    25. 25. Prefetch / Data Abort (1) <ul><li>Prefetch aborts occur when the CPU attempts to execute an instruction which has been prefetched from an ‘illegal address </li></ul><ul><li>Data aborts occurs when a data transfer instruction attempts to load or store data at an ‘illegal address </li></ul><ul><li>Both data and prefetch aborts may be caused either by an on-chip MMU or by assertion of the processor’s ‘abort’ input </li></ul><ul><li>In linux system, This exceptions used for “Vitual memory” </li></ul>
    26. 26. Prefetch / Data Abort (2) <ul><li>Performed Action </li></ul><ul><ul><li>Prefetch : r14_abt = address of aborted inst. + 4 </li></ul></ul><ul><ul><li>Data : r14_abt = address of aborted inst. + 8 </li></ul></ul><ul><ul><li>SPSR_abt = CPSR </li></ul></ul><ul><ul><li>CPSR[5:0] = 0b010111 </li></ul></ul><ul><ul><li>CPSR[6] = unchanged </li></ul></ul><ul><ul><li>CPSR[7] = 1 </li></ul></ul><ul><ul><li>PC = 0xC(prefetch), 0x10(data) </li></ul></ul><ul><li>Return instruction </li></ul><ul><ul><li>Prefetch : subs pc, r14, #4 </li></ul></ul><ul><ul><li>Data : subs pc, r14, #8 </li></ul></ul><ul><ul><ul><li>S 의 의미는 SPSR_abt 의 값을 CPSR 로 옮기라는 의미이다 . </li></ul></ul></ul><ul><ul><ul><li>이를 통해서 동작모드가 이전 상태의 모드로 변한다 . </li></ul></ul></ul>
    27. 27. IRQ <ul><li>IRQ exception is externally generated by asserting the processor’s IRQ input. </li></ul><ul><li>Performed Action </li></ul><ul><ul><li>r14_irq = address of next inst. to be executed + 4 </li></ul></ul><ul><ul><li>SPSR_irq = CPSR </li></ul></ul><ul><ul><li>CPSR[5:0] = 0b010010 </li></ul></ul><ul><ul><li>CPSR[6] = unchanged </li></ul></ul><ul><ul><li>CPSR[7] = 1 </li></ul></ul><ul><ul><li>PC = 0x18 </li></ul></ul><ul><li>Return instruction </li></ul><ul><ul><li>subs pc, r14, #4 </li></ul></ul><ul><ul><ul><li>S 의 의미는 SPSR_irq 의 값을 CPSR 로 옮기라는 의미이다 . </li></ul></ul></ul><ul><ul><ul><li>이를 통해서 동작모드가 이전 상태의 모드로 변한다 . </li></ul></ul></ul>
    28. 28. 인터럽트의 흐름 인터럽트 발생 r14_irq = next address + 4 SPSR_irq = CPSR CPSR[5:0] = 0b010010 CPSR[6] = unchanged CPSR[7] = 1 PC = 0x18 SA-1 core Vector Table 0x18 vector_IRQ supervisor 모드로 전환 …… “ 번호” 추출 do_IRQ( 번호 , ……) …… ret_with_reschedule() 이전 모드로 전환 vector_IRQ()
    29. 29. FIQ <ul><li>FIQ exception is externally generated by asserting the processor’s FIQ input. </li></ul><ul><li>FIQ designed to support a data transfer or channel process and has sufficient private registers to remove the need for register saving in such applications. </li></ul><ul><li>Performed Action </li></ul><ul><ul><li>r14_fiq = address of next inst. to be executed + 4 </li></ul></ul><ul><ul><li>SPSR_fiq = CPSR </li></ul></ul><ul><ul><li>CPSR[5:0] = 0b010001 </li></ul></ul><ul><ul><li>CPSR[6] = 1 </li></ul></ul><ul><ul><li>CPSR[7] = 1 </li></ul></ul><ul><ul><li>PC = 0x1c </li></ul></ul><ul><li>Return instruction </li></ul><ul><ul><li>subs pc, r14, #4 </li></ul></ul><ul><ul><ul><li>S 의 의미는 SPSR_fiq 의 값을 CPSR 로 옮기라는 의미이다 . </li></ul></ul></ul><ul><ul><ul><li>이를 통해서 동작모드가 이전 상태의 모드로 변한다 . </li></ul></ul></ul>
    30. 30. Instruction Set overview
    31. 31. Data-processing instructions
    32. 32. Condition code Summary
    33. 33. ARM code Operation <ul><li>Standard operand and data flow format for ARM (Not Thumb) </li></ul><ul><li>data Flow </li></ul><ul><li>ADD r0, r1, r2 ; r0 = r1 + r2 </li></ul><ul><li>Destination Register (Rd) commnets (as use @) </li></ul><ul><li>Source Register (Rn) Operand 1 </li></ul><ul><li>Source Register (Rm) Operand 2 </li></ul><ul><li>* Operand 1 is always a register </li></ul><ul><li>* Operand 2 can be a register or an immediate vale </li></ul>
    34. 34. Instruction Set Summary (1) Rd: = (Rn AND NOT Op2) OR (op2 AND NOT Rn) Exclusive OR EOR CPSR flags: = Rn – Op2 Compare CMP CPSR flags: = Rn + Op2 Compare Negative CMN (Coprocessor-specific) Coprocesor Data Processing CDP R14: = R15, R15: = address Branch with Link BL Rd: = Rn AND NOT Op2 Bit Clear BIC R15: = address Branch B Rd: = Rn AND Op2 AND AND Rd: = Rn + Op2 Add ADD Rd: = Rn + Op2 + Carry Add with carry ADC Action Instruction Mnemonic
    35. 35. <ul><li>Instruction Set Summary (2) </li></ul>Coprocessor load Load coprocessor from memory LDC Rn: = PSR Move PSR status/flags to register MRS Rn: = cRn {<op>cRm} Move from coprocessor register to CPU register MRC Rd: = Op2 Move register or constant MOV Rd: = (Rm * Rs) + Rn Multiply Accumulate MLA cRn: = rRn {<op>cRm} Move CPU register to coprocessor register MCR Rd: = (address) Load register from memory LDR Stack manipulation (Pop) Load multiple registers LDM Action Instruction Mnemonic
    36. 36. Instruction Set Summary (3) PSR: = Rm Move register to PSR status/flags MSR Stack manipulation (Push) Store Multiple STM address: = CRn Store coprocessor register to memory STC Rd: = Rn – Op2 - 1 + Carry Subtract with Carry SBC Rd: = Op2 – Rn – 1 + Carry Reverse Subtract with Carry RSC Rd: = Op2 – Rn Reverse Subtract RSB Rd: = Rn OR Op2 OR ORR Rd: = 0xFFFFFFFF EOR Op2 Move negative register MVN Rd: = Rm * Rs Multiply MUL Action Instruction Mnemonic
    37. 37. Instruction Set Summary (4) CPSR flags: = Rn AND Op2 Test bits TST CPSR flags: = Rn EOR Op2 Test bitwise equality TEQ Rd: = [Rn], [Rn] := Rm Swap register with Memory SWP OS call Software Interrupt SWI Rd: = Rn – Op2 Subtract SUB <address>: = Rd Store register to memory STR Action Instruction Mnemonic
    38. 38. ADD operation 해석 MMU Cache Buffer PC VA PA Rd Rm Rn Rs Add r0, r1, r2, lsr r3 1. Fetch 2. Decode ALU Barrel Shift 3. Execulte 4. Memory Access 5. Write Back
    39. 39. ADD operation 해석
    40. 40. ADD operation 해석
    41. 41. ADD operation 해석
    42. 42. ADD operation 해석
    43. 43. ADD operation 해석
    44. 44. ADD operation 해석
    45. 45. ADD operation 해석
    46. 46. ADD operation 해석
    47. 47. Instruction Set – Branch instruction <ul><li>Branch Offset </li></ul><ul><ul><li>Branch instructions contain a signed 2's complement 24 bit offset. This is shifted left two bits, sign extended to 32bits, and added to the PC. The instruction can therefore specify a branch of +/- 32Mbytes. </li></ul></ul><ul><ul><li>Branches beyond +/- 32Mbytes must use an offset or absolute destination which has been previously loaded into a register. </li></ul></ul><ul><li>BL instruction </li></ul><ul><ul><li>Branch with Link (BL) writes the old PC into the link register (R14) of the current bank. </li></ul></ul><ul><ul><li>The PC value written into R14 is adjusted to allow for the prefetch, and contains the address of the instruction following the branch and link instruction. </li></ul></ul><ul><ul><li>Note that the CPSR is not saved with the PC and R14[1:0] are always cleared. </li></ul></ul>점프할 주소 : PC + (24bit 값 )*4 + 8
    48. 48. Instruction Set – Data Processing inst. (1) < I = 0 > < I = 1 > < bit4 = 1 > < bit4 = 0 >
    49. 49. Instruction Set – Data Processing inst. (2) <ul><li>Shifts </li></ul><ul><ul><li>LSL : Logical Shift Left </li></ul></ul><ul><ul><li>LSR : Logical Shift Right </li></ul></ul><ul><ul><li>ASR : Arithmetic Shift Right </li></ul></ul><ul><ul><li>ROR : Rotate Right </li></ul></ul><ul><ul><li>RRX: Rotate Right Extended </li></ul></ul><ul><li>IMMEDIATE OPERAND ROTATES </li></ul><ul><ul><li>(immediate value that is zero extended to 32 bits) >> (rotate field *2) </li></ul></ul><ul><ul><li>This enables many common constants to be generated, for example all powers of 2. </li></ul></ul>
    50. 50. Instruction Set – ldr / str <ul><li>LDR{cond}{B} Rd, address{!} Rd:=contents of address </li></ul><ul><li>LDR{cond}{B} Rd, =expression Rd:= expression </li></ul><ul><li>STR{cond}{B} Rd, address{!} contents of address:=Rd </li></ul>Post-indexed Rn [Rn],  Rm, shift cnt Post-indexed Rn [Rn],  Rm Post-indexed Rn [Rn],  expression Pre-indexed Rn,  (Rm shift by cnt) [Rn,  Rm, shift cnt] Pre-indexed Rn,  Rm [Rn,  Rm] Pre-indexed Rn,  expression [Rn,  expression] None Rn [Rn] Indexing Effective address Mode
    51. 51. Offsets and Auto-indexing <ul><li>Pre-indexed Addressing Mode </li></ul><ul><ul><li>If W=1 (use !), modified base value may be written back into the base, or the old base may be kept (W=0) </li></ul></ul><ul><ul><li>ex) str r3, [r0, #4] // reg 접근 </li></ul></ul><ul><ul><li>Vs. str r3, [r0, #4]! // memory 접근 </li></ul></ul><ul><li>Post-indexed Addressing Mode ( 많이 쓴다 .) </li></ul><ul><ul><li>The write back bit is redundant and is always set to zero. </li></ul></ul><ul><ul><li>Post-indexed data transfers always write back the modified base. </li></ul></ul><ul><ul><li>ex) str r3, [r0], #4 </li></ul></ul>
    52. 52. Instruction Set – ldm / stm (1)
    53. 53. Instruction Set – ldm / stm (1) Ldm L=1 I U=1 D U=0 B P=1, ++i A P=0 ,i++ Ldmib r0, {r1-r4} Ldmia r0, {r1-r4} B P=1, --i A P=0 ,I-- Ldmdb r0, {r1-r4} Ldmda r0, {r1-r4} stm L=0 I U=1 D U=0 B P=1, ++i A P=0 ,i++ stmib r0, {r1-r4} stmia r0, {r1-r4} B P=1, --i A P=0 ,I-- stmdb r0, {r1-r4} stmda r0, {r1-r4}
    54. 54. Instruction Set – ldm / stm (1) <ul><li>Memory Copy </li></ul><ul><li>Memory Set </li></ul><ul><li>Stack Operation (Push/Pop) </li></ul>
    55. 55. Instruction Set – ldm / stm (2) <ul><li>Stack : ‘E’ is Empty, ‘F’ is Full, ‘D’ is Decending, ‘A’ is Ascending </li></ul><ul><li>Other : ‘I’ is Increment, ‘D’ is decrement, ‘B’ is before, ‘A’ is After </li></ul><Addressing Mode Names>
    56. 56. Instruction Set – ldm / stm (3) <ul><li>Post-increment load </li></ul><ul><ul><li>Ex) STMIA Rn, {R1, R5, R7} </li></ul></ul>
    57. 57. Instruction Set – ldm / stm (4) <ul><li>Pre-increment load </li></ul><ul><ul><li>Ex) STMIB Rn, {R1, R5, R7} </li></ul></ul>
    58. 58. Instruction Set – ldm / stm (5) <ul><li>Pre-decrement load </li></ul><ul><ul><li>Ex) STMDB Rn, {R1, R5, R7} </li></ul></ul>
    59. 59. Instruction Set – ldm / stm (6) <ul><li>Post-decrement load </li></ul><ul><ul><li>Ex) STMDA Rn, {R1, R5, R7} </li></ul></ul>
    60. 60. Use of the S bit (bit22 – ^) <ul><li>Transfer List 안에 R15 가 있는 LDM 과 S Bit 설정된 경우 </li></ul><ul><ul><li>ldmfd sp!, {r4 - sl, fp, pc}^ ; pc <- (sp) , cpsr <- spsr_mode </li></ul></ul><ul><ul><li>; (allowed only in privileged modes) </li></ul></ul><ul><ul><ul><li>r15 의 값이 스택에 로딩된다 . </li></ul></ul></ul><ul><ul><ul><li>그와 동시에 ^ 의 의미는 spsr_<mode> 를 cpsr 의 값으로 넣으라는 의미이다 . </li></ul></ul></ul><ul><li>R15 not in List and S Bit Set (User Bank Transfer) </li></ul><ul><ul><li>For both LDM and STM instructions, the User bank registers are transferred rather than the register bank corresponding to the current mode. This is useful for saving the user state on process switches. Base write-back should not be used when this mechanism is employed. </li></ul></ul><ul><ul><li>When the instruction is LDM, care must be taken not to read from a banked register during the following cycle (inserting a dummy instruction such as MOV R0, R0 after the LDM will ensure safety). </li></ul></ul><ul><ul><li>ex) stmdb r8, {sp, lr}^ </li></ul></ul><ul><li>USE OF R15 AS THE BASE </li></ul><ul><ul><li>R15 should not be used as the base register in any LDM or STM instruction. </li></ul></ul>
    61. 61. Instruction Set – coprocessor (MRC,MCR) <ul><li><MCR|MRC>{cond} p#,<expression1>,Rd,cn,cm{,<expression2>} </li></ul><ul><ul><li>MRC : Move from coprocessor to ARM7TDMI register (L=1) </li></ul></ul><ul><ul><li>MCR : Move from ARM7TDMI register to coprocessor (L=0) </li></ul></ul><ul><ul><li>{cond} : Two character condition mnemonic. See Table 3-2 </li></ul></ul><ul><ul><li>p# : The unique number of the required coprocessor </li></ul></ul><ul><ul><li><expression1> : Evaluated to a constant and placed in the CP Opc field </li></ul></ul><ul><ul><li>Rd : An expression evaluating to a valid ARM7TDMI register number </li></ul></ul><ul><ul><li>cn and cm : Expressions evaluating to the valid coprocessor register numbers CRn and CRm respectively </li></ul></ul><ul><ul><li><expression2> : Where present is evaluated to a constant and placed in the CP field </li></ul></ul>
    62. 62. APCS register use convention link address / scratch register lr 14 register variable 3 v3 6 program counter pc 15 register variable 4 v4 7 Lower end of current stack frame sp 13 register variable 2 v2 5 scratch reg. / new sb in inter-link-unit calls ip 12 register variable 1 v1 4 frame pointer fp 11 argumect 4 /scratch register a4 3 stack limit / register variable 7 sl/v7 10 argumect 3 /scratch register a3 2 Static base / register variable 6 sb/v6 9 argumect 2 /scratch register a2 1 register variable 5 v5 8 argumect 1 / interger result /scratch register a1 0 APCS Role APCS reg APCS Role APCS
    63. 63. 32-bit ARM Instructions
    64. 64. 목차 <ul><li>데이터 처리 명령어 </li></ul><ul><li>분기 명령어 </li></ul><ul><li>데이터 전송 명령어 </li></ul><ul><li>특수 명령어 </li></ul><ul><li>ARMv5E 확장 명령어 </li></ul>
    65. 65. 명령어 표기 <ul><li>표기 방법 </li></ul><ul><ul><li>2 또는 3 개의 operands 지원 </li></ul></ul><ul><li>교재의 명령어 동작 표현 </li></ul><ul><li>PRE < 명령어가 실행되기 전의 상태 > </li></ul><ul><li>< 명령어 > </li></ul><ul><li>POST < 명령어가 실행된 후의 상태 > </li></ul><ul><li>메모리는 mem<data_size>[address] 와 같이 표시 </li></ul><ul><li>mem32[1024] 는 1KB 주소에서 시작하는 32 비트값 의미 </li></ul>
    66. 66. 데이터 처리 명령어 <ul><li>레지스터 안에서 데이터를 조작하는데 사용됨 </li></ul><ul><ul><li>데디터 이동 연산 </li></ul></ul><ul><ul><ul><li>MOV/MVN </li></ul></ul></ul><ul><ul><li>산술 연산 </li></ul></ul><ul><ul><ul><li>ADD/ADC/SUB/SBC/RSB/RSC </li></ul></ul></ul><ul><ul><li>논리 연산 </li></ul></ul><ul><ul><ul><li>AND/ORR/EOR/BIC </li></ul></ul></ul><ul><ul><li>비교 연산 </li></ul></ul><ul><ul><ul><li>CMP/CMN/TST/TEQ </li></ul></ul></ul><ul><ul><li>곱셈 연산 </li></ul></ul><ul><ul><ul><li>MUL/UMULL/UMLAL/SMULL/SMLAL </li></ul></ul></ul>
    67. 67. 데이터 처리 명령어의 특징 <ul><li>명령어 길이 : 32- 비트 </li></ul><ul><li>형식 : 3-operand format </li></ul><ul><li>한 사이클 안에 실행 </li></ul><ul><li>조건부 실행 가능 </li></ul><ul><li>그 결과가 상태 프래그에 영향을 주지 않음 </li></ul><ul><ul><li>“ S” 접미사 이용 , CPSR 업데이트 </li></ul></ul>
    68. 68. 데이터 이동 명령어 (I) : MOV <ul><li>MOV : Move </li></ul><ul><ul><li>32 비트 값을 레지스터로 이동 </li></ul></ul><ul><li>표기법 </li></ul><ul><ul><li>MOV<cond>{S} <Rd>, #<rotated_immed> </li></ul></ul><ul><ul><li>MOV<cond>{S} <Rd>, <Rm> {, <shift>} </li></ul></ul><ul><li>예제 </li></ul><ul><ul><li>MOV r0, #0xff000000 -> r0 = 0xff000000 </li></ul></ul><ul><ul><li>MOV pc, lr -> pc = lr </li></ul></ul><ul><ul><li>MOV r0, r1, LSL#2 -> r0 = r1*4 </li></ul></ul>
    69. 69. 데이터 이동 명려어 (II) : MVN <ul><li>MVN : Move NOT </li></ul><ul><ul><li>32 비트 값을 논리 반전 </li></ul></ul><ul><li>표기법 </li></ul><ul><ul><li>MVN<cond>{S} </li></ul></ul><ul><li>예제 : </li></ul><ul><ul><li>MVN r0, #0xff000000 -> r0 = 0x00ffffff </li></ul></ul><ul><ul><li>MVN r0, r1 -> r0 = ~r1 </li></ul></ul><ul><ul><li>MVN r0, r1, LSL#2 -> r0 = ~(r1*4) </li></ul></ul>
    70. 70. Barrel shifter <ul><li>ALU 로 입력 전 2 의 지수승 곱셈 / 나눗셈 적용 </li></ul>
    71. 71. 산술명령어 (I) <ul><li>ADD : Add </li></ul><ul><ul><li>두 32 비트 값의 덧셈 </li></ul></ul><ul><li>표기법 </li></ul><ul><ul><li>1. ADD<cond>{S} <Rd>, <Rn>, #<rotated_immed> </li></ul></ul><ul><ul><li>2. ADD<cond>{S} <Rd>, <Rn>, <Rm>{,<shift>} </li></ul></ul><ul><li>예제 </li></ul><ul><ul><li>ADD r0, r1, #4 -> r0 = r1 + 4 </li></ul></ul><ul><ul><li>ADD r0, r0, r0, LSL#2 -> r0 = r0 + r0*4 </li></ul></ul>
    72. 108. XDB 을 이용한 GPIO 제어
    73. 110. GPLR
    74. 111. GPDR
    75. 112. GPSR & GPCR
    76. 113. GPSR & GPCR
    77. 114. Register Summary
    78. 115. 320TKU 의 디버깅용 GPIO
    79. 116. XDB 을 이용한 UART 제어
    80. 117. Frame Formats
    81. 118. UART Data Sampling
    82. 119. ATmega128 UART Block
    83. 120. STUART Register and Address
    84. 121. FFUART Register and Address
    85. 122. 320TKU 의 디버깅용 STUART
    86. 123. 320TKU 의 Full UART
    87. 124. XDB 을 이용한 IED_DOT 제어
    88. 125. IED 의 DOT MATIRX
    89. 126. 10. LCD 모듈제어 <ul><li>Character LCD 장치 개요 </li></ul><ul><li>Character LCD 내부 구조 </li></ul><ul><li>Character LCD 명령어 </li></ul><ul><li>Display Data Ram 의 구조 </li></ul><ul><li>C.G Ram 에 사용자 정의 문자 출력하기 </li></ul><ul><li>Character LCD 모듈의 초기화 </li></ul><ul><li>Character LCD 의 예제 </li></ul>
    90. 127. <ul><li>성질 </li></ul><ul><ul><li>Liquid Crystal Display </li></ul></ul><ul><ul><li>전압 부과시 일정한 방향으로 정렬 </li></ul></ul><ul><ul><li>편광 성질을 통해 전압이 걸린 부분이 검게 표시 </li></ul></ul><ul><ul><li>전력 소모가 적음 </li></ul></ul><ul><ul><li>휴대용 마이크로 컴퓨터 시스템에 다수 사용 </li></ul></ul><ul><ul><li>LCD 패널과 제어기가 하나의 패키지 형태로 구성 </li></ul></ul><ul><ul><ul><li>제어기에 데이터 전송으로 원하는 정보가 디스플레이됨 . </li></ul></ul></ul>Character LCD 장치 개요
    91. 128. <ul><li>2 개의 장치로 구성 </li></ul><ul><ul><li>LCD display 장치 (HD44100): 2x16 문자 디스플레이 가능 </li></ul></ul><ul><ul><li>LCD controller 장치 (HD44780) : 8- 비트 마이크로프로세서로 구성 </li></ul></ul>Character LCD 내부 구조
    92. 129. <ul><li>HD44780 의 내부 블록도 </li></ul>Character LCD 내부 구조
    93. 130. <ul><li>HD44780 의 내부 레지스터 </li></ul><ul><ul><li>IR (Instruction Register) </li></ul></ul><ul><ul><ul><li>D.D.RAM 과 C.G.RAM 에 대한 주소정보와 클리어 , 커서이동에 대한 명령코드를 가지는 레지스터 </li></ul></ul></ul><ul><ul><li>DR(Data Register) </li></ul></ul><ul><ul><ul><li>D.D.RAM 과 C.G.RAM 에 데이터를 읽거나 써넣을 때 사용되는 레지스터 </li></ul></ul></ul><ul><ul><li>AC(Address Counter) </li></ul></ul><ul><ul><ul><li>D.D.RAM 과 C.G.RAM 의 어드레스를 지정할 때 사용되는 레지스터 </li></ul></ul></ul><ul><ul><li>D.D.RAM(Display Data RAM) </li></ul></ul><ul><ul><ul><li>8 비트 문자코드의 디스플레이 데이터를 가지고있으며 최대용량은 80x8 비트인 80 문자이다 </li></ul></ul></ul><ul><ul><li>C.G.ROM(Character Generator ROM) </li></ul></ul><ul><ul><ul><li>문자 글씨체를 저장하고 있다 </li></ul></ul></ul><ul><ul><li>C.G.RAM(Character Generator RAM) </li></ul></ul><ul><ul><ul><li>사용자가 문자를 새로이 만들 때 사용되는 RAM 이다 </li></ul></ul></ul>Character LCD 내부 구조
    94. 131. <ul><li>HD44780 의 핀 할당 </li></ul>Character LCD 내부 구조 양방향 입력 입력 입력 입력 입력 입력 입 / 출력 DB7 14 DB6 13 DB5 12 DB4 11 DB3 10 DB2 9 DB1 8 데이터 버스 DB0 7 Enable 신호로 명령이 하나 입력될 때마다 펄스를 하나씩 내주어야 한다 . E 6 ‘ 1’= Read,  '0'= Write R/W 5 LCD 자체의 명령과 데이터 입력을 제어 .   ‘0’= 명령입력 ‘ 1’= 데이터입력 RS 4 가변저항 10K 를 달아서 LCD 글자의 밝기를 조절 VO 3 +5V VDD 2 0V (GND) VSS 1 기능 기호 핀번호
    95. 132. <ul><li>HD44780 에서의 레지스터 전송 제어 </li></ul><ul><ul><li>RS(Register select) </li></ul></ul><ul><ul><ul><li>Low : IR, High : DR 을 선택 </li></ul></ul></ul><ul><ul><li>RW : 레지스터에 데이터 Read/Write </li></ul></ul><ul><ul><li>E(Enable) </li></ul></ul><ul><ul><ul><li>High 상태에서 명령 / 데이터를 출력하고 , LCD 가 명령을 처리할 시간을 지연한 후 Low 상태로 변환 </li></ul></ul></ul>Character LCD 내부 구조 RS 동작에 따른 IR 선택 RS 동작에 따른 DR 선택 1 0 0 E RW RS 0 0 0 E RW RS 1 0 1 E RW RS 0 0 1 E RW RS
    96. 133. <ul><li>HD44780 의 제어 명령 </li></ul>Character LCD 내부 구조 40uS Read Address 1 1 Data Read to CG RAM or DD RAM 40uS Write Address 0 1 Data Write to CG RAM or DD RAM 40uS Address Counter BF 1 0 Read Busy Flag and Address 40uS DD RAM Address 1 0 0 Set DD RAM Address 40uS CG RAM Address 1 0 0 0 Set CG RAM Address 40uS 0 0 F N D/L 1 0 0 0 0 Function Set 40uS 0 0 R/L S/C 1 0 0 0 0 0 Cursor or Display Shift 40uS S C D 1 0 0 0 0 0 0 Display on/off Control 40uS S I/D 1 0 0 0 0 0 0 0 Entry Mode Set 40uS 0 1 0 0 0 0 0 0 0 0 Return Home 1.64mS 1 0 0 0 0 0 0 0 0 0 Clear Display D0 D1 D2 D3 D4 D5 D6 D7 R/W RS Execute Time 제어 명령 제어신호 기 능
    97. 134. <ul><li>명령어 종류 </li></ul><ul><ul><li>표시 클리어 </li></ul></ul><ul><ul><ul><li>화면 클리어 후 커서는 홈 위치 (00 번지 ) 로 돌아감 </li></ul></ul></ul><ul><ul><li>Cursor home </li></ul></ul><ul><ul><ul><li>커서를 LCD 홈으로 리턴 </li></ul></ul></ul>Character LCD 명령어 1 0 0 0 0 0 0 0 DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 X 1 0 0 0 0 0 0 DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7
    98. 135. <ul><li>명령어 종류 </li></ul><ul><ul><li>엔트리 모드 </li></ul></ul><ul><ul><ul><li>커서의 진행 방향이나 표시된 문자를 쉬프트 시킬 것인지 설정 </li></ul></ul></ul><ul><ul><ul><li>I/D (Increment/Decrement) </li></ul></ul></ul><ul><ul><ul><ul><li>1 (address +1) </li></ul></ul></ul></ul><ul><ul><ul><ul><li>0 (address -1) </li></ul></ul></ul></ul><ul><ul><ul><li>S(shift) </li></ul></ul></ul><ul><ul><ul><ul><li>I/D=1, S=1 : 왼쪽으로 쉬프트 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>I/D=0, S=1 : 오른쪽으로 쉬프트 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>S=0 : 표시된 문자는 쉬프트되지 않는다 . </li></ul></ul></ul></ul><ul><ul><li>표시 ON/OFF 제어 </li></ul></ul><ul><ul><ul><li>D=1 : 표시 on, D=0 : 표시 off </li></ul></ul></ul><ul><ul><ul><li>C=1 : 커서 on, C=0 : 커서 off </li></ul></ul></ul><ul><ul><ul><li>B=1 : 문자 on, B=0 : 문자 off </li></ul></ul></ul>Character LCD 명령어 B C D 1 0 0 0 0 DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 S I/D 1 0 0 0 0 0 DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7
    99. 136. <ul><li>명령어 종류 </li></ul><ul><ul><li>커서 / 표시 Shift </li></ul></ul><ul><ul><ul><li>램의 내용은 변경하지 않고 커서 이동과 표시 쉬프트 제어 </li></ul></ul></ul><ul><ul><ul><li>S/C=0, R/L=0 : 커서 위치를 좌로 이동 (AC -= 1) </li></ul></ul></ul><ul><ul><ul><li>S/C=0, R/L=1 : 커서 위치를 우로 이동 (AC += 1) </li></ul></ul></ul><ul><ul><ul><li>S/C=1, R/L=0 : 표시 전체를 좌로 이동 , 표시는 커서에 따라 움직임 </li></ul></ul></ul><ul><ul><ul><li>S/C=1, R/L=1 : 표시 전체를 우로 이동 , 커서는 움직이지 않는다 . </li></ul></ul></ul>Shift Left (0x18) Shift Right (0x1C) Character LCD 명령어 X X R/L S/C 1 0 0 0 DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 41 42 …. 4F 50 01 02 …. 0F 10 67 41 …. 4D 4E 27 01 …. 0D 0E
    100. 137. <ul><li>명령어 종류 </li></ul><ul><ul><li>Function set </li></ul></ul><ul><ul><ul><li>DL=1 : 8 비트 인터페이스 세트 </li></ul></ul></ul><ul><ul><ul><li>DL=0 : 4 비트 인터페이스 세트 , 상위 4 비트 전송후 하위 4 비트 전송 </li></ul></ul></ul><ul><ul><ul><li>N : 표시 행수 </li></ul></ul></ul><ul><ul><ul><li>F : 문자 폰트 </li></ul></ul></ul><ul><ul><ul><ul><li>N=0,F=0 : 1 행 , 5x7 dot </li></ul></ul></ul></ul><ul><ul><ul><ul><li>N=0,F=1 : 1 행 , 5x10 dot </li></ul></ul></ul></ul><ul><ul><ul><ul><li>N=1,F=x : 2 행 , 5x7 dot </li></ul></ul></ul></ul>Character LCD 명령어 X X FL N DL 1 0 0 DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7
    101. 138. <ul><li>명령어 종류 </li></ul><ul><ul><li>C.G. RAM 주소 설정 </li></ul></ul><ul><ul><li>D.D. RAM 주소 설정 </li></ul></ul>Character LCD 명령어 A0 A1 A2 A3 A4 A5 1 0 DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 A0 A1 A2 A3 A4 A5 A6 1 DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7
    102. 139. <ul><li>Display Data RAM 의 주소와 LCD 의 문자위치의 관계 </li></ul><ul><ul><li>D.D.RAM 은 8 비트 문자코드에 상응하는 디스플레이 데이터를 저장한다 </li></ul></ul><ul><ul><li>80 개의 문자를 저장하며 , 아래는 16 문자 2 라인 LCD 의 경우를 나타낸 것임 </li></ul></ul><ul><ul><li>첫 번째 라인의 끝과 두 번째 라인의 시작의 주소가 연결되지 않으므로 각각의 라인이 끝나게 되면 D.D.RAM 의 주소를 새로이 설정해야 한다 </li></ul></ul>D.D.RAM 의 주소 Display Data Ram 의 구조 4F 4E 4D 4C 4B 4A 49 48 47 46 45 44 43 42 41 40 2 행 -> 0F 0E 0D 0C 0B 0A 09 08 07 06 05 04 03 02 01 00 1 행 -> 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 열위치 ->
    103. 140. <ul><li>사용자 정의 문자 출력하기 </li></ul><ul><ul><li>사용자 정의 문자 패턴의 크기 5x7  8 바이트 정보로 표현 </li></ul></ul><ul><ul><li>IR 레지스터에 CG-RAM 주소 설정 </li></ul></ul><ul><ul><li>DR 레지스터에 문자 패턴 정보 1 바이트 설정 </li></ul></ul><ul><ul><li>8 바이트 정보 입력이 완료될 때까지 2, 3 번 과정 반복 </li></ul></ul><ul><ul><li>DD-RAM 에 출력하고자 하는 사용자 정의 문자의 코드 (0x00~ 0x07) 을 설정 </li></ul></ul><ul><ul><li>사용자 정의 문자 출력 </li></ul></ul>C.G Ram 에 사용자 정의 문자 출력하기
    104. 141. Character LCD 모듈의 초기화
    105. 142. <ul><li>초기화 Routine </li></ul>전원 ON VDD 가 4.5V 될 때까지 15ms 이상 대기 FUNCTION SET 명령 4.1 ms 이상 대기 100  sec 이상 대기 FUNCTION SET 명령 FUNCTION SET 명령 FUNCTION SET 명령 DISPLAY OFF 명령 CLEAR DISPLAY 명령 ENTRY MODE 명령 DISPLAY ON 명령 초기설정 완료 Character LCD 모듈의 초기화
    106. 143. 디코팅 회로

    ×