STM32加载值到内存的问题
STM32 problem with loading value to memory
我正在尝试使用裸机汇编代码打开 STM32F103 blue pill 的 PB1 端口上的 led。
第一步我想在 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
您错误地将文字加载为从文字指向的地址加载。
值=rcc_apb2enr
表示ROM中的一个地址,它是程序的一部分,您在其中存储了寄存器的地址。您需要先加载它,然后从它指向的地址加载值。然后您可以写回相同的地址。
修改两条指令:
LDR R0, =rcc_apb2enr
...
... change the value of R0
...
STR R0, [rcc_apb2enr]
类似于:
LDR R0, =rcc_apb2enr
LDR R1, [R0]
...
...change the value of R1
...
STR R1, [R0]
(此外,您的 AND 指令正在将启用寄存器的先前内容清零 - 这可能不是您想要的。要启用某些内容,您只需要设置位即可。)
我正在尝试使用裸机汇编代码打开 STM32F103 blue pill 的 PB1 端口上的 led。 第一步我想在 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
您错误地将文字加载为从文字指向的地址加载。
值=rcc_apb2enr
表示ROM中的一个地址,它是程序的一部分,您在其中存储了寄存器的地址。您需要先加载它,然后从它指向的地址加载值。然后您可以写回相同的地址。
修改两条指令:
LDR R0, =rcc_apb2enr
...
... change the value of R0
...
STR R0, [rcc_apb2enr]
类似于:
LDR R0, =rcc_apb2enr
LDR R1, [R0]
...
...change the value of R1
...
STR R1, [R0]
(此外,您的 AND 指令正在将启用寄存器的先前内容清零 - 这可能不是您想要的。要启用某些内容,您只需要设置位即可。)