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

使用GCC编译STM32汇编代码报错:注释未被正确识别

STM32 Blue Pill LED闪烁汇编代码编译错误修复

错误1:注释被识别为非法指令

ARM GNU汇编器(gas)在.syntax unified模式下,默认使用@作为注释起始符,而非;。你代码中用;开头的注释被汇编器误判为指令,因此抛出“bad instruction”错误。

解决方法:将所有注释前的;替换为@。

错误2:invalid constant (4c4b40) after fixup

mov r1, #5000000指令不符合Cortex-M3的指令规则:mov指令仅支持加载可通过8位立即数循环右移偶数位得到的常量,而5000000(十六进制0x4C4B40)无法通过这种方式生成,汇编器无法生成合法指令,因此报错。

解决方法:改用ldr r1, =5000000,让汇编器自动将常量存入程序常量池,再通过内存加载到寄存器中。

修复后的完整代码

.section .text
        .syntax unified
        .thumb

start:
        ldr r0, =0x4800080C  @ GPIOC_ODR寄存器的正确地址(STM32F103)
loop:
        ldr r1, [r0]         @ 读取GPIOC_ODR寄存器的值到R1
        eor r1, r1, #0x2000  @ 翻转R1的第13位(对应PC13引脚,板载LED)
        str r1, [r0]         @ 将修改后的值写回GPIOC_ODR
        ldr r1, =5000000     @ 加载延时值到R1
delay:
        sub r1, r1, #1       @ R1自减1
        cmp r1, #0           @ 比较R1和0
        bne delay            @ 如果不为0,继续延时循环
        b loop               @ 回到主循环重复执行

额外注意:

  1. 你之前写的GPIOC_ODR地址0x48000401完全错误,STM32F103系列的GPIOC基地址是0x48000800,ODR寄存器偏移量为0x0C,正确地址是0x4800080C,这个错误会导致LED无法正常闪烁,已修正。
  2. 板载LED连接在PC13引脚,对应ODR寄存器第13位(0x2000),这部分代码是正确的。

编译与烧录

保持原编译命令不变,若要生成可烧录文件,需执行以下步骤:

  1. 编译生成ELF文件:
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb main.s -o main.elf
  1. 转换为可烧录的BIN文件:
arm-none-eabi-objcopy -O binary main.elf main.bin
  1. 使用烧录工具将main.bin写入STM32 Blue Pill开发板。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:01:12