summaryrefslogtreecommitdiffstats
path: root/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/seriell.S
blob: 9560075a7138e40381cd77e4df6128db00546df8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
@----------------------------------------------------------------------------
@ 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}		@ Rcksprung
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}		@ Rcksprung

@ 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}		@ Rcksprung

.end