Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arm 写入内存映射GPIO寄存器不会写入任何内容_Arm_Stm32_Gpio - Fatal编程技术网

Arm 写入内存映射GPIO寄存器不会写入任何内容

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:

在我的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:
    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。一般来说,对于控制和状态寄存器,不要假设您可以将它们拆分并访问部分,除非另有说明,否则假设您必须完全匹配宽度。