Tivaware使用入门指导.pdf
- 文档编号:3437655
- 上传时间:2023-05-05
- 格式:PDF
- 页数:20
- 大小:1.50MB
Tivaware使用入门指导.pdf
《Tivaware使用入门指导.pdf》由会员分享,可在线阅读,更多相关《Tivaware使用入门指导.pdf(20页珍藏版)》请在冰点文库上搜索。
TIU-ProgramTivaWare基本介绍基本介绍V1.02014.9.24目录目录1TM4C12xMCU概述.21.1TM4C123x功能框图.21.2TM4C129x功能框图.32TivaWare功能简介.42.1TivaWare特性说明.42.2TivaWare目录结构.53TivaWare外设驱动库.63.1外设驱动库简介.63.2外设驱动库目录结构.73.3编程模式.73.3.1直接寄存器操作模式.73.3.2软件驱动模式.83.3.3混合编程模式.93.4使用片内ROM的函数.93.4.1直接调用ROM.93.4.2调用映射的ROM.103.5更新固件.113.5.1ROM_UpdateI2C.123.5.2ROM_UpdateSSI.123.5.3ROM_UpdateUART.123.6错误处理.133.7各个外设的使用.144TivaWare图形库.154.1图形库简介.154.2图形库目录结构.165TIUSB库.175.1USB库简介.175.2操作模式.175.3USB库目录结构.186IQMath库.197传感器库.198后记.208.1参考资料.201TM4C12xMCU概述概述TM4C12xMCU是德州仪器(TI)推出的基于ARMCortex-M4内核的嵌入式处理器,目前有两个大的子系列:
TM4C123x系列和TM4C129x系列。
TM4C123x系列系列:
USB+CANMCUTM4C123x系列MCU集成了ARM单精度浮点内核和高性能模数转换器,同时仍提供低至1.6A的低功耗模式。
TM4C123x系列具有最多40路PWM输出、大量的串行通信外设、USBOTG和两个CAN控制器,为家庭、楼宇和工业应用提供了出色的基准。
TM4C129x系列系列:
ENET+LCDMCUTM4C129xMCU是业界首款集成以太网MAC+PHY且基于ARMCortex-M4的MCU,可帮助客户创建一类全新的高度连接产品来桥接云并增强日益发展的物联网(IoT)。
TM4C129xMCU提供了多种连接选项以及片上数据保护和LCD控制器,以节约电路板空间并实现连接应用(例如,家庭/楼宇自动化网关、已连接的人机界面(HMI)、联网传感器网关及许多其他应用)。
更多详细信息请点击跳转至官网查看。
1.1TM4C123x功能框图功能框图TM4C123x系列MCU的功能框图如下所示:
1.2TM4C129x功能框图功能框图TM129x系列MCU的功能框图如下所示:
从功能框图可以看出,Tiva系列处理器拥有众多的外设模块,功能强大。
那么使用起来是不是很复杂呢?
答案是否定的,为了节省软件的开发时间,TI公司提供了专门用于TivaC系列处理器的开发组件TivaWare。
用户可以使用组件中附带的代码示例开始评估并加快开发进度,同时还提供易于使用并集成免专利费的库(外设、USB、图形)。
2TivaWare功能简介功能简介TexasInstrumentsTivaWare是针对TivaC系列微处理器的一套软件开发包。
该软件实质上是一个程序库,可以将微处理器所执行的常用基础操作指令模块化、函数化,免去了开发过程中可能出现的冗长代码和繁琐的工作,减少出错的几率,从而加快开发进程。
本节只对TivaWare驱动库做基本介绍。
如果要深入了解驱动库,请查阅TivaWare库的相关文档,这些文档存放于Tivaware安装目录下的“/docs”的目录下。
2.1TivaWare特性说明特性说明TivaWare库的一些特性总结如下:
从代码大小或执行速度上看,相对于汇编语言编写的代码,采用驱动库开发的代码并不是最高效的。
尽管驱动库的函数可以写得尽可能贴近汇编模式以提高效率,但是这样会使代码变得难以理解。
简单来说,在可接受的范围内,通过损失一些在可接受的范围内,通过损失一些代码代码空间和空间和执行执行效率,来提高程序的可读性。
效率,来提高程序的可读性。
并非所有的并非所有的Tiva外设外设功能都可以通过调用库函数来实现功能都可以通过调用库函数来实现,有些函数还是要自己写的,有些函数还是要自己写的。
驱动程序尽可能的满足外设硬件的基本功能和常见功能,对于一些较复杂的功能或者不常见的用法,驱动库并没有现成的函数可以调用。
此时,可以把现有的代码可以作为一个参考(库函数提供了源代码),在它们的基础上增加对附加功能的支持。
可通过某种方式移除可通过某种方式移除API中所有的错误检查代码中所有的错误检查代码。
这个算是一项高级功能吧,一般情况下,可以不理会。
Tivaware库提供了一种操作方式,可以将API中所有的错误检查代码移走。
因为API输入参数的错误代码等通常只在程序开发的过程中使用,在生成最终用户版本时可以把它移走来改善减小代码空间和提高运行速度。
TivaWare支持的开发工具有:
KeilRealViewMicrocontrollerDevelopmentKitMentorGraphicsSourceryCodeBenchforARMEABIIAREmbeddedWorkbenchTexasInstrumentsCodeComposerStudio所以,在Tivaware安装目录下不同的库驱动文件中,我们会看到ccs、ewarm、gcc、rvmdk四个文件夹,实际上就是存放对应的不同编译工具的链接库。
2.2TivaWare目录目录结构结构TivaWare安装完成后,默认位于C:
TiTivaWare_C_Series-2.1.0.12573。
TivaWare文件夹中包含boot_loader、docs、driverlib、examples、inc等文件夹,具体如下图所表示。
TivaWare是由多个程序库组合的一个集合,其组成框图如下:
示例代码外设驱动程序库图形库传感器库USB库数学运算库开源RTOS开源协议栈启动加载程序(BootLoader)和在线编程支持第三方工具和示例说明文档下面简单介绍下目录,强烈建议大家打开下电脑上已经安装的TivaWare目录,多熟悉下。
文件夹文件夹文件夹内的内容简介文件夹内的内容简介boot_Loader该目录包含引导加载程序的源码CC3000CC3000模块的源码和库文件,支持TM4C123和TM4C129docsTivaware文档汇集driverlib外设驱动程序库examples各种Demo板卡的例程和代码grlibTivaware图形驱动库inc包含了各型号的寄存器宏定义以及直接寄存器操作的部分宏定义IQmath包含了高精度数学运算函数库nfclib非接触式芯片TRF79xx的操作例程sensorlib常见传感器操作的函数库third_party第三方软件包,如网络协议栈,操作系统等tools一些常用的工具汇集usblibUSB驱动程序库utils该目录内包含一组使用的程序函数范例windows_drivers开发过程中的USB驱动3TivaWare外设驱动库外设驱动库3.1外设驱动库简介外设驱动库简介TexasInstrumentsTivaWare外设驱动库(TivawarePeripheralDriverLibrary)是用来访问ARMCortex-M内核的Tiva系列处理器外设(外设是相对于处理器内核而言)的一系列驱动程序。
如果站在“操作系统”的角度,它们称不上严格意义上的驱动程序(因为这些的驱动程序没有面向操作系统的统一接口,也没有可以融入全局的驱动程序架构),但这些驱动程序确实提供了一种机制,使器件的外设使用起来很容易。
用户只需要根据外设操作的基本过程来调用相关的函数,无需了解这些操作相关的详细寄存器信息,大大降低了开发的难度。
驱动程序的功能和组织结构如下:
驱动程序全部用C编写,除了那些实在很难用C语言实现的;驱动程序演示了如何在常用的操作模式下使用外设;驱动程序很容易理解;高效,尽可能的少占用内存和处理器资源;尽可能保持函数独立性;只要可能,可以在编译中处理的计算都在编译过程中完成,不占用运行时间;支持多个工具链。
这些设计目标会得到一些以下的结果:
站在代码大小和/或执行速度的角度,驱动程序不必要达到它们所能实现的最高效率。
虽然执行外设操作的最高效率的代码都用汇编编写,然后进行裁减来满足应用的特殊要求,但过度优化驱动程序的大小会使它们变得更难理解;从这个角度出发,驱动程序的可读性和可维护性是最重要的。
驱动程序并非支持硬件的全部功能。
现有的代码驱动,只是作为一个参考,满足一些常用的功能。
但是一些外设提供的复杂功能通过驱动库中的驱动程序是不能使用的,需要自己根据实际情况编写修改代码;APIs提供了一种方法,可以移走所有的错误检查代码。
因为参数错误检查通常只在程序开发的调试阶段使用,调试完成后可以把它移走来改善代码大小和速度。
对于许多应用来说,驱动程序可以直接使用。
但是,在某些情况下,为了满足应用的功能、内存或处理要求,必须增加或改写驱动程序代码。
在这种情况下,现有的驱动程序可以用作外设操作的一个参考。
支持以下工具链:
KeilRealViewMicrocontrollerDevelopmentKitMentorGraphicsSourceryCodeBenchforARMEABIIAREmbeddedWorkbenchTexasInstrumentsCodeComposerStudio3.2外设驱动库目录结构外设驱动库目录结构Tivaware包含多个库,下面简单描述了外设驱动程序库源代码的组织结构。
这个目录结构大概了解下,要找文件时可以找得到。
EULA.txt:
包括这个软件包的使用在内的最终用户许可协议的完整文本。
driverlib/:
该目录包含驱动程序的源代码。
hw_*.h:
在inc目录下,头文件,每个外设对应一个,描述了每个外设的所有寄存器以及寄存器中的位字段。
驱动程序使用这些头文件来直接访问一个外设,应用代码也可以使用这些头文件,从而将外设驱动程序库API忽略。
inc/:
该目录保持了直接寄存器用于访问编程模块的部分指定头文件makedefs:
makefiles使用的一组定义。
3.3编程模式编程模式外设驱动程序库提供两种编程模式的支持:
直接寄存器访问模式和软件驱动模式。
根据实际应用的需要或者开发者所需要的编程环境,这两种模式可以独立使用,也可以结合起来使用。
这两种编程模式都有各自的优、缺点。
相比于软件驱动模式,使用直接寄存器访问模式能得到更少、更高效的代码。
然而,使用直接寄存器访问模式,要求使用者了解每个寄存器的含义、寄存器各字段(Bit)的含义、它们之间的相互影响,以及对一个外设进行操作时各寄存器操作的先后顺序及详细内容。
在这种情况下,如果开发者使用软件驱动模式,则不需要知道这些详细内容,可以在更短的时间内开发应用。
3.3.1直接寄存器操作模式直接寄存器操作模式在直接寄存器操作模式下,通过直接向外设寄存器写入数值的方式对外设进行编程。
TivaWare所提供的宏集大大简化这个处理过程。
这些宏存储在不同型号的头文件中,位于在Tivaware安装目录下的inc目录下。
头文件的名称必须与器件型号相一致(例如,与TM4C123GH6PM相对应的头文件为inc/tm4c123gh6pm.h)。
通过包含与某型号器件相匹配的头文件,就可以使用这些宏来访问该器件中的所有寄存器,包括这些寄存器相关的位定义。
当然,为避免不可预知的问题,只能使用这些宏来访问与它匹配器件的寄存器。
直接寄存器操作模式所使用的名称定义遵循一定的命名规则,使得人们可以更加容易地使用一个特定的宏。
命名规则如下:
以_R结尾的值是用来访问寄存器的值。
例如:
SSI0_CR0_R是用来访问在SSI0模块的CR0寄存器;以_M结尾的值用来代表在寄存器的多位字段的屏蔽。
如果在多位字段的值是一个数字,那么宏基本名将相同,但以_S结尾(例如:
SSI_CR0_SCR_M和SSI_CR0_SCR_S)。
如果在多位段的值是一个列举,那么宏集的基本名将相同,但是以不同列举值的标识符结尾(例如:
SSI_CR0_FRF_M宏定义位字段,SSI_CR0_FRF_NMW、SSI_CR0_FRF_TI和SSI_CR0_FRF_MOTO宏为位字段提供列举);以_S结尾的值代表着移位一个值的位数以使得这个值对齐多位字段。
这些值的名与宏的基本名相同,但它们以_M结尾;其它所有的宏代表着位字段的值;所有寄存器命名宏时,首先是模块的名称和数量依次编号(例如:
第一个SSI模块命名为SSI0),接着是在数据手册出现的寄存器的名称(例如:
在数据手册中的CR0寄存器将会使宏被命名为SSI0_CR0_R);所有寄存器的位字段命名时,首先是模块的名称,紧跟着是寄存器的名称,后面再跟着出现在数据手册的位字段名。
例如:
在SSI模型中的CR0寄存器的SCR位字段将会被命名为SSI_CR0_SCR。
在位字段是单个比特位的情况下,命名结束(例如:
SSI_CR0_SPH是CR0寄存器的单一比特位);如果位字段大于单一比特位,那么名称后面将会有一个屏蔽值(_M);如果位字段包含有一个数字或一个列举集,那么后面将会有一个移位(_S);参考这些定义,我们采用直接寄存器访问的方式操作外设SSI0模块的CR0寄存器,编程语句如下:
SSI0_CR0_R=(5SSI0_CR0_SCR_S;GPIO模块具有多个不包含有位字段定义的寄存器。
对于这些寄存器,寄存器位代表着单独的GPIO管脚;因此这些寄存器的位0则与器件的PX0管脚相对应(X由一个GPIO模块字母所取代),位1与PX1管脚相对应,依此类推,等等。
每块板的blinky范例使用直接寄存器操作的模式来实现板上LED的闪烁。
注意:
被驱动程序库所用到的hw_*.h头文件包含有许多与供直接寄存器访问模型使用的头文件相同的定义。
因此,不能把二个相同定义的头文件包含在同一个源文件中,这样编译器就无需产生要求对符号进行重新定义的警告。
3.3.2软件驱动模式软件驱动模式如果采用软件驱动的模式开发,用户通过外设驱动库提供的APIs来控制外设。
软件驱动库提供了外设在正常模式下的全部操作函数,因此,我们完全可能写出全部基于驱动库的代码,而不使用任何的寄存器操作。
这种方法提供了较快的开发模式,因为我们无需了解对外设编程的细节实现。
与直接寄存器操作模式相对应,以下的指令也将会编程SSI模块的CR0寄存器(虽然API隐藏了这个事实):
SSIConfigSetExpClk(SSI0_BASE,50000000,SSI_FRF_MOTO_MODE_3,SSI_MODE_MASTER,1000000,8);在CR0寄存器得出的结果值可能并不完全相同,这是因为SSIConfigSetExpClk()可能为SCR位字段计算出的值与直接寄存器访问模型范例中所用的值不同。
Tivaware的所有的范例应用,blinky除外,都采用了软件驱动的模式。
3.3.3混合编程模式混合编程模式在实际应用中,还可以把直接寄存器访问模式和软件驱动模式组合起来使用。
用户可以根据具体的应用,选择使用最合适的开发模式。
例如:
使用软件驱动的模式来配置外设(因为这一外设的操作并不是至关重要)并且在外设操作中也可以使用直接寄存器访问模型(这有可能这个外设的操作比较重要)。
或者,外设的执行并不非常重要时(如把UART用于数据记录),可以对外设使用软件驱动模式。
而在外设的执行很重要时(如使用ADC模块来捕获实时模拟数据),则使用直接寄存器访问模式。
这段话说白了,又回到了直接寄存器访问和软件驱动方式的特点上,直接操作寄存器,可能得到更高效的代码,但是可读性比较差;用C语言编写的代码,可读性好,但是损失了一部分效率。
(个人观点:
能用C语言的尽可能用C语言编写,代码的可读性更重要)3.4使用片内使用片内ROM的函数的函数有很大一部分的Tiva器件都将外设驱动程序库存储在片内ROM中。
通过使用片内ROM中的代码,可以腾出更多Flash空间供用户使用。
引导加载程序(BootLoader)也包含在ROM中,它同样可以被应用程序调用以用于启动固件更新。
3.4.1直接调用直接调用ROM为了调用ROM里的资源,我们再使用时,要执行以下步骤:
1)要先定义一个器件型号,应用程序将在这个器件上运行。
这一步是通过预先定义一个处理器符号来实现,而预先定义处理器符号,可以在源代码中完成,也可以在工程的配置中设置完成。
如果在工程间共享了代码,那么在工程配置中修改的方法更为灵活;2)要包含头文件driverlib/rom.h,需要用到这个文件来调用ROM;3)调用外设驱动程序库的ROM版本函数。
例如,如果在ROM中将要调用GPIPDirModeSet(),那么使用ROM_GPIODirModeSet()取而代之。
简单来说,ROM中的函数名称是以“ROM_”开头。
用户在代码编译时,就要决定是否使用ROM中的函数,因为在运行时决定并不能起到节省Flash的作用,此时,调用ROM和Flash版本的API都位于Flash中。
以下定义经driverlib/rom.h验证:
TARGET_IS_DUSTDEVIL_RA0用于DustDevil-classdevice,siliconrevisionA0TARGET_IS_TEMPEST_RB1用于Tempest-classdevice,siliconrevisionB1.TARGET_IS_TEMPEST_RC1用于Tempest-classdevice,siliconrevisionC1.TARGET_IS_TEMPEST_RC3用于Tempest-classdevice,siliconrevisionC3.TARGET_IS_TEMPEST_RC5用于Tempest-classdevice,siliconrevisionC5.TARGET_IS_FIRESTORM_RA2用于Firestorm-classdevice,siliconrevisionA2.TARGET_IS_BLIZZARD_RA1用于Blizzard-classdevice,siliconrevisionA1.通过使用ROM_Function(),就可明确地调用ROM。
如果指定的函数不能在ROM中运行,那么将会产生一个编译错误。
更多有关ROM中可运行的API函数,请参考TivawareROM用户指南。
以下是在ROM中调用一个函数的示例,使用源文件中的而非工程文件中的#define来定义讨论的器件:
#defineTARGET_IS_DUSTDEVIL_RA0#includedriverlib/rom.h#includedriverlib/systick.hintmain(void)ROM_SysTickPeriodSet(0x1000);ROM_SysTickEnable();/.3.4.2调用映射的调用映射的ROM当在工程间共享代码时,一些工程在带有ROM器件型号上运行,而另一些工程则在不带有ROM的器件型号上运行,此时最方便的做法是让代码自动调用ROM或Flash版本的API,从而使代码无需包含#ifdef-s。
rom_map.h提供一个自动进行映射特性,用于访问ROM。
类似于rom.h提供的ROM_Function()形式的API,rom_map.h提供一组MAP_Function()形式的API。
如果函数能在ROM中使用,那么MAP_Function()将会调用ROM_Function();否则调用Function()。
为了使用映射的ROM调用,必须执行以下几个步骤:
1)遵从上面包含和使用driverlib/rom.h的步骤;2)包含头文件driverlib/rom_map.h;3)继续上面的示例,我们在源代码中调用MAP_GPIODirModeSet()。
类似于直接ROM调用的方式,在编译时就会作出选择,决定是调用ROM还是调用Flash版本的API。
只通过ROM映射特性来提供的API就是那些可在ROM中使用的API函数,并不是每一个这样的API都可用于外设驱动程序库。
下面是一个在共享代码中调用一个函数的示例,这里讨论的器件是在工程文件中定义:
#includedriverlib/rom.h#includedriverlib/rom_map.h#includedriverlib/systick.hvoidSetupSysTick(void)MAP_SysTickPeriodSet(0x1000);MAP_SysTickEnable();当对一个不含有ROM的器件进行编译时,这就等价于:
#includedriverlib/systick.hvoidSetupSysTick(void)SysTickPeriodSet(0x1000);SysTickEnable();当对一个含有ROM的器件进行编译时,这就等价于:
#includedriverlib/rom.h#includedriverlib/systick.hvoidSetupSysTick(void)ROM_SysTickPeriodSet(0x1000);ROM_SysTickEnable();3.5更新固件更新固件函数列表:
voidROM_UpdateI2C(void)voidROM_UpdateSSI(void)voidROM_UpdateUART(void)ROM中有一组用来重启引导加载程序的API,用于更新固件。
提供了多种调用选择,因为每一次的更新处理都会选择一种特定的接口,并绕过正常引导加载程序的接口选择步骤(包括UART接口的自动波特率)。
更多ROM中的固件更新APIs,请参考TivawareROM用户指南。
3.5.1ROM_UpdateI2C通过I2C0接口启动更新。
函数原型:
voidROM_UpdateI2C(void)描述:
调用此函数就可以通过I2C0接口开始更新固件。
此函数假设I2C0接口已配置,且当前处于运行状态。
I2C0从机用来进行数据传输,而I2C0主机用来监视总线忙碌条件(因此,二者都必须使能)。
返回:
从不返回。
3.5.2ROM_UpdateSSI通过SSI0接口启动更新。
函数原型:
voidROM_UpdateSSI(void)描述:
调用此函数就可以通过SSI0接口开始更新固件。
此函数假设SSI0接口已配置,且当前处于运行状态。
返回:
从不返回。
3.5.3ROM_UpdateUART通过UART0接口启动更新。
函数原型:
voidROM_UpdateUART(void)描述:
调用此函数就可以通过UART0接口开始更新固件。
此函数假设UART0接口已配置,且当前处于运行状态。
返回:
从不返回。
3.6错误处理错误处理在驱动库中通过一种非传统的方式来处理无效参数和错误条件。
在传统模式下,函数检查自己的参数,确保它们有效(如果需要;某些参数可能是无条件有效的,例如,用作32位定时器装载值的一个32位值)。
如果一个无效参数被提供,则函数会返回一个错误代码。
然后调用者必须检
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Tivaware 使用 入门 指导