使用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 @ 回到主循环重复执行
额外注意:
- 你之前写的GPIOC_ODR地址
0x48000401完全错误,STM32F103系列的GPIOC基地址是0x48000800,ODR寄存器偏移量为0x0C,正确地址是0x4800080C,这个错误会导致LED无法正常闪烁,已修正。- 板载LED连接在PC13引脚,对应ODR寄存器第13位(
0x2000),这部分代码是正确的。
编译与烧录
保持原编译命令不变,若要生成可烧录文件,需执行以下步骤:
- 编译生成ELF文件:
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb main.s -o main.elf
- 转换为可烧录的BIN文件:
arm-none-eabi-objcopy -O binary main.elf main.bin
- 使用烧录工具将
main.bin写入STM32 Blue Pill开发板。
内容的提问来源于stack exchange,提问作者GlaweCircuit
相关产品推荐
相关产品推荐

