Chinaunix首页 | 论坛 | 博客
  • 博客访问: 132487
  • 博文数量: 75
  • 博客积分: 1485
  • 博客等级: 上尉
  • 技术积分: 720
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-11 20:57
文章分类
文章存档

2011年(1)

2010年(15)

2009年(59)

我的朋友

分类: C/C++

2009-06-04 11:29:24

该实验实现的功能是两只LED灯相互闪烁。
在实验前首先要了解一下几个函数:
1.SysCtlPeriEnable():复位时所有GPIO端口都被禁止,故在使用GPIO端口之前必须首先要使能相应的GPIO口,例如使能GPIOB口的操作为:            
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
 
2.GPIOPinTypeIn():作用是设置所选GPIO端口指定的管脚为高阻输入模式,相应操作为:
     GPIOPinTypeGPIOInput(ulPort,ucPins);
 ulPort:所选GPIO端口的基址,ucPins:指定管脚的位组合表示。
 同理,GPIOPinTypeGPIOOutput(),设置所选GPIO端口指定的管脚为输出模式。
 
3.GPIOPinWrite():向所选GPIO端口的指定管脚写入一个值,以更新管脚状态。函数原型:
 void GPIOPinWrite(unsigned long ulPort ,unsigned char ucPins ,unsigned char ucVal)
ucPins指定的管脚对应的ucVal当中的位如果是1,则置位相应的管脚(注意是相应的管脚),如果是0,则清零相应的管脚。
 
首先看main部分:

int main(void)
{
    JTAG_Wait(); // 防止JTAG失效,重要!
    SystemInit(); // 系统初始化
    for (;;)
    {
        LED_Toggle(LED1 | LED2); // 反转LED1和LED2
        Delay(200 * (TheSysClock / 4000)); // 延时约200ms
    }
}

(1)在1138的所有程序中,首先应加上一段防止JTAG失效的程序。防止与JTAG口复用的GPIO口被占用,从而导致的上电后JTAG调试器来不及与芯片连接。

void JTAG_Wait(void)
{
    SysCtlPeriEnable(KEY_PERIPH); // 使能KEY所在的GPIO端口
    GPIOPinTypeIn(KEY_PORT , KEY_PIN); // 设置KEY所在管脚为输入
    if ( GPIOPinRead(KEY_PORT , KEY_PIN) == 0x00 ) // 如果复位时按下KEY,则进入
    {
        for (;;); // 死循环,以等待JTAG连接
    }
    SysCtlPeriDisable(KEY_PERIPH); // 禁止KEY所在的GPIO端口
}

正常复位时,直接运行后面的程序。需要JTAG口连接时,按下key进入死循环等待连接。

(2)系统初始化SystemInit()

void SystemInit(void)
{
    SysCtlLDOSet(SYSCTL_LDO_2_50V); // 设置LDO输出电压
    SysCtlClockSet(SYSCTL_USE_OSC | // 系统时钟设置,采用主振荡器
                   SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_6MHZ |
                   SYSCTL_SYSDIV_1);
/*
    SysCtlLDOSet(SYSCTL_LDO_2_75V); // 配置PLL前将LDO电压设置为2.75V
    SysCtlClockSet(SYSCTL_USE_PLL | // 系统时钟设置,采用PLL
                   SYSCTL_OSC_MAIN | // 主振荡器
                   SYSCTL_XTAL_6MHZ | // 外接6MHz晶振
                   SYSCTL_SYSDIV_10); // 分频结果为20MHz
*/

    TheSysClock = SysCtlClockGet(); // 获取系统时钟,单位:Hz
    LED_Init(LED1 | LED2); // 初始化LED1和LED2
    LED_On(LED1); // 点亮LED1
    LED_Off(LED2); // 熄灭LED2
}

从自定义的初始化函数可以得出系统初始化的步骤。
(3)延时函数自定义的delay()
 

void Delay(unsigned long ulVal)
{
    while ( --ulVal != 0 );
}

延时200ms(TheSysClock=12,000,000):

Delay(200 * (TheSysClock / 4000));

(4)注意看LED_Off

void LED_Off(unsigned char ucLED)
{
    if ( ucLED & LED1 )
    {
        GPIOPinWrite(GPIO_PORTD_BASE , GPIO_PIN_0 , 0x01); // PD0输出高电平
    }
    if ( ucLED & LED2 )
    {
        GPIOPinWrite(GPIO_PORTG_BASE , GPIO_PIN_2 , 0x01 << 2); // PG2输出高电平
    }
    if ( ucLED & LED3 )
    {
        GPIOPinWrite(GPIO_PORTG_BASE , GPIO_PIN_3 , 0x01 << 3); // PG3输出高电平
    }
}

这里给相应端口写入值的时候,要对应相应位,不能简单将1或0写入某个端口。故要0x01<<2.
阅读(1341) | 评论(0) | 转发(0) |
0

上一篇:迷茫

下一篇:2 按键控制LED

给主人留下些什么吧!~~