从0开始学习TI--M3……2

zca123   2012-3-6 20:06 楼主

GPIO部分:

811GPIO能够承受5V的电平,可以与5V供电的方面的交流。其中特别需要注意的是在1000以下的系列中,PB7\PC0\PC1\PC2\PC3JTAG复用,对于811需要特别注意一旦锁死意味着芯片报废,对于1000以上的系列用到这些IO需要先进行解锁操作。

在流明的库里至少包含了27个关于GPIO的接口函数。他们分别用于实现:中断屏蔽、边沿触发方式选择、电平触发、弱上拉或者弱下拉、2,4,8ma的驱动能力的选择、开漏使能,AHB能等功能。

     GPIO管脚可以被配置为多种模式,包括高阻输入、推挽输出、开漏输出等,其中开漏输出用于挂载总线。

     GPIO在复位后是没有使能的,当需要的时候才使能,体现了其低功耗的设计。所以在操作GPIO的时候需要按照以下步奏:

1使能

2配置为输入、输出或者特殊功能模式

3读或者写GPIO

 

例子1(实现用KEY控制LED的亮灭)

#include  "systemInit.h"

 

//  定义LED

#define  LED_PERIPH             SYSCTL_PERIPH_GPIOC

#define  LED_PORT               GPIO_PORTC_BASE

#define  LED_PIN                GPIO_PIN_5

 

 

//  定义KEY

#define  KEY_PERIPH             SYSCTL_PERIPH_GPIOC

#define  KEY_PORT               GPIO_PORTC_BASE

#define  KEY_PIN                GPIO_PIN_4

 

 

//  主函数(程序入口)

int main(void)

{

 

    jtagWait();                                             //  防止JTAG失效,重要!

    clockInit();                                            //  时钟初始化:晶振,6MHz

 

    SysCtlPeriEnable(LED_PERIPH);                           //  使能LED所在的GPIO端口

    GPIOPinTypeOut(LED_PORT, LED_PIN);                      //  设置LED所在的管脚为输出

 

    SysCtlPeriEnable(KEY_PERIPH);                           //  使能KEY所在的GPIO端口

    GPIOPinTypeIn(KEY_PORT, KEY_PIN);                       //  设置KEY所在管脚为输入

 

    for (;;)

    {

        if (GPIOPinRead(KEY_PORT, KEY_PIN) == 0x00)         //  如果按下KEY

        {

            GPIOPinWrite(LED_PORT, LED_PIN, 0x00);          //  点亮LED

        }

        else

        {

            GPIOPinWrite(LED_PORT, LED_PIN, 0xFF);          //  熄灭LED

        }

 

        SysCtlDelay(10 * (TheSysClock / 3000));             //  延时约10ms

    }

}

回复评论 (4)

例子2(面向对象的GPIO编程)mian.c

#include  "systemInit.h"
#include  "LED.h"

//  主函数(程序入口)

int main(void)

{

    TYPE_LED LED1, LED2;                              //  定义LED指示灯对象



    jtagWait();                                             //  防止JTAG失效,重要!

    clockInit();                                            //  时钟初始化:晶振,6MHz



    LED_MemberSet(&LED1, SYSCTL_PERIPH_GPIOC, GPIO_PORTC_BASE, GPIO_PIN_5);

    LED_MemberSet(&LED2, SYSCTL_PERIPH_GPIOD, GPIO_PORTD_BASE, GPIO_PIN_7);





    LED_Init(&LED1);

    LED_Init(&LED2);



    LED_On(&LED1);

    LED_Off(&LED2);



    for (;;)

    {

        LED_Toggle(&LED1);          //翻转

        LED_Toggle(&LED2);





        SysCtlDelay(200 * (TheSysClock / 3000));            //  延时约200ms

    }

}



另外在流明的库里还同时包含了如下函数,在811中可能不太常用,但是对于LM3S9B96可能会用到:

static tBoolean GPIOBaseValid(unsigned long ulPort)

功能:查询ulPort是否有效

参数:ulPort:例如:GPIO_PORTA_BASE或者:GPIO_PORTA_AHB_BASE

返回:如果有效返回true,否则返回false

//*****************************************************************************

static long GPIOGetIntNumber(unsigned long ulPort)

功能:查询某GPIO的中断向量号

输入:ulPort:例如:GPIO_PORTA_BASE

返回:如果有效返回ulPort的基址,否则返回-1

//*****************************************************************************

void GPIOPinTypeUSBAnalog(unsigned long ulPort, unsigned char ucPins)

功能:配置相关GPIO为虚拟USB模式

//*****************************************************************************

void GPIOPinTypeI2S(unsigned long ulPort, unsigned char ucPins)

功能:配置相关GPIO为I2S模式

输入:ulPort和ucPins

返回:无返回值

//*****************************************************************************

void GPIOPinTypeEthernetLED(unsigned long ulPort, unsigned char ucPins)

功能:配置相关GPIO为以太网指示灯模式

输入:ulPort和ucPins

返回:无返回值

//*****************************************************************************

void GPIOPinTypeEPI(unsigned long ulPort, unsigned char ucPins)

功能:配置相关GPIO为EPI模式

输入:ulPort和ucPins

返回:无返回值

//*****************************************************************************

void GPIOPinConfigure(unsigned long ulPinConfig)

功能:选取数字GPIO硬件某个复用功能
点赞  2012-3-6 20:08

led.c

#include  "LED.h"
#include  "systemInit.h"


//  LED数据成员设置
void LED_MemberSet(TYPE_LED *pThis, unsigned long ulPeriph,
                                    unsigned long ulPort,
                                    unsigned char ucPin)
{
    pThis->ulPeriph = ulPeriph;
    pThis->ulPort = ulPort;
    pThis->ucPin = ucPin;
}


//  LED初始化
void LED_Init(TYPE_LED *pThis)
{
    SysCtlPeripheralEnable(pThis->ulPeriph);                //  使能LED所在的GPIO模块
    GPIOPinTypeGPIOOutput(pThis->ulPort, pThis->ucPin);     //  配置LED所在管脚为输出
}


//  点亮LED
void LED_On(TYPE_LED *pThis)
{
    GPIOPinWrite(pThis->ulPort, pThis->ucPin, 0x00);
}


//  熄灭LED
void LED_Off(TYPE_LED *pThis)
{
    GPIOPinWrite(pThis->ulPort, pThis->ucPin, 0xFF);
}


//  反转LED亮灭状态
void LED_Toggle(TYPE_LED *pThis)
{
    unsigned char ucValue;

    ucValue = GPIOPinRead(pThis->ulPort, pThis->ucPin);
    GPIOPinWrite(pThis->ulPort, pThis->ucPin, ucValue^0xFF);
}
点赞  2012-3-6 20:10

led.h

#ifndef  __LED_H__
#define  __LED_H__


//  定义LED结构
typedef struct
{
    unsigned long ulPeriph;
    unsigned long ulPort;
    unsigned char ucPin;
} TYPE_LED;


//  LED数据成员设置
void LED_MemberSet(TYPE_LED *pThis, unsigned long ulPeriph,
                                    unsigned long ulPort,
                                    unsigned char ucPin);

//  LED初始化
void LED_Init(TYPE_LED *pThis);

//  点亮LED
void LED_On(TYPE_LED *pThis);

//  熄灭LED
void LED_Off(TYPE_LED *pThis);

//  反转LED亮灭状态
void LED_Toggle(TYPE_LED *pThis);


#endif  //  __LED_H__
点赞  2012-3-6 20:10
思路不错 MARK下 回头好好看
点赞  2012-3-6 20:52
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复