MSP430G2-LaunchPad简明教程03[创建一个MSP430工程]
2020-06-16 来源:eefocus
在本章节中笔者将向大家介绍如何基于Makefile创建一个MSP430开发工程。
代码编译过程
由于本教程没有采用常见的IDE的途径进行代码编写调试,而是由开发者自己编写一个Makefile实现项目文件管理的功能,因此需要对MSP430的编译过程有一定的了解。
作为一个标准的GNU C交叉编译器,编译的过程同样遵循【.c文件】--编译--【.o文件】--链接--【可执行的二进制文件】。在MSP430单片机上的可执行文件一般为elf格式,感兴趣的同学可以自行了解该文件格式,其功能作用与51单片机上常见的hex格式文件和飞思卡尔单片机上常见的bin文件类似。
由.c格式的源码文件到.o格式的目标过程称作链接,在这一个过程中需要借助mspgcc(即上一章节中env.sh导出的$CC)完成。在此提供一个简单的示例。新建一个main.c文件,写入如下内容:
int main(void)
{
return 0;
}
接着在自身的终端(Windows平台下即Git Bash或Mingw)上敲入如下编译命令:
Admin@RDOFWLHXI6YEJMO /cygdrive/f/WORKSPACE/msp430
$ $CC -mmcu=msp430g2553 -mhwmult=none -std=gnu99 -c main.c -o main.o
执行上述命令若无回显,表明编译成功,此时编译器将在当前目录下生成一个.o文件。在编译阶段所使用的编译参数与我们平常使用gcc编译器编译可执行文件并没有什么区别,仅增加了几个msp430特有的Machine Option(即以-m开头的编译器选项),详情可参考GCC官方手册中的相关说明,在此做简要的解释:
编译选项 描述
--mmcu=msp430g2553 指定msp430的型号。指定型号后编译器将在编译阶段隐式添加相关的型号宏,从而使得开发者可直接使用 -mhwmult=none 表明无硬件乘法器 -std=gnu99 指定采用的C语言语法标准版本 -c 仅进行编译,不进行链接 -o [FILENAME] 指定输出文件名称为FILENAME 完成代码编译后还要将生成的中间目标文件链接成一个可执行文件,完整的构建过程才算完成。mspgcc工具链对此的处理流程与其他gcc工具链没有任何区别,也是通过gcc编译器调用链接器ld完成(Q:为什么不直接使用ld进行链接?A:使用gcc编译的时候往往需要链接某些libc、libgcc相关的文件,若直接使用ld进行链接需要手动添加大量编译参数,十分繁琐)。读者可在上一命令行的基础上尝试执行如下命令行 Admin@RDOFWLHXI6YEJMO /cygdrive/f/WORKSPACE/msp430 $ $CC -mmcu=msp430g2553 $LDFLAGS main.o -o main.elf 在链接阶段的编译参数相比编译少了许多,但同样需要带上--mmcu=msp430g2553这个选项,否则编译器无法确定使用哪个链接脚本文件进行链接。所谓的链接脚本是一个用于指定链接规则的脚本文件,链接器的工作实际上就是执行该链接脚本;链接脚本一般由工具链自带,对于MSP430来说一般不需要开发者对其进行修改;链接脚本在嵌入式领域的主要作用为指定CPU/MCU的存储空间分布。mspgcc工具链的链接脚本文件均放置于include目录下,该路径并不在环境变量$PATH中,因此上一教程的env.sh导出了一个$LDFLAGS环境变量用于在链接阶段使用-L参数指定链接脚本的所在路径。链接阶段结束之后编译器将在当前目录下生成一个.elf文件即我们最终所需的可执行文件。 代码烧写 代码的烧写需要基于mspdebug这一工具实现,这一工具同样是在命令行环境下使用的,其基本的命令格式为 mspdebug [options] 其中的 以将上文编译好的main.elf文件烧录至小红板为例,代码烧写的基本命令为(其中的$MSPDEBUG变量也是由上篇教程的env.sh脚本封装的变量) Admin@RDOFWLHXI6YEJMO /cygdrive/f/WORKSPACE/msp430 $ $MSPDEBUG tilib 'prog main.elf' 该命令亦可分步执行,即先进入mspdebug自身的控制台界面,再输入下载指令 Weilun@RDOFWLHXI6YEJMO /cygdrive/f/WORKSPACE/msp430 $ $MSPDEBUG tilib MSPDebug version 0.22 - debugging tool for MSP430 MCUs Copyright (C) 2009-2013 Daniel Beer This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. MSP430_GetNumberOfUsbIfs MSP430_GetNameOfUsbIf Found FET: HID0268:COM3 MSP430_Initialize: HID0268:COM3 Firmware version is 20409001 MSP430_VCC: 3000 mV MSP430_OpenDevice MSP430_GetFoundDevice Device: MSP430G2xx3 (id = 0x00de) 2 breakpoints available MSP430_EEM_Init Chip ID data: 25 53 Available commands: = erase isearch power save_raw simio alias exit load prog set step break fill load_raw read setbreak sym cgraph gdb md regs setwatch verify delbreak help mw reset setwatch_r verify_raw dis hexout opt run setwatch_w Available options: color gdb_loop enable_bsl_access gdbc_xfer_size enable_locked_flash_access iradix fet_block_size quiet gdb_default_port Type 'help Use the 'opt' command ('help opt') to set options. Press Ctrl+D to quit. (mspdebug) prog main.elf prog main.elf Erasing... Programming... Writing 2 bytes at fffe [section: __reset_vector]... Writing 4 bytes at c000 [section: .rodata2]... Writing 22 bytes at c004 [section: .text]... Done, 28 bytes total 从上文打印的输入日志中还可以看到mspdebug工具提供的其他控制台命令,例如break/delbreak(增删断点)、gdb(创建一个gdb server)、reset(复位)等。 编写一个简单的Makefile 有了上个章节的基础,我们就可以自己动手编写一个Makefile。但可能有不少读者朋友并不喜欢Makefile的语法或自己手动书写Makefile,甚至完全没接触过Makefile,本教程在此提供一个精简的Makefile模板可直接使用(使用限制:源码、中间文件、最终目标文件均在同一目录下,即flat型目录结构),但还是建议大家能够书写一个属于自己的Makefile。本教程在此不会对Makefile的语法作展开讲解,但Makefile中均配以重要的注释供读者理解,该示例Makefile的主体思路为封装编译参数->指定编译依赖规则(这一过程中使用了模式匹配以应对多个.c文件生成一个最终目标文件的场景;此外还引入了.d依赖文件完善依赖规则)->添加非编译操作的伪目标。 # 配置编译工具链 CROSS_COMPILE ?= msp430-elf- CC ?= $(CROSS_COMPILE)gcc MSPDEBUG ?= mspdebug # 配置编译参数 # 定义目标MCU型号与调试驱动 MCU := msp430g2553 DEBUG_DRIVER := tilib # CFLAGS为编译阶段参数 # @note: 此处必须加上CFLAGS变量添加由env.sh导出的编译参数,否则可能会出现 # 头文件找不到的报错(下方的LDFLAGS同理) CFLAGS := -mmcu=$(MCU) -mhwmult=none -MMD -std=gnu99 $(CFLAGS) -c # LDFLAGS为链接阶段参数,将影响编译器调用链接器的具体方式 LDFLAGS := -mmcu=$(MCU) $(LDFLAGS) # 定义目标文件名称 TARGET := main ELF := $(TARGET).elf SRCS := $(wildcard *.c) DEPS := $(SRCS:.c=.d) OBJS := $(SRCS:.c=.o) # 定义all目标,最终需要生成一个elf格式的二进制文件 all: $(ELF) # .elf文件由.o文件链接生成 $(ELF): $(OBJS) $(CC) $(LDFLAGS) $^ -o $@ # .o文件由.c文件编译生成 %.o: %.c $(CC) $(CFLAGS) $< -o $@ .PHONY: clean flash mostlyclean # 清除中间文件与目标文件 clean: rm -f *.elf *.o # 烧写程序 flash: $(MSPDEBUG) $(DEBUG_DRIVER) --force-reset 'prog $(ELF)' # 在clean操作的基础上清除.d文件 mostlyclean: rm -f *.d *.elf *.o # 引入.d依赖文件 -include $(DEPS) 该示例Makefile的基本用法为 命令 功能 make 编译并链接生成可执行文件 make clean 清除编译过程中产生的中间文件与最终目标文件 make mostlyclean 在make clean的基础上清除.d依赖文件 make flash 烧写最终目标文件至单片机
- 使用MSP430G2 LaunchPad开发板连接步进电机的方法
- MSP430G2:低功耗模式下的IO学习
- 在 linux 上 对 MSP430G2 系列进行 debug
- MSP430G2转换结果数据类型
- MSP430G2-LaunchPad简明教程02
- 使用MSP430G2 LaunchPad开发板连接步进电机的方法
- 使用MSP430G2 LaunchPad开发板驱动伺服电机的方法
- 使用MSP430G2单片机的PWM模块控制LED指示灯的亮度
- 使用MSP430G2 LaunchPad开发板连接LCD液晶显示屏的方法
- 如何使用Energia快速开发常见的MSP430/432LaunchPad