Forum: Mikrocontroller und Digitale Elektronik STM32: USART data register immer auf 00?


von Daniel D. (Gast)


Lesenswert?

Hallo,

ich möchte mit dem unten gezeigten code einen Teil des SRAMs meines 
STM32F100RB über USART1 ausgeben. Allerdings kommen auf dem terminal nur 
Null-Bytes an.

Ich habe die Routine mal debugged und es funktioniert auch (fast) alles, 
bis zu dem Punkt, an dem der aktuelle Speicherwert in das Data Register 
von USART1 geschrieben werden soll (USART1->DR liegt bei 0x40013804).

Ich hatte anfangs versucht, den Speicher an dieser Adresse zu 
überwachen, um zu sehen, ob mein Wert tatsächlich dahingeschrieben wird. 
Allerdings habe ich gelesen, dass dies für den Debugger gar nicht 
sichtbar ist. Ich arbeite mit Keil und habe versucht die Register für 
USART1 mittels View > System Viewer > USART1 einzusehen. Aber auch hier 
bleibt DR immer auf 0x0000.

Was mache ich falsch? Im Code erkenne ich keine Fehler. Vllt. liegt es 
and er Verkabelung? Ich habe mein FOCA break-out board an PA9 / PA10, 
sowie GRND und 3.3V auf dem STM32 angeschlossen. FOCA und STM32 sind 
jeweils per USB am PC angeschlossen.

Dank und Gruß

1
iu2             ldr     r0, =0x40021000
2
3
                ldr     r1, =0x00004004
4
                str     r1, [r0, #0x18]
5
6
                ldr     r0, =0x40010800
7
8
                ldr     r1, =0x444444B4
9
                str     r1, [r0, #4]
10
11
                ldr     r0, =0x40013800 ; UART1
12
13
                movs    r1, #0
14
                strh    r1, [r0, #4]    ;  +4 USART_DR
15
16
                movs    r1, #69         ; 8MHz / 69 == 115200
17
                strh    r1, [r0, #8]    ;  +8 USART_BR
18
19
                movs    r1, #0x0600
20
                strh    r1, [r0, #16]   ; +16 USART_CR2 = 0x600
21
22
                movs    r1, #0
23
                strh    r1, [r0, #16]   ; +16 USART_CR2 = 0
24
25
                movs    r1, #0
26
                strh    r1, [r0, #24]   ; +24 USART_GTPR = 0 - Prescaler
27
28
                movw    r1, #0x200C     ; 8-bit, no parity, enable TX,TX
29
                strh    r1, [r0, #12]   ; +12 USART_CR1
30
31
                ldr     r2, =0x2000     ; Size = Length (8K)
32
                ldr     r3, =0x20000000 ; Mem = RAM Address
33
iu1             ldrh    r1, [r0, #0]    ; USART->SR
34
                ands    r1, #0x80       ; TXE
35
                beq     iu1
36
                ldrb    r1, [r3], #1    ; [Mem++]
37
                strh    r1, [r0, #4]    ; USART->DR
38
                subs    r2, r2, #1      ; Size--
39
                bne     iu1

von (prx) A. K. (prx)


Lesenswert?

Debugger können mit solchen Registern wie dem UART Datenregister nicht 
direkt umgehen. (1) Weil sie darauf genauso zugreifen wie der Prozessor, 
und damit zerstörend arbeiten. (2) Weil das 2 Register an einer Adresse 
sind, für jede Richtung eins.

von Detlef K. (adenin)


Lesenswert?

Der Simulator im Keil kann die STM32F1xx-Familie mit fast der gesammten 
Peripherie simulieren. Das ist in so einem Fall ein echter Vorteil im 
Vergleich zum Debuggen auf der Hardware.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.