programming
參考資料 §
1
2
名詞 §
暫存器 寄存器 register
記憶體 內存 memory
r0
是 ARM 架構中的一個通用暫存器, 用來儲存一個32位的值
語法 §
架構 §
.data 初始化常數
.text 初始化變量
.main 主程式
可以自訂函式並在外部引用, 要在.text中用.global宣告, 函式部份仿造.main, 下方程式碼為定義一個ledRun的函式
.syntax unified
.cpu cortex-m4
.thumb
.data
Leds: .byte 0
.text
.global ledRun
.equ GPIOA_MODER, 0x48000000
.equ GPIOA_OTYPER, 0x48000004
.equ GPIOA_OSPEEDR, 0x48000008
.equ GPIOA_PUPDR, 0x4800000C
.equ GPIOA_ODR, 0x48000014
.equ RCC_AHB2SMENR, 0x4002106C
ledRun:
// Enable AHB2 clock
movs r0, #0x1
ldr r1, =RCC_AHB2SMENR
str r0, [r1]
// Set PA5 as output mode
movs r0, #0x400
ldr r1, =GPIOA_MODER
ldr r2, [r1]
and r2, #0xFFFFF3FF
orrs r2, r2, r0
str r2, [r1]
// Default PA5 is Pull-up output, no need to set
// Set PA5 as high speed mode
movs r0, #0x800
ldr r1, =GPIOA_OSPEEDR
strh r0, [r1]
ldr r1, =GPIOA_ODR
L:
movs r0, #(1<<5)
strh r0, [r1]
B L
常用指令 §
mov destination, source
mov r1, r2 // r1=r2, write the value in r2 to r1
mov r3, #23 // write value 23 to r3
ldr destination, source
ldr r1, =0xE0000000 // r1=0xE0000000, 將這個地址存到 暫存器r1
ldr r1, 0xE0000000 // 將記憶體中地址為0xE0000000的內容載入到 暫存器r1
ldr r1, [r0] // 將 暫存器r0 中的數所指定的記憶體地址的內容傳送到 暫存器r1
str source, destination
str r1, [r0] // 將 暫存器r1 的內容傳輸到 暫存器r0 中的數所指定的記憶體中
通常先用 ldr 將某個記憶體地址存到暫存器中, 再用str將某一個存在暫存器中的值存到記憶體中
movs r0, #0x800 // store a number(2048) to register r0
ldr r1, =GPIOA_OSPEEDR // store an address to r1
strh r0, [r1] // store the number in r0 to the address in r1