本帖最后由 冒汗的心情 于 2016-3-9 09:14 编辑
CC26xx开发环境——搭建教程
教程下载
1 概述 CC26xx具有低功耗、高性能、统一的芯片架构、支持多种无线标准,用户只需要应用不同的协议栈,就可以在同样的硬件资源下,实现不同的无线通讯连接。 CC2620支持RF4CE。 CC2630支持Zigbee、6LowPan、802.15.4. CC2640支持BLE和私有无线协议 CC2650支持以上所有。 为了对CC26xx进行学习,对不同的IDE开发环境进行了尝试,并编译下载最简单的测试程序。 由于 CC26xx主要面向2.4GHz的无线通讯连接应用,必须采用协议栈,从而建议采用 ti官方支持的开发环境即IAR和CCS。其他开发环境比如KEIL和GCC则不具备无线通讯协议栈的开发,只能把CC26xx当做普通的 单片机来开发。
2 CC26xxWare与EmuPack安装
要使用CC26xx开发,首先要安装CC26xxWare,无线协议栈(BLE、Zigbee等)都自带包含了CC26xxWare,同时TI网站也提供了单独的最新的CC26xxWare的安装包,该版本一般都比无线协议栈自带包含的版本要高,因此可以直接从TI官网下载CC26xxWare,并安装。安装过程略过。 EmuPack是XDS调试器的驱动、调试接口dll、GDB调试器中间服务器等功能。在TI网站下载后安装即可。建议安装到CCS的目录下。或者直接用CCS自带的EmuPack。
3 IAR
IAR以编译快、效率高、生成代码少、优化程度高以及开发环境应用广泛而著称。 3.1. IAR安装 IAR可以从官方网站下载评估版, www.iar.com,截至目前(2015-09-02),最新版的IAR for ARM是7.40.3,此版本开始支持TI的XDS系列调试器。下载安装后,可以通过“hexie”方式得到全功能版本。具体安装与“hexie”过程略过。 图 31 CC26xx开发环境IAR产品 3.2. 从零开始利用IAR搭建CC26xx开发项目 (1)在IAR新建一个工程 Menu->Project->Create New Project,在Tool Chain下拉框选择ARM,Project Template选择Empty project,最后点击OK,选择保存Project的文件夹,命名为test_iar。 图 32 IAR新建项目 (2)然后选择File->Save Workspace保存工作空间。 (3)在Tool->Configure Custom Argument Variables中,点击Add Variable,增加名为CC26XXWARE的工作空间变量,并且变量值为CC26xxWare的安装路径。 图 33 IAR增加CC26XXWARE的工作空间变量 (4)项目设置 在左侧的工作空间的项目名上右键单击“Options”,选择Target为芯片CC2650F128。 在C/C++ Compiler的Preprocessor的include directories中增加$CC26XXWARE$,即把之前增加的工作空间变量代表的CC26xxWare安装目录加入到编译器的头文件包含目录中。在Linker中加入$CC26XXWARE$driverlibbiniardriverlib.lib。 设置调试为对应的调试器,并且下载选项、调试器设置选项等如下: 图 34 IAR设置工程选项 图 35 IAR设置工程选项 在Project上右键,点击Add->Add File,把CC26xxWare的ccfg.c和startup_iar.c增加到项目中。 然后新建一个main.c的文件,输入最简单的main函数代码: void main(void) { return ; } 加入工程后,编译后,下载 图 36 IAR下载后调试
4 KEIL(TO DEBUG)
Keil是老牌的嵌入式编译器,现在被ARM公司收购后,针对ARM编译器做了许多优化。应用广泛。 4.1. Keil安装 从www.keil.com网站上下载Keil软件安装,目前(2015-09-02)最新版本是V5.16a,通过“hexie”方式获得全功能版本。 现在Keil通过Pack方式,将各厂家芯片的支持包如头文件、库、以及各类中间件比如GUI、CMSIS,可以独立于Keil主程序安装,降低了软件安装后占用的空间大小和痈肿度。TI的CC26xx系列芯片由于协议栈不采用Keil编译,因此较少使用Keil进行开发,不过TI还是自己提供了Keil的Pack,但是只有寄存器定义的头文件、连接设置文件、启动文件、调试用的寄存器定义文件等。可从以下地址下载Pack Keil无法利用无线通讯协议栈,并且只能采用Jlink下载,因此Keil只能结合CC26xxWare把CC26xx当做普通单片机来使用。 4.2. 从零开始利用KEIL搭建CC26xx开发项目 (1)在Keil软件中,选择Project->New uVision Project,选择项目保存的目录,并输入项目名称,本实验项目名称为“test_keil”。在弹出的选择运行环境(即软件中间件)窗口中不需要选,直接点击OK即可。 图 41 Keil新建项目 (2)在左侧的工作空间中右键选择项目的Target1,点击Options,进入Keil项目设置。 主要需要设置的是C/C++的头文件、C99模式、 Linker的Scatter File,库文件。 调试的调试器选择与选项、以及Flash下载。 如下图: 图 42 Keil项目设置 (3)在Source Group 1增加CC26xxWare目录下的Startup_keil.s和ccfg.c,同时可重命名Source Group 1为Startup。 增加App的Group,然后新建一个main.c的文件,输入最简单的main函数代码: void main(void) { return ; } 图 43 Keil项目源文件结构 加入工程后,编译后,利用Jlink下载(暂未实现,TODO)
5 GCC(TO DEBUG)
Gcc为开源编译器,已经成为编译器的开源标准,已经移植到ARM架构。GCC采用命令行进行编译,可以使用Makefile进行批量处理。 5.1. GCC安装 Launchpad.net网站提供编译好的arm-none-eabi-gcc编译器,可以直接下载后安装。然后将bin目录加入PATH环境变量,同时可增加一个mingw32-make的工具,也同样将mingw32-make的目录加入PATH环境变量中,即可使用Makefile进行条件比较、批量编译等工作。 5.2. 从零开始利用GCC搭建CC26xx开发的Makefile TI的应用笔记及其对应的例程提供了BlinkLed的GCC例程,采用Eclipse开发。本节主要借鉴其中的Makfile和makedefs,来进行开发。 Makedefs类似于Makefile的头文件,其中定义了一些常量比如CC编译器名称、不同操作系统平台的编译命令等,本节对TI的例程中的makedefs进行了稍微修改,把Makefile里面的CC26XXWARE加入到makedefs里面,从而所有的Makefile都能引用同一个目录。 Makedefs文件如下: # # Define Variables # CC = arm-none-eabi-gcc LD = arm-none-eabi-ld AR = arm-none-eabi-ar OBJCOPY = arm-none-eabi-objcopy CHIP_ID = CC2650F128RGZ LIBS = CC26xxWare_Lib/Output/CC26xxWare_Lib_GCC.a # Directory of CC26xxware CC26XXWARE_DIR = E:/software/ti/simplelink/cc26xxware_2_21_03_15980 # # Uncomment the following lines, if linux cannot find arm-none-eabi-gcc # Update the COMPILERPATH variable to your installation of GNU Tools. # #COMPILERPATH = /home/ti/gcc-arm-none-eabi-x_x-xxxxxx/bin #CC = $(COMPILERPATH)/arm-none-eabi-gcc #OBJCOPY = $(COMPILERPATH)/arm-none-eabi-objcopy # # Do not alter anything below this line # ifeq ("$(SHELL)","sh.exe") #Specify variables for windows RMDIR = rmdir /S /Q RM = del /F /Q SLASH = \ else #Specify variables for linux RMDIR = rm -f -r RM = rm -f SLASH = / endif Makefile文件如下,定义了生成文件与目标文件、目标文件与源文件的依赖关系,以及头文件目录、编译器选项、连接器选项、清理项目的步骤等。其中SOURCE_FILES定义了需要的源文件,包括startup_gcc.c, ccfg.c, main.c include ../../makedefs #Paths where source files are located vpath %.c $(CC26XXWARE_DIR)/driverlib %.c $(CC26XXWARE_DIR)/startup_files %.c ../src # # Define variables # PROJECT = CC26xxWare_chipinfo # Directory to place executable files OUT_DIR = ..$(SLASH)Output # Diretory to place object files OBJ_DIR = obj # Start-up files SOURCE_FILES += startup_gcc.c ccfg.c # Add other source files needed for project SOURCE_FILES += main.c # Add all driverlib files to the source file array SOURCE_FILES += $(notdir $(wildcard $(CC26XXWARE_DIR)/driverlib/*.c)) # Linker file LINKERFILE = $(CC26XXWARE_DIR)/linker_files/cc26x0f128.lds # Include directories INCLUDES = -I$(CC26XXWARE_DIR) # Options for compiler and linker OBJGENOPTIONS = -Dgcc=1 -D$(CHIP_ID)=1 -O0 -mcpu=cortex-m3 -gdwarf-2 -mthumb -fomit-frame-pointer -Wall -Wstrict-prototypes OUTGENOPTIONS = -mcpu=cortex-m3 -nostartfiles -T $(LINKERFILE) -Wl,-Map=$(PROJECT).map,--cref,--no-warn-mismatch LIBGENOPTIONS = -r # List of object files made from the list of source file OBJECTFILES = $(patsubst %.c, $(OBJ_DIR)/%.o, $(SOURCE_FILES)) .PHONY : all all: $(OBJECTFILES) $(PROJECT).elf clean: -$(RM) $(PROJECT).map -$(RM) $(OUT_DIR)$(SLASH)$(PROJECT).a -$(RMDIR) $(OBJ_DIR) # Rule for creating object directory $(OBJ_DIR): @mkdir $@ # Rule for creating output directory $(OUT_DIR): @mkdir $@ # If any $(OBJECTFILES) must be built then $(OBJ_DIR) must be built first, but if $(OBJ_DIR) is out of date (or doesn't exist), # that does not force $(OBJECTFILES) to be built. $(OBJECTFILES): | $(OBJ_DIR) # If any output files must be built then $(OUT_DIR) must be built first, but if $(OUT_DIR) is out of date (or doesn't exist), # that does not force output files to be built. $(PROJECT).elf : | $(OUT_DIR) # Rule for building object files $(OBJ_DIR)/%.o : %.c $(CC) $(INCLUDES) $(OBJGENOPTIONS) -c $< -o $@ # Rules for building output files $(PROJECT).elf: $(CC) $(OUTGENOPTIONS) -o $(OUT_DIR)/$ @ $(OBJECTFILES)
|