该实验实现的功能是两只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) |