掌機 - GKD Pixel - Assembly - UART



GKD Pixel是使用UART1做為除錯介面,腳位如下:


UART1 Clock


Baudrate計算方式

Baudrate = 24MHz / (16 * Divisor)

115200 = 24000000 / (16 * 13)

main.s

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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
    .extern _start
    .set noreorder
 
    .equiv LED,     14
    .equiv DELAY,   0x100000
 
    .equiv CPM,     0xb0000000
    .equiv PA,      0xb0010000
    .equiv PB,      0xb0011000
    .equiv PC,      0xb0012000
    .equiv PD,      0xb0013000
    .equiv UART1,   0xb0031000
 
    .equiv PXINT,   0x0010
    .equiv PXMSK,   0x0020
    .equiv PXPAT1,  0x0030
    .equiv PXPAT0,  0x0040
 
    .equiv URBR,    0x0000
    .equiv UTHR,    0x0000
    .equiv UDLLR,   0x0000
    .equiv UDLHR,   0x0004
    .equiv UIER,    0x0004
    .equiv UIIR,    0x0008
    .equiv UFCR,    0x0008
    .equiv ULCR,    0x000c
    .equiv UMCR,    0x0010
    .equiv ULSR,    0x0014
    .equiv UMSR,    0x0018
    .equiv USPR,    0x001c
    .equiv ISR,     0x0020
    .equiv UMR,     0x0024
    .equiv UACR,    0x0028
    .equiv URCR,    0x0040
    .equiv UTCR,    0x0044
 
    .equiv CLKGR0,  0x0020
 
    .text
    .ascii "LPSM"
 
    .rept 2044
    .byte 0
    .endr
 
_start:
    li $8, CPM + CLKGR0
    lw $9, 0($8)
    and $9, ~(1 << 15)
    sw $9, 0($8)
 
    li $9, ~((1 << 23) | (1 << 24))
    li $8, PB + PXMSK
    sw $9, 0($8)
    li $8, PB + PXPAT0
    sw $9, 0($8)
 
    li $9, (1 << 7) | 3
    li $8, UART1 + ULCR
    sw $9, 0($8)
 
    li $10, 0
    li $8, UART1 + UDLHR
    sw $10, 0($8)
 
    li $9, 13
    li $8, UART1 + UDLLR
    sw $9, 0($8)
 
    li $9, 3
    li $8, UART1 + ULCR
    sw $9, 0($8)
 
    li $9, (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0)
    li $8, UART1 + UFCR
    sw $9, 0($8)
 
    li $v0, '0
    bal send_byte
    li $v0, 'H'
    bal send_byte
    li $v0, 'e'
    bal send_byte
    li $v0, 'l'
    bal send_byte
    li $v0, 'l'
    bal send_byte
    li $v0, 'o'
    bal send_byte
    li $v0, ','
    bal send_byte
    li $v0, ' '
    bal send_byte
    li $v0, 'w'
    bal send_byte
    li $v0, 'o'
    bal send_byte
    li $v0, 'r'
    bal send_byte
    li $v0, 'l'
    bal send_byte
    li $v0, 'd'
    bal send_byte
    li $v0, '!'
    bal send_byte
 
main:
    b main
    nop
 
send_byte:
    li $8, UART1 + ULSR
0:
    lb $9, 0($8)
    and $9, (1 << 6)
    beq $9, $zero, 0b
    nop
 
    li $8, UART1 + UTHR
    sb $v0, 0($8)
    jr $ra
    nop

完成