AnsweredAssumed Answered

stm32f401re nucleo: USART programming

Question asked by engkyr on Nov 16, 2015
Latest reply on Nov 18, 2015 by engkyr
Hello everybody,
I'm new on the forum and on ST microcontrollers.
I'm trying to program the USART in assembly, but I have some issue to write on DR.
What am I missing? Somebody can help me, please?

*********************************************
        SECTION MYDATA:CONST
        DATA
TDR     DCB     "HELLO WORLD!\r"

;     statup code
..
..

ldr     r0, =0x40023800         ; RCC
        
        ldr     r1, [r0, #0x10]         ; RCC_AHB1RSTR
        bic     r1, r1, #1
        str     r1, [r0, #0x10]
        
        ldr     r1, [r0, #0x30]         ; RCC_AHB1ENR
        orr     r1, r1, #1
        str     r1, [r0, #0x30]
        
        ldr     r1, [r0, #0x24]         ; RCC_APB2RSTR
        bic     r1, r1, #(1 << 4)
        str     r1, [r0, #0x24]
        
        ldr     r1, [r0, #0x44]         ; RCC_APB2ENR
        orr     r1, r1, #(1 << 4)
        str     r1, [r0, #0x44]
        
        ldr     r0, =0x40020000         ; Configurazione della GPIOA
        
        ldr     r1, [r0]                ; GPIOA_MODER
        bic     r1, r1, #(15 << 2*9)    ; Mask PA9/10
        orr     r1, r1, #(10 << 2*9)    ; =AF mode
        str     r1, [r0]
        
        ldr     r1, [r0, #0x4]          ; GPIOA_OTYPER
        bic     r1, r1, #(3 << 9)       ; Mask PA9/10, 0= push pull
        str     r1, [r0, #0x4]
        
        ldr     r1, [r0, #0x8]          ; GPIOA_OSPEEDR
        bic     r1, r1, #(15 << 2*9)    ; Mask PA9/10
        orr     r1, r1, #(10 << 2*9)    ; =fast speed
        str     r1, [r0, #0x8]
        
        ldr     r1, [r0, #0xC]          ; GPIOA_PUPDR
        bic     r1, r1, #(15 << 2*9)    ; Mask PA9/10. =no pull
        ;orr     r1, r1, #(5 << 2*9)    ; =pull-up
        str     r1, [r0, #0xC]
        
        ldr     r1, [r0, #0x24]         ; GPIOA_AFRH
        bic     r1, r1, #(0xFF << 4*1)  ; Mask PA9/10
        orr     r1, r1, #(0x77 << 4*1)  ; =AF7, USART1
        str     r1, [r0, #0x24]
        
        
        ; Init_USART1
                                        ;
                                        ;
        ldr     r0, =0x40011000         ; USART1
        
        ldr     r1, =0xC00080           ; =reset value
        str     r1, [r0]                ; SR
        
        ldr     r1, =0x683              ; =USARTDIV. per ottenere 9600bps a partire da HSI
        str     r1, [r0, #0x8]          ; BRR
        
        ldr     r1, =0                  ; =reset value
        str     r1, [r0, #0x10]         ; CR2. 1 stop bit
        
        ldr     r1, =0x8
        str     r1, [r0, #0x14]         ; CR3. =half-duplex selected
        
        ldr     r1, =0
        str     r1, [r0, #0x18]         ; GTPR. =reset value        
        
        ldr     r1, =0x2088             ; CR1. over=16, data bits=8, TE=1, TXEIE=1
        str     r1, [r0, #0xC]
        
            
        B       main
        
        
        SECTION .text:CODE:NOROOT(2)
        THUMB
        
main    NOP
        LDR     r2, =TDR                ; carico in r2 l'indirizzo della base
                                        ; di memoria in cui è memorizzata la
                                        ; stringa "HELLO WORLD!"
polling
        ldr     r1, [r0]                ; USART1_SR
        ands    r1, r1, #(1 << 7)       ; se TXE=0 rimane nel polling
        beq     polling
        ldrb    r3, [r2], #1            ; carica il valore puntato da r2 e poi r2++ (byte)
        cmp     r3, #'\r'
        beq     main                    ; se sono uguali salta l'istruzione di memorizzare in USART1_DR
        ldr     r4, [r0]
        strh    r3, [r0, #0x4]          ; scrive il dato da trasmettere nello USART1_DR
        B       polling

*********************************************

ps: I'm modify the startup code given by ST
pps: I'm using IAR to write my program

Outcomes