STM32F103 >> Assembly

UART


參考資料:
1. pdf

RCC_APB2ENR暫存器,需要開啟IOPA、USART1EN、AFIOEN的Clock


UART1_TX是位於PA9、UART1_RX則是PA10


UART暫存器




Baudrate計算方式如下:

Baudrate = PLL2 / (16 * DIV) = 128000000 / (16 * 69.44)

main.s

  .thumb
  .cpu cortex-m3
  .syntax unified
   
  .equiv GPIOA_CRL,   0x40010800
  .equiv GPIOA_CRH,   0x40010804
  .equiv GPIOA_IDR,   0x40010808
  .equiv GPIOA_ODR,   0x4001080c

  .equiv GPIOC_CRL,   0x40011000
  .equiv GPIOC_CRH,   0x40011004
  .equiv GPIOC_IDR,   0x40011008
  .equiv GPIOC_ODR,   0x4001100c

  .equiv RCC_CR,      0x40021000
  .equiv RCC_CFGR,    0x40021004
  .equiv RCC_APB2ENR, 0x40021018

  .equiv FLASH_ACR,   0x40022000

  .equiv UART1_SR,    0x40013800
  .equiv UART1_DR,    0x40013804
  .equiv UART1_BRR,   0x40013808
  .equiv UART1_CR1,   0x4001380c
  .equiv UART1_CR2,   0x40013810
  .equiv UART1_CR3,   0x40013814

  .equiv STACKINIT,   0x20005000
    
  .global _start
  .section .text

  .org 0x0
  .word STACKINIT
  .word _start
  
  .org 0x100
  .align 2
  .thumb_func
_start:
  bl rcc_init
  bl flash_init
  bl uart_init

  ldr r4, =hello
0:
  ldrb r0, [r4]
  cmp r0, #0
  beq 1f
  bl uart_byte
  add r4, #1
  bne 0b
1:
  b .
  
  .align 2
  .thumb_func
uart_init:
  push {r4, lr}
  ldr r4, =RCC_APB2ENR
  ldr r1, [r4]
  ldr r2, =(1 << 14) | (1 << 2) | (1 << 0)
  orr r1, r2
  str r1, [r4]

  ldr r4, =GPIOA_CRH
  ldr r1, [r4]
  bic r1, #0xff0
  orr r1, #0x4b0
  str r1, [r4]

  ldr r4, =UART1_BRR
  @ldr r1, =(39 << 4) | (1 << 0) @ 115200bps 72MHz
  ldr r1, =(69 << 4) | (7 << 0) @ 115200bps 128MHz
  str r1, [r4]

  ldr r4, =UART1_CR1
  ldr r1, =(1 << 13) | (1 << 3)
  str r1, [r4]
  pop {r4, pc}
  
  .align 2
  .thumb_func
uart_byte:
  push {r4, lr}
  ldr r4, =UART1_SR
0:
  ldr r1, [r4]
  tst r1, #(1 << 7)
  beq 0b

  ldr r4, =UART1_DR
  str r0, [r4]
  pop {r4, pc}
  
  .align 2
  .thumb_func
rcc_init:
  push {r4, lr}
  ldr r4, =RCC_CR
  ldr r1, =(1 << 26) | (1 << 16)
  str r1, [r4]
0:
  ldr r1, [r4]
  tst r1, #(1 << 17)
  bne 0b

  ldr r4, =RCC_CFGR
  @mov r1, #(7 << 18) @ 72MHz
  mov r1, #(14 << 18) @ 128MHz
  orr r1, #(1 << 16)
  str r1, [r4]

  ldr r4, =RCC_CR
  ldr r1, [r4]
  orr r1, #(1 << 24)
  str r1, [r4]
0:
  ldr r1, [r4]
  tst r1, #(1 << 25)
  bne 0b

  ldr r4, =RCC_CFGR
  ldr r1, [r4]
  orr r1, #2
  str r1, [r4]
0:
  ldr r1, [r4]
  tst r1, #(1 << 3)
  bne 0b
  pop {r4, pc}

  .align
  .thumb_func
flash_init:
  push {r4, lr}
  ldr r4, =FLASH_ACR
  mov r1, #0x32
  str r1, [r4]
  pop {r4, pc}

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

完成


返回上一頁