Arm 写入内存映射GPIO寄存器不会写入任何内容
在我的NUCLEO-H7A3ZI-Q上,我试图使用assembly使端口PB7处的LED亮起。根据STM32H7A3参考手册,端口B映射到地址Arm 写入内存映射GPIO寄存器不会写入任何内容,arm,stm32,gpio,Arm,Stm32,Gpio,在我的NUCLEO-H7A3ZI-Q上,我试图使用assembly使端口PB7处的LED亮起。根据STM32H7A3参考手册,端口B映射到地址0x50820400(第129页): 以下代码应将值0xc0写入地址0x50820400,指向GPIOB\u MODER的第一个字节,即rw: .section .text reset_handler: nop ldr r0, GPIO_ADDR mov r1, #0xc0 strb r1, [r0] done:
0x50820400
(第129页):
以下代码应将值0xc0
写入地址0x50820400
,指向GPIOB\u MODER
的第一个字节,即rw
:
.section .text
reset_handler:
nop
ldr r0, GPIO_ADDR
mov r1, #0xc0
strb r1, [r0]
done:
b done
.align 2
GPIO_ADDR: .word 0x58020400
.section .vectors
.word 0x20001ffe @ Initial SP
.word reset_handler @ Entrypoint
然而,这是行不通的。在strb
指令前后使用STM32CubeProgrammer查看内存,在0x58020400
写入指令前后给出相同的值0xFFFFFEBF
值
0xFFFFFEBF
是GPIOB_MODER
的重置值,这是有意义的。但是,内存映射区域中的所有其他值也都是0xFFFFFEBF
,而文档说明了一些其他值的重置值不应是0xFFFFFEBF
。这可能意味着我错过了某些类型的初始化步骤,但我在手册中找不到任何说明需要这样做的内容,但手册有3000页,因此我可能错过了一些内容:)您需要先启用GPIO外围时钟。RCC寄存器用于此目的
我宁愿不鼓励您使用汇编程序学习STM32 uCs。这是一条无路可走的路
从编程手册和参考手册开始,其中描述了ARM uCs低级别编程。时钟、外围设备等1)启用gpiob,查看RCC部分2)修改moder。出于我想我知道原因的原因,当外围设备被禁用和/或逻辑吐回重置值时,它们允许读取moder。但是要写外设,首先需要启用时钟。在微控制器中,非常典型的情况是,在使用外设之前,必须启用每个外设,因为知道3000页会变得更小。有些供应商会详细说明,有些供应商不会,并且假设您知道。在当前的文档搜索中,这是一个32位寄存器,使用str而不是strb。注意在存储到rcc寄存器和存储到moder之间有几个时钟/指令,因为可能存在竞争条件,这取决于芯片,写入无法工作。大多数人使用读-修改-写(读、零位、设置位、写),这超过了使能通过的足够时钟。“每个I/O端口位都可以自由编程,但I/O端口寄存器必须以32位字、半字或字节访问。”如果需要,请使用strb。一般来说,对于控制和状态寄存器,不要假设您可以将它们拆分并访问部分,除非另有说明,否则假设您必须完全匹配宽度。