TIVA TM4C123G LaunchPad学习过程
第一章开发工具
CCS开发环境是必不可少的,相关的资料比较多,这里不再介绍。在进行TIVA系列芯片学习的时候TIVA开发工具包是一定要安装的,里面集成几乎在开发过程中用到的所有函数库,相关下载安装的说明资料比较多,请自行查阅。好像现在最新的版本是2.1(在官网上有最新的下载)。不过现在很多的代码例程以1.0版本居多(也可能是我用的太少)。正常2.1版本兼容1.0,不过我就遇到过不兼容的案例,现在也没有找到原因(可能是经验不足)。
安装好开发环境CCS、开发工具包、及相应的驱动,再找一开发套件就可以学习了。
第二章开发工具包的应用
要想使用函数库,必须把包含这些函数库的相应开发工具包添加到工程文件中。添加方法:右键工程文件名→Properties→Build→ARMCompiler→IncludeOptions,在Adddirto#includesearchpath中添加你安装开发工具包,添加后相应的路径会出现在下方。例如:"C:\ti\TivaWare_C_Series-1.0",这个是1.0版本的工具包。
个人觉得这样就应该可以使用这个工具包中的函数库中的函数了,但是在实际应用中,出现了一些错误,需要再添加一个路径:右键工程文件名→Properties→ARMLinker→FileSearchPath,在Includelibraryfileorcommandfileasinput中添加链接"C:\ti\TivaWare_C_Series-1.0\driverlib\ccs\Debug\driverlib.lib"这个应该编译后的一类函数库。
不知是什么原因,请那位大虾有空科普下。
另外,还有一个问题:在添加这个链接后,如把源文件添加到工程中,对一些函数或变量会提示重复定义的错误。
(这方面的问题在后面有实例再说吧)
第三章时钟设置
在进行开发时,第一步要做的应该就是时钟设置了。关于时钟设置在相应芯片手册中有详细说明,我看一段时间,参数说明之后就是各种寄存器的配置,一个字“晕”,感觉这个东西作为查询手册用可能效果更好。
其实,关于时钟配置用一个API函数就可以配置了:SysCtlClockSet()。
这个函数在TIVA开发工具包中,路径:…...\driverlib\sysctl.c,打开后可以看到源代码。关于这个函数的说明,查看路径:…..\docs\SW-DRL-UG-1.0.pdf,(安装版本不同,文件名会有区别)。
这里举例说明这个函数的使用方法:
在使用这个函数之前要添加头文件:#include"driverlib/sysctl.h"
之后就可以直接调用这个函数了,调用方法如下:
SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ)
这里对其中的变量时行说明:
SYSCTL_SYSDIV_5:分频系统,这里表示5分频;
SYSCTL_USE_PLL:锁相环至400MHz;
SYSCTL_OSC_MAIN:外部主晶振输入;
SYSCTL_XTAL_16MHZ:外部晶振是16MHz(这个要与硬件电路匹配)。
这个函数定义结果,外部输入16MHz,经PLL至400MHz,再2分频(芯片自带)至200MHz,再5分频至40MHz。因此这个设置的结果为主频40MHz。
如想更改主频设置,只须修改相应的变量即可,关于各变量的写法与定义,可以查阅文件:SW-DRL-UG-1.0.pdf,里面有详细说明。以后有空再加几个例程吧,这样对理解会更有帮助,欢迎大家自主补充。
第四章GPIO设置
这里先说下GPIO设置的步骤:
1) 配置系统时钟(这个在第三章已经介绍);
2) 打开与此GPIO端口对应的端口时钟。
3) 将端口配置为数字输入输出的GPIO功能,而不是端口的其它复用功能
4) 配置GPIO端口驱动电流大小和上下拉电阻的模式
5) 设置管脚的输入输出方向。
6) 设置管脚输出是高电平还是低电平。
同样TIVA函数库为我们提供了相应的API函数,下面举例进行介绍。
在配置之前别忘记加头文件:
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
1) 首先配置系统时钟:
//Setupthesystemclocktorunat50MhzfromPLLwithcrystalreference
SysCtlClockSet(SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
2) 使能PORTF端口
//EnableandconfiguretheGPIOportfortheLEDoperation.
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
SysCtlPeripheralEnable这个函数在…...\driverlib\sysctl.c中,相关函数说明在…..\docs\SW-DRL-UG-1.0.pdf中。
变量SYSCTL_PERIPH_GPIOF定义在driverlib/sysctl.h中。
3)使PORTF为输出
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,RED_LED|BLUE_LED|GREEN_LED);
GPIOPinTypeGPIOOutput这个函数在…...\driverlib\gpio.c中,相关函数说明在…..\docs\SW-DRL-UG-1.0.pdf中。
4)下面是LED控制循环程序
//LoopForever
while(1)
{
// Turn on the Red LED
GPIOPinWrite(GPIO_PORTF_BASE,
RED_LED|BLUE_LED|GREEN_LED, RED_LED);
// Delay for a bit
SysCtlDelay(200000);
// Turn on the Blue LED
GPIOPinWrite(GPIO_PORTF_BASE,
RED_LED|BLUE_LED|GREEN_LED, BLUE_LED);
// Delay for a bit
SysCtlDelay(200000);
// Turn on the Green LED
GPIOPinWrite(GPIO_PORTF_BASE,
RED_LED|BLUE_LED|GREEN_LED, GREEN_LED);
// Delay for a bit
SysCtlDelay(200000);
}
GPIOPinWrite这个函数在…...\driverlib\gpio.c中,相关函数说明在…..\docs\SW-DRL-UG-1.0.pdf中。另外,关于这个函数,网站的视频课件说的也非常详细可以看一下,视频做得非常好,只是在线看网络不绘图,下载无数次,成功次数没有突破0.
SysCtlDelay这个函数在…...\driverlib\sysctl.c中,相关函数说明在…..\docs\SW-DRL-UG-1.0.pdf中。
这就是一个完整的GPIO配置,控制LED的程序。
注意事项:
1) 本程序用到了几个函数库,所以在起始时一定要添加这些函数库的头文件。
2) 要按第二章介绍,配置工程,即添加引用函路径和链接函数库,实例如下:
右键工程文件名→Properties→Build→ARMCompiler→IncludeOptions,在Adddirto#includesearchpath中添加你安装开发工具包,添加后相应的路径会出现在下方。例如:"C:\ti\TivaWare_C_Series-1.0",这个是1.0版本的工具包。
右键工程文件名→Properties→ARMLinker→FileSearchPath,在Includelibraryfileorcommandfileasinput中添加链接"C:\ti\TivaWare_C_Series-1.0\driverlib\ccs\Debug\driverlib.lib"。
***下面说下第二章提到的问题:
1)在第四章是利用已经编译好的库函数,直接调用,可以正确的运行程序。但是如想查看相应API函数源代码,你必须先知道这个函数在那个库,然后自主去打开(上面已经介绍相对应位置)。
如想直接查看,需要把相应的函数库添加到工程中,添加方法:
右键工程-----add files-----选择相应的源码文件
然后选择函数,按F3即可查看源代码。但是这样就出现了一个问题,在运行时会提示一堆错误,主要是重复定义错误。相应提示如下:(只是节选一部分,应该有代表性)
Description Resource Path Location Type
#10056 symbol "SysCtlADCSpeedGet" redefined: first defined in "./sysctl.obj"; redefined in "C:\ti\TivaWare_C_Series-1.0\driverlib\ccs\Debug\driverlib.lib<sysctl.obj>" gpiostudy C/C++ Problem
#10056 symbol "SysCtlADCSpeedSet" redefined: first defined in "./sysctl.obj"; redefined in "C:\ti\TivaWare_C_Series-1.0\driverlib\ccs\Debug\driverlib.lib<sysctl.obj>" gpiostudy C/C++ Problem
#10056 symbol "SysCtlClockSet" redefined: first defined in "./sysctl.obj"; redefined in "C:\ti\TivaWare_C_Series-1.0\driverlib\ccs\Debug\driverlib.lib<sysctl.obj>" gpiostudy C/C++ Problem
#10056 symbol "bNewPLL" redefined: first defined in "./sysctl.obj"; redefined in "C:\ti\TivaWare_C_Series-1.0\driverlib\ccs\Debug\driverlib.lib<sysctl.obj>" gpiostudy C/C++ Problem
#10056 symbol "SysCtlClockGet" redefined: first defined in "./sysctl.obj"; redefined in "C:\ti\TivaWare_C_Series-1.0\driverlib\ccs\Debug\driverlib.lib<sysctl.obj>" gpiostudy C/C++ Problem
关于这个问题,困惑了我很长时间,现在还没能准确理解个中原因,解决办法就是把添加到工程中的函数文件删除。但是这样想查看源文件代码就比较麻烦,不知这个问题能不能解决。
2)对于上面的问题,我尝试一种解决方法,但是不可行,还在研究中,下面说下方法过程。
根据上面错误提示,应该是重复定义冲突(个人理解),如果把函数库链接取消,即把
右键工程文件名→Properties→ARMLinker→FileSearchPath,在Includelibraryfileorcommandfileasinput中添加链接"C:\ti\TivaWare_C_Series-1.0\driverlib\ccs\Debug\driverlib.lib"。
这一步取消,不链接这个已经编译好的函数库。同时把这个工程引用的文件添加到工程中,主要是引用的头文件如下:
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
同时把相应的.C文件也添加进来,添加方法如下:
右键工程-----add files-----选择相应的源码文件。
正常这样应该能解决问题了,但是只解决了一半。可以通过选择函数名,按F3,查看源代码,但是在编译的时候出现如下错误提示:
Description Resource Path Location Type
unresolved symbol IntDisable, first referenced in ./sysctl.obj gpiostudy C/C++ Problem
unresolved symbol CPUwfi, first referenced in ./sysctl.obj gpiostudy C/C++ Problem
unresolved symbol IntRegister, first referenced in ./sysctl.obj gpiostudy C/C++ Problem
unresolved symbol IntEnable, first referenced in ./sysctl.obj gpiostudy C/C++ Problem
<a href="file:/C:/ti/ccsv5/tools/compiler/dmed/HTML/10234.html">#10234-D</a> unresolved symbols remain gpiostudy C/C++ Problem
unresolved symbol IntUnregister, first referenced in ./sysctl.obj gpiostudy C/C++ Problem
#10010 errors encountered during linking; "gpiostudy.out" not built gpiostudy C/C++ Problem
请那位大虾科普下,这是什么原因,谢谢。