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

如何通过命令行参数实现STM32汇编代码的GAS条件编译?

GAS实现STM32汇编代码的多波特率条件编译

1. 源文件中编写条件汇编逻辑

GNU汇编器(GAS)支持.ifdef/.ifndef或.ifeq/.ifneq这类条件伪指令,你可以通过命令行定义宏来切换波特率分支。以下是两种实现方式:

方式一:用开关宏控制分支

在你的汇编源文件(比如uart_setup.s)中,通过FAST_UART宏区分快速/慢速版本:

@ 假设你的STM32使用APB2时钟为72MHz(根据硬件实际配置调整)
@ USART波特率计算公式:USARTDIV = PCLK / (16 * 波特率)(OVER8=0时)

@ 配置USART波特率寄存器
LDR R0, =USART1_BRR  @ 替换为你的USART寄存器基址+BRR偏移

.ifdef FAST_UART
    @ 1.5Mbps波特率:USARTDIV = 72000000 / (16*1500000) = 3 → 0x0003
    LDR R1, =0x0003
.else
    @ 115200波特率:USARTDIV = 72000000 / (16*115200) = 39.0625 → 0x2710
    LDR R1, =0x2710
.endif

STR R1, [R0]  @ 写入波特率配置

方式二:直接传递波特率数值判断

如果需要更灵活的波特率配置,可以直接传递数值宏,用.ifeq判断:

LDR R0, =USART1_BRR

.ifeq ($(UART_BAUD),1500000)
    LDR R1, =0x0003
.elseif ($(UART_BAUD),115200)
    LDR R1, =0x2710
.else
    @ 默认波特率(可选)
    LDR R1, =0x2710
.endif

STR R1, [R0]

2. 命令行编译指令

GAS通过-D参数在编译时定义宏,生成对应版本的目标文件:

编译快速版(1.5Mbps)

# 方式一:定义FAST_UART宏
arm-none-eabi-as -D FAST_UART=1 -o fast_uart.o uart_setup.s

# 方式二:直接传递波特率数值
arm-none-eabi-as -D UART_BAUD=1500000 -o fast_uart.o uart_setup.s

编译慢速版(115200bps)

# 方式一:不定义FAST_UART,默认走慢速分支
arm-none-eabi-as -o slow_uart.o uart_setup.s

# 方式二:传递115200数值
arm-none-eabi-as -D UART_BAUD=115200 -o slow_uart.o uart_setup.s

链接生成可执行文件

编译完成后,用链接器生成最终的ELF文件(替换为你的链接脚本):

arm-none-eabi-ld -T stm32_link.ld fast_uart.o -o fast_uart.elf
arm-none-eabi-ld -T stm32_link.ld slow_uart.o -o slow_uart.elf

3. 可选:用Makefile简化编译流程

如果需要频繁编译两个版本,可以写一个Makefile自动化:

AS      = arm-none-eabi-as
LD      = arm-none-eabi-ld
LINKER_SCRIPT = stm32_link.ld
SRC     = uart_setup.s

all: fast slow

fast:
    $(AS) -D FAST_UART=1 -o fast_uart.o $(SRC)
    $(LD) -T $(LINKER_SCRIPT) fast_uart.o -o fast_uart.elf

slow:
    $(AS) -o slow_uart.o $(SRC)
    $(LD) -T $(LINKER_SCRIPT) slow_uart.o -o slow_uart.elf

clean:
    rm -f *.o *.elf

执行make即可同时生成两个版本,make fast或make slow单独编译对应版本。

注意事项

  • 务必根据你的STM32型号和时钟配置,重新计算USARTDIV的值(如果PCLK不是72MHz)。
  • 确认USART寄存器基址和BRR偏移地址与你的芯片手册一致(比如USART1的BRR地址是0x4001380C)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:56:31