掌機 - Game & Watch: The Legend of Zelda - Assembly - UART



參考資訊:
https://github.com/ghidraninja/game-and-watch-backup
https://www.st.com/resource/en/datasheet/stm32h7b0vb.pdf
https://www.st.com/resource/en/reference_manual/dm00463927-stm32h7a37b3-and-stm32h7b0-value-line-advanced-armbased-32bit-mcus-stmicroelectronics.pdf

UART使用到的腳位為PA-2(USART2_TX)、PA-3(USART2_RX)


USART2EN=1


USART234578SEL=3(HSI Clock)


TE=1、UE=1


Baudrate計算方式如下:

Baudrate = USART_KER_CKPRES/USART_DIV = 64000000/556 = 115108 ~= 115200



TC是傳送完成旗標


傳送資料


GPIOAEN=1


MODER2=2


AFR2=7(USART2)



main.s

    .equiv PORTA_BASE,    0x58020000
    .equiv PORTC_BASE,    0x58020800
    .equiv PORTE_BASE,    0x58021000
    .equiv GPIO_MODER,    0x0000
    .equiv GPIO_ODR,      0x0014
    .equiv GPIO_AFRL,     0x0020
 
    .equiv RCC_BASE,      0x58024400
    .equiv RCC_AHB4ENR,   0x0140
    .equiv RCC_APB4ENR,   0x0154
    .equiv RCC_CDCCIP2R,  0x0054
    .equiv RCC_APB1LENR,  0x0148

    .equiv USART2_BASE,   0x40004400
    .equiv USART_CR1,     0x0000
    .equiv USART_BRR,     0x000c
    .equiv USART_ISR,     0x001c
    .equiv USART_TDR,     0x0028

    .thumb
    .cpu cortex-m7
    .syntax unified
 
    .global _start
 
    .text
    .org 0x0000
_start:
    .word 0x20020000
    .word reset
 
    .org 0x0100
    .thumb_func
reset:
    ldr r0, =RCC_BASE
    ldr r1, [r0, #RCC_APB1LENR]
    orr r1, #(1 << 17)
    str r1, [r0, #RCC_APB1LENR]

    ldr r1, [r0, #RCC_AHB4ENR]
    orr r1, #(1 << 0)
    str r1, [r0, #RCC_AHB4ENR]

    ldr r0, =RCC_BASE
    ldr r1, [r0, #RCC_CDCCIP2R]
    bic r1, #0x07
    orr r1, #0x03
    str r1, [r0, #RCC_CDCCIP2R]

    ldr r0, =PORTA_BASE
    ldr r1, [r0, #GPIO_MODER]
    bic r1, #0xf0
    orr r1, #(2 << 4)
    str r1, [r0, #GPIO_MODER]

    ldr r1, [r0, #GPIO_AFRL]
    bic r1, #0xf00
    orr r1, #(7 << 8)
    str r1, [r0, #GPIO_AFRL]
 
    ldr r0, =USART2_BASE
    ldr r1, =0x22c
    str r1, [r0, #USART_BRR]
    ldr r1, [r0, #USART_CR1]
    orr r1, #0x09
    str r1, [r0, #USART_CR1]

    ldr r0, =USART2_BASE
    ldr r2, =hello
1:
    ldr r1, [r0, #USART_ISR]
    tst r1, #(1 << 6)
    beq 1b
    ldrb r1, [r2]
    strb r1, [r0, #USART_TDR]
    add r2, #1
    cmp r1, #0
    bne 1b
    b .

    .align
hello: .asciz "Hello, world!"
    .end

接線如下


完成