上一贴:跟着套件光盘入门LM3S811
https://bbs.eeworld.com.cn/thread-290441-1-1.html
刚拿到手一看,以为白色那块是LCD来的,细看一眼,原来就是一块塑料板导光板而已。之前看到带OLED Display的LM3S811,原来是另有其板。后来看了光盘里的例程,也是从带OLED Display的Kits例程里修改出来的。
EK-LM3S811自带了Key、LED和FT2232D虚拟出来的串口,所以说此评估板更类似于最小系统板。原理图可翻阅上贴附件:EK-LM3S811套件光盘\Hardware\WPI-EK-LM3S811_SCH_V011_0712.pdf
FT2232D虚拟出来的串口是已经跟LM3S811的uart0连接的,所以,基于uart0的程序都可以直接用这个Stellaris virtual serial COM port。
端口号修改可借鉴下帖:
https://bbs.eeworld.com.cn/viewthread.php?tid=237823&page=1&fromuid=194149#pid827620
下面说说我建立工程的步骤:
前提:把TI给的StellarisWare_for_EK-LM3S811解压出来发在一起,我这里放在G:\Documents\LM3S811。
1、新建一个工程,Device是Luminary Micro的LM3S811。
2、Project -> Option for Target……或者按快捷键Alt+F7。在Target标签里,Xtal输入板子对应的晶振6MHz,这个设置错了的话,可能会导致程序下载不了。
3、Output标签里,Create Hex File根据需要勾选。Select Folder for Object根据需要选择。
4、C/C++标签里,在Include Paths里添加..\;这里有解释一下为什么要添加这个点+点+斜杠。
在我们程序里,有这么一段头文件包含:
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/uart.h"
inc/和driverlib/表示那两个是文件夹。因为使用的双引号,而不是尖括号,编译器一般会默认在工程目录下的inc和driverlib文件夹里寻找那4个.h头文件。这里是G:\Documents\LM3S811\uart0:
我们可以看到,该文件夹下面并没有inc、driverlib这两个放置hw_types.h、hw_memmap.h、gpio.h、uart.h头文件的文件夹,如果没有这个..\,编译器在工程路径下找不到需要的头文件,就会报错。但是增加了这个..\之后,表示include的路径包含了上一级目录,也就是下图的路径:
这样编译器就会在G:\Documents\LM3S811目录下找inc和driverlib文件夹,并到里面搜寻需要的hw_types.h、hw_memmap.h、gpio.h、uart.h四个头文件。找到了,就不会报错了。所以,如果你新建工程的时候看到提示没有定义undefined等错误,请先查看文件包含是否正确。
顺便说一下,如果头文件改成下面,编译器也是可以找到需要的头文件的。(注:左斜杠\和右斜杠/,在编译器MDK里作用是一样的)
#include "..\inc/hw_types.h"
#include "..\inc/hw_memmap.h"
#include "..\driverlib/gpio.h"
#include "..\driverlib/uart.h"
..\inc/表示在工程路径的上一级目录里的inc文件夹,应包含hw_types.h和hw_memmap.h。但很明显,通过修改include paths更为方便。
5、在Debug标签和Utilities标签里选择Stellaris ICDI。
经过以上步骤,Option基本设置完毕。
6、新建uart0.c并add到工程里,编译一下,会发现有好多undefined symbol,这是编译器在说那些函数没有定义到。这是因为我们用到了GPIOPinTypeGPIOInput等很多函数,虽然在.h文件有定义了,但是并没有找到函数原型。这时有两种方法可以解决。
一是我们常用的.c方法,就是跟刚刚uart0.c一样,把用到的.c源文件add进来,很明显,编译是通过的:
二是使用.lib文件的方法。
在G:\Documents\LM3S811\driverlib下面,我们可以看到,里面有个MDK工程文件driverlib.uvproj,打开后,在option里,我们可以看到,它编译产生的是Create Library。
在G:\Documents\LM3S811\driverlib\rvmdk下面,我们可以看到编译产生了driverlib.lib这个文件。而且翻遍它所有的C函数,居然都没有main函数。
其实这是常见的一种方法,就是引用库文件的方法。
库文件实际上是跟往常一样新建一个工程,在option里选择了Create Library,这种工程是不能有main函数的,编译后,MDK会把所有的函数编译封装在.lib文件里,以后我们需要用到那些C函数的时候,只需要把lib文件add到工程里,就可以直接调用。如图所示:
使用lib文件的好处是,因为lib是已经编译过的文件,所以不像使用c文件那样费事,使用c文件每次都重新编译,产生.o等很多中间文件。因而lib文件会大大减少工程编译时间。
另外,使用lib文件,不需要提供源码c文件给别人,起到了一定的保密效果。只需要把lib及函数的说明和使用方法交给用户,用户直接调用即可。
注意:.lib文件并没有包含宏定义等信息,所以,和.lib配套的.h文件是不能省掉的。
搞定了.h和.lib,新建自己的工程便是easy job啦。剩下开发LM3S的工作难点便是面对纷繁API函数,怎么去使用了。
附件:
LM3S811uart0附件.rar
(2.28 MB, 下载次数: 904)
uart0的MDK完整工程文件(含针对此板验证可行的Jtag防锁死程序)
FT2232配置软件MProg3.0_Setup.exe
FT2232中文资料.pdf