You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用汇编点亮STM32的LED2?求GPIO_MODR等寄存器使用示例

如何用汇编语言点亮STM32开发板的LED2?

核心原理

要点亮LED,你需要操作三个关键寄存器:

  • RCC_AHB1ENR:开启GPIO外设的时钟(STM32外设默认时钟关闭,必须先开启才能操作寄存器)
  • GPIO_MODR:将LED对应的GPIO引脚配置为通用输出模式
  • GPIO_BSSR:安全地置位/复位引脚电平(相比直接写GPIO_ODR,不会意外修改其他引脚的状态)

汇编代码示例(以STM32F4xx系列为例,LED2接PA5)

假设你用的是NUCLEO-F401RE这类开发板,LED2默认接在PA5引脚,下面是完整的汇编代码:

; STM32F4xx 汇编代码:点亮LED2(PA5)
; 寄存器地址定义(参考STM32F4xx参考手册)
RCC_AHB1ENR  EQU 0x40023830  ; RCC AHB1外设时钟使能寄存器
GPIOA_MODR   EQU 0x40020000  ; GPIOA模式寄存器
GPIOA_BSSR   EQU 0x40020018  ; GPIOA位设置/复位寄存器

    AREA    |.text|, CODE, READONLY
    ENTRY
    EXPORT  __main

__main
    ; 步骤1:使能GPIOA的AHB1时钟
    LDR     R0, =RCC_AHB1ENR
    LDR     R1, [R0]
    ORR     R1, R1, #0x01      ; 置位第0位,开启GPIOA时钟
    STR     R1, [R0]

    ; 步骤2:配置PA5为通用推挽输出模式
    LDR     R0, =GPIOA_MODR
    LDR     R1, [R0]
    BIC     R1, R1, #(0x03 << 10)  ; 先清除PA5对应的两位(位10-11)
    ORR     R1, R1, #(0x01 << 10)  ; 设置为通用输出模式(01)
    STR     R1, [R0]

    ; 步骤3:点亮LED2——置位PA5(输出高电平)
    LDR     R0, =GPIOA_BSSR
    MOV     R1, #(0x01 << 5)   ; 位5对应PA5,写1置位引脚
    STR     R1, [R0]

    ; 死循环保持LED点亮状态
loop
    B       loop

    END

代码细节解释

  1. 时钟使能:
    STM32的所有外设默认处于时钟关闭状态,必须通过RCC_AHB1ENR开启对应GPIO的时钟。这里第0位对应GPIOA,所以用ORR R1, R1, #0x01来开启。

  2. 引脚模式配置:
    GPIO_MODR的每两位对应一个引脚,PA5对应位10和11。我们先用BIC指令清除这两位的原有值,再用ORR设置为01(通用输出模式),避免干扰其他引脚的配置。

  3. 点亮LED:
    GPIO_BSSR是个很实用的寄存器:低16位写1会对应引脚置位(输出高),高16位写1会对应引脚复位(输出低)。如果你的LED是低电平点亮,只需要把MOV R1, #(0x01 << 5)改成MOV R1, #(0x01 << 21)(高16位的第5位对应PA5复位)即可。

适配其他开发板

如果你的LED2接在其他引脚(比如GPIOB的Pin13),只需要修改三处:

  • 时钟使能位:GPIOB对应RCC_AHB1ENR的第1位,所以改成ORR R1, R1, #0x02
  • GPIO寄存器地址:换成GPIOB_MODR和GPIOB_BSSR的地址
  • 引脚对应位:比如PB13对应MODR的26-27位,BSSR的13位(置位)或29位(复位)

内容的提问来源于stack exchange,提问作者Dello155

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:42:47