@---------------------------------------------------------------------------- @ File Name : seriell.S @ Object : Grundfunktionen der seriellen Schnittstelle @ @ 1.0 27/10/02 GR : Creation @---------------------------------------------------------------------------- .file "seriell.S" #include "../h/pmc.inc" #include "../h/pio.inc" #include "../h/usart.inc" DEFAULT_BAUD = 38400 CLOCK_SPEED = 25000000 US_BAUD = 0x29 @ CLOCK_SPEED / (16*(DEFAULT_BAUD)) @ Funktion .text .align 2 .global init_ser .type init_ser,function init_ser: stmfd sp!, {r0-r3, lr} @ Register retten adr r0,L1 adr r1,L1_end init_ser_loop: ldmia r0!, {r2-r3} cmp r0, r1 str r3, [r2] bne init_ser_loop ldmfd sp!, {r0-r3, pc} @ Rücksprung L1: .word PMC_BASE+PMC_PCER, 0x4 .word PIOA_BASE+PIO_PDR, 0x18000 .word USART0_BASE+US_CR, 0xa0 .word USART0_BASE+US_MR, 0x8c0 .word USART0_BASE+US_BRGR, US_BAUD .word USART0_BASE+US_CR, 0x50 L1_end: @ Funktion .text .align 2 .global putchar .type putchar,function putchar: stmfd sp!, {r0-r2, lr} @ Register retten ldr r2, =USART0_BASE 1: ldr r1, [r2, #US_CSR] tst r1, #US_TXRDY @ ist Transmitter frei beq 1b str r0, [r2,#US_THR] ldmfd sp!, {r0-r2, pc} @ Rücksprung @ Funktion .text .align 2 .global getchar .type getchar,function getchar: stmfd sp!, {r1, r2, lr} @ Register retten ldr r2, =USART0_BASE 1: ldr r1, [r2, #US_CSR] ands r1, r1, #US_RXRDY beq 1b ldr r0, [r2, #US_RHR] ldmfd sp!, {r1, r2, pc} @ Rücksprung .end