您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > Stellaris系列ARM学习讲座
Stellaris系列ARM学习讲座(一)学习库函数的认识:首先介绍几个基本概念:函数库:函数库是由系统建立的具有一定功能的函数的集合。库中存放函数的名称和对应的目标代码,以及连接过程中所需的重定位信息。用户也可以根据自己的需要建立自己的用户函数库。库函数:存放在函数库中的函数。库函数具有明确的功能、入口调用参数和返回值。连接程序:将编译程序生成的目标文件连接在一起生成一个可执行文件。头文件:有时也称为包含文件。C语言库函数与用户程序之间进行信息通信时要使用的数据和变量,在使用某一库函数时,都要在程序中嵌入(用#include)该函数对应的头文件。由于C语言编译系统应提供的函数库目前尚无国际标准。不同版本的C语言具有不同的库函数,用户使用时应查阅有关版本的C的库函数参考手册。我们以TurboC为例简介一下C的库函数,并附录中给出了TurboC的部分常用库函数。比如以前我们要点亮一个数码管,可能需要先写对于寄存器,有时候如果我们不熟的话,寄存器需要我们去找,而库函数则是简单的进行归类封装,同一类函数执行相似的命令,都把它封装为一个函数,只是函数内的值不同,比如:函数:GPIOPinWrite(GPIO_PORTB_BASE,PIN,0);GPIOPinWrite可以代表对所以的GPIO管脚写功能,只是其中执行的GPIO_PORTB_BASE管脚不同,执行输入输出也不同。这样的库函数对初学者编程有极大的帮助。库函数的出现,极大的简化了C语言的编写,用户可以根据自己的要求编写库函数,但是如果你不是高手,还是个菜鸟,又想快点入门,快速开发,使用官方给的库函数是最后的途径了。我学习LM3S系列ARM的编程,就是从学习官方的外设驱动库开始的。下面我们看看官方提供了哪些库,以及我们以后运用要使用的库函数,在以后我们会对这些库函数进行深入探讨。上面是TI提供的常用的库函数包:打开Drivelib文件夹:Drivelib是一个打包封装好的库函数,里面包含全部外设基本函数,打包后使用时自己调用.lib文件,比如CCS文件包里的就是CCS开发环境下调用的.lib,rvmdk文件包里就是keil环境下调用的.lib。打开drivers文件夹这里面都是TI写的一些高级应用的函数库,看我们使用者,根据实际情况进行修改,可以大大提供开发的速度.大家也可以在这个包里家上自己写的库,比如:触摸屏的函数库呀,每个触摸屏的驱动都可能不一样呀。Grlib文件夹是图形开发库。详情可见:图形库用户指南.pdfInc文件夹是函数头文件。Usblib文件夹是USB库函数。详情可见:USB库用户指南.pdfThird_party文件夹是第三方的一些函数,比如FAS文件函数,IWIP文件函数Utils文件夹是开发板对应的一些函数定义,也有TI后期跟新的库函数文件。这些函数在我们以后的编程中将有详细的使用。开发平台的选择:软件平台:keiluvision4的破解版,代码长度不受到限制。是一个好的开发软件,支持各种仿真器。Stellaris系列ARM学习讲座(二)通用IO端口的使用:LM3S811和LM3S9B96的ARMCORTEX核的IO端口引脚配置与51单片机的区别,不同于51单片机不需要设置管脚作为的输入或者输出功能,ARMCORTEX核的IO端口是需要配置寄存器,设置某个时间状态下只能作为输入或者输出端口。I/O(Input/Output)接口是一颗微控制器必须具备的最基本外设功能。在Stellaris系列ARM里,所有I/O都是通用的,称为GPIO(GeneralPurposeInput/Output)。GPIO模块由3~8个物理GPIO块组成,一块对应一个GPIO端口(PA、PB、PC、PD、PE、PF、PG、PH)。每个GPIO端口包含8个管脚,如PA端口是PA0~PA7。GPIO模块遵循FiRM(FoundationIPforReal-TimeMicrocontrollers)规范,并且支持多达60个可编程输入/输出管脚(具体取决于与GPIO复用的外设的使用情况)。在Stellaris系列ARM里,GPIO管脚可以被配置为多种工作模式,其中有3种比较常用:高阻输入、推挽输出、开漏输出。这三种模式,大家在模电数电中已经有过了解了;下面引用ZLG的介绍文档如下,大家可以学学,高手掠过:1.高阻输入(Input)如图1.1所示,为GPIO管脚在高阻输入模式下的等效结构示意图。这是一个管脚的情况,其它管脚的结构也是同样的。输入模式的结构比较简单,就是一个带有施密特触发输入(Schmitt-triggeredinput)的三态缓冲器(U1),并具有很高的输入等效阻抗。施密特触发输入的作用是能将缓慢变化的或者是畸变的输入脉冲信号整形成比较理想的矩形脉冲信号。执行GPIO管脚读操作时,在读脉冲(ReadPulse)的作用下会把管脚(Pin)的当前电平状态读到内部总线上(InternalBus)。在不执行读操作时,外部管脚与内部总线之间是隔离的。2.推挽输出(Output)如图1.2所示,为GPIO管脚在推挽输出模式下的等效结构示意图。U1是输出锁存器,执行GPIO管脚写操作时,在写脉冲(WritePulse)的作用下,数据被锁存到Q和/Q。T1和T2构成CMOS反相器,T1导通或T2导通时都表现出较低的阻抗,但T1和T2不会同时导通或同时关闭,最后形成的是推挽输出。在Stellaris系列ARM里,T1和T2实际上是多组可编程选择的晶体管,驱动能力可配置为2mA、4mA、8mA,以及带转换速率(SlewRate)控制的8mA驱动。在推挽输出模式下,GPIO还具有回读功能,实现回读功能的是一个简单的三态门U2。注意:执行回读功能时,读到的是管脚的输出锁存状态,而不是外部管脚Pin的状态。漏3.输出(OutputOD)如图1.3所示,为GPIO管脚在开漏输出模式下的等效结构示意图。开漏输出和推挽输出相比结构基本相同,但只有下拉晶体管T1而没有上拉晶体管。同样,T1实际上也是多组可编程选择的晶体管。开漏输出的实际作用就是一个开关,输出“1”时断开、输出“0”时连接到GND(有一定内阻)。回读功能:读到的仍是输出锁存器的状态,而不是外部管脚Pin的状态。因此开漏输出模式是不能用来输入的。开漏输出结构没有内部上拉,因此在实际应用时通常都要外接合适的上拉电阻(通常采用4.7~10kΩ)。开漏输出能够方便地实现“线与”逻辑功能,即多个开漏的管脚可以直接并在一起(不需要缓冲隔离)使用,并统一外接一个合适的上拉电阻,就自然形成“逻辑与”关系。开漏输出的另一种用途是能够方便地实现不同逻辑电平之间的转换(如3.3V到5V之间),只需外接一个上拉电阻,而不需要额外的转换电路。典型的应用例子就是基于开漏电气连接的I2C总线。下面来讲下我们的配置编程,上次讲过,我们编程不同于51单片机,我们将使用TI提供的函数库,实现快速编程。我们要点亮一个数码管,点亮数码管是通过操作GPIO管脚实现对LED灯给个高电平。这里我们就需要调动库函数中gpio.h函数库,大家可以打开函数库,我们可以看到#defineGPIO_PIN_00x00000001//GPIOpin0这就是对端口寄存器定义,gpio.h其实就是GPIO头文件,同时就调用了gpio.c文件,其实driverlib.lib函数就是对整个API函数库打包的,调用了这个函数后就不需要分别对每个外设函数进行调用,gpio.c文件大家可以打开看看。里面都是相关驱动函数。这里我编程的时候就可以不用去寻找单个寄存器去赋值,当然大家找单个寄存器去赋值也可以,对于复杂程序来说,库函数将会大大简化编程复杂性。首先我们看我们的硬件电路图:811开发板通过PC5点亮LED灯9B96通过PB5点亮LED灯通过PB5或者PC4点亮数码管。点亮一个数码管的过程我们可以归纳如下:1:配置系统时钟和使能GPIO端口外设,也就是开GPIO功能。2:配置GPIO端口驱动电流大小和管脚模式3:设置管脚为输出管脚。4:设置管脚输出是高电平还是低电平。大家按照这个过程使用库函数来写驱动程序如下:SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);//设置系统时钟SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//配置外设使能GPIOPadConfigSet(GPIO_PORTF_BASE,PINS,GPIO_STRENGTH_4MA,GPIO_PIN_TYPE_STD);//设置管脚类型GPIODirModeSet(GPIO_PORTB_BASE,GPIO_PIN_5,GPIO_DIR_MODE_OUT);//设置输入输出GPIOPinWrite(GPIO_PORTB_BASE,PIN,1)//设置输出输入的电平while(1);这就是点亮一个数码管的基本程序,先给大家介绍下其中几个常用函数:函数GPIODirModeSet():功能设置所选GPIO端口指定管脚的方向和模式原型voidGPIODirModeSet(unsignedlongulPort,unsignedcharucPins,unsignedlongulPinIO)参数ulPort:所选GPIO端口的基址,应当取下列值之一:GPIO_PORTA_BASE//GPIOA的基址(0x40004000)GPIO_PORTB_BASE//GPIOB的基址(0x40005000)GPIO_PORTC_BASE//GPIOC的基址(0x40006000)GPIO_PORTD_BASE//GPIOD的基址(0x40007000)GPIO_PORTE_BASE//GPIOE的基址(0x40024000)GPIO_PORTF_BASE//GPIOF的基址(0x40025000)GPIO_PORTG_BASE//GPIOG的基址(0x40026000)GPIO_PORTH_BASE//GPIOH的基址(0x40027000)在2008年新推出的型号(LM3S3xxx/5xxx系列,以及部分LM3S1xxx/2xxx型号)里,新增了一项AHB功能(GPIO高速总线访问)。如果已经用函数SysCtlGPIOAHBEnable()使能了AHB功能,则ulPort应当取下列值之一:GPIO_PORTA_AHB_BASE//GPIOA的AHB基址GPIO_PORTB_AHB_BASE//GPIOB的AHB基址GPIO_PORTC_AHB_BASE//GPIOC的AHB基址GPIO_PORTD_AHB_BASE//GPIOD的AHB基址GPIO_PORTE_AHB_BASE//GPIOE的AHB基址GPIO_PORTF_AHB_BASE//GPIOF的AHB基址GPIO_PORTG_AHB_BASE//GPIOG的AHB基址GPIO_PORTH_AHB_BASE//GPIOH的AHB基址ucPins:指定管脚的位组合表示,应当取下列值之一或者它们之间的任意“或运算”组合形式:GPIO_PIN_0//GPIO管脚0的位表示(0x01)GPIO_PIN_1//GPIO管脚1的位表示(0x02)GPIO_PIN_2//GPIO管脚2的位表示(0x04)GPIO_PIN_3//GPIO管脚3的位表示(0x08)GPIO_PIN_4//GPIO管脚4的位表示(0x10)GPIO_PIN_5//GPIO管脚5的位表示(0x20)GPIO_PIN_6//GPIO管脚6的位表示(0x40)GPIO_PIN_7//GPIO管脚7的位表示(0x80)ulPinIO:管脚的方向或模式,应当取下列值之一:GPIO_DIR_MODE_IN//输入方向GPIO_DIR_MODE_OUT//输出方向GPIO_DIR_MODE_HW//硬件控制函数GPIODirModeGet()功能获取所选GPIO端口指定管脚的方向和模式原型un
本文标题:Stellaris系列ARM学习讲座
链接地址:https://www.777doc.com/doc-24875 .html