如何通过命令行参数实现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
相关产品推荐
相关产品推荐

