【发布时间】:2022-01-18 18:49:12
【问题描述】:
我正在尝试使用裸机汇编代码打开 STM32F103 蓝色药丸的 PB1 端口。 第一步,我想在 reset_handler 子程序中初始化堆栈指针,然后执行 LED 相关代码。在 APB2_ENR 寄存器上使能 RCC,分别配置 GPIO_CRL 和 GPIO_ODR 寄存器。代码如下,但似乎不起作用。请指教有什么错误。
stack_size = 0x400
stack_start = 0x20000000+stack_size
gpiob_base = 0x40010C00
rcc_base = 0x40021000
rcc_apb2enr = rcc_base+0x18
gpio_crl = gpiob_base
gpiob_odr = gpiob_base+0x0C
.syntax unified
.cpu cortex-m3
.thumb
.global main
.global vtable
main:
; Enable RCC Clock on ABP2
LDR R0, =rcc_apb2enr
AND R0, #0x00000000
ORR R0, #0x4
STR R0, [rcc_apb2enr]
; Configure GPIO_CRL
LDR R0, #0x44444444 ; Registry reset value
STR R0, [gpio_crl] ; Reset register
LDR R0, #0x2
LDR R1, =gpio_crl ; Load register
ORR R1, R0 ; set bit 2 - on
STR R1, [gpio_crl]
; Configure GPIOB_ODR
LDR R0, #0x0 ; set reset value
STR R0, [gpiob_odr] ; reset register
LDR R0, #0x2
LDR R1, =gpiob_odr
ORR R1, R0
STR R1, [gpiob_odr]
vtable:
.word stack_start
.word reset_handler
reset_handler:
LDR R0, =stack_start
MOV SP, R0
【问题讨论】:
-
有什么症状?
-
第一个 STR R0,[rcc_apb2enr] 作为错误抛出。我想将 R0 值存储到我在文件顶部的汇编指令中定义的 rcc_apb2enr 的地址
-
哦,对了,STR immediate 只需要一个 12 位的偏移量,所以这只有在
rcc_apb2enr位于程序计数器的 4 KB 范围内时才有效,显然不是。但是你已经在R0和LDR R0, =rcc_apb2enr中获得了地址rcc_apb2enr,然后显然你把它扔掉了,而是以一种复杂的方式加载值4?我想你只是想要LDR R0, =rcc_apb2enr ; MOV R1, #4 ; STR R1, [R0]。 -
(另外,你标记了这个gnu-assembler,但我不认为GAS 使用
;作为它的评论字符?我不得不将它们全部更改为//。) -
地址和值之间似乎还有其他一些混淆。例如,在“配置 GPIO_CRL”中,您似乎试图用自己的地址(加 2)存储
gpio_crl寄存器?这似乎不对。
标签: assembly stm32 gnu-assembler bare-metal stm32f1