如何用汇编点亮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
代码细节解释
时钟使能:
STM32的所有外设默认处于时钟关闭状态,必须通过RCC_AHB1ENR开启对应GPIO的时钟。这里第0位对应GPIOA,所以用ORR R1, R1, #0x01来开启。引脚模式配置:
GPIO_MODR的每两位对应一个引脚,PA5对应位10和11。我们先用BIC指令清除这两位的原有值,再用ORR设置为01(通用输出模式),避免干扰其他引脚的配置。点亮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
相关产品推荐
相关产品推荐

