一、使用一个GPIO口的步骤
1、选择合适的IO口:
参考应用手册,选择合适功能的GPIO口,例如(摘自Datasheet 6.2):
这里我们选择了PD_10
引脚,其具有GPIO功能,地址为GPIO6[24],下面将说明如何使用GPIO口。
2、使用代码配置GPIO口
(1)配置引脚为GPIO输出(点亮led)
首先需要知道该引脚的哪个功能为GPIO,配置时将会用到。
查阅数据手册可知,PD_10
的GPIO功能为function4(摘自User Manual):
库函数配置方法:
scu_pinmux(0x0D , 10, 0, 4);
该函数第一个参数为引脚序号,第二个参数为引脚编号。PD_10
的引脚序号为D
,引脚编号为10
。第三个参数为引脚的功能配置,输出不需要做功能配置,第四个参数为功能编号,这里用到的就是其GPIO功能,也就是功能4。
寄存器配置方法:
LPC_SCU->SFSPD_10 = 4;
与库函数配置类似,LPC_SCU->SFSPD_10
即为PD_10
的功能配置寄存器,其低三位为功能选择,其余位为输出模式。
(2)配置引脚输出高低电平状态
库函数配置方法:
GPIO_SetValue(6,(1<<24));//配置为高电平
GPIO_ClearValue(6,(1<<24));//配置为低电平
该函数第一个参数为GPIO序号,第二个参数为GPIO编号。GPIO6[24]
的引脚序号为6
,引脚编号为24
。
寄存器配置方法:
LPC_GPIO_PORT->CLR[6] = (1UL<<24);//配置为高电平
LPC_GPIO_PORT->SET[6] = (1UL<<24);//配置为低电平
与库函数配置类似,数组内的为GPIO序号,将编号所在位的寄存器设置为1,将会使GPIO设置为高电平或者低电平。
(3)配置GPIO为输入状态(按键)
与配置输出一样,配置输入也需要查阅数据手册,选择合适的引脚。
库函数配置方法:
scu_pinmux(0x0C , 9, MD_EZI, 4);
该函数第一个参数为引脚序号,第二个参数为引脚编号。PC_9
的引脚序号为C
,引脚编号为9
。第三个参数为引脚的功能配置,输入需要用到输入寄存器,MD_EZI
打开输入buffer寄存器,第四个参数为功能编号,这里用到的就是其GPIO功能,也就是功能4。
寄存器配置方法:
LPC_SCU->SFSPC_9 = (1 << 6) | 4;
与库函数配置类似,LPC_SCU->SFSPC_9
即为PC_9
的功能配置寄存器,第六位是输入buffer寄存器的使能位,对于输入来说需要将其配置为使能,其低三位为功能选择,其余位为输出模式。
二、示例程序
该程序的功能是按下Key(GPIO6[8]),改变LED(GPIO6[24])的亮灭。
#include "lpc43xx_gpio.h"
#include "lpc43xx_scu.h"
#include "lpc43xx_cgu.h"
#include "lpc43xx_timer.h"
#define LED1_Pin_name_PORT 0x0D
#define LED1_Pin_name_BIT 10
#define LED1_pin_Function FUNC4
#define LED1_GPIO_PORT 6
#define LED1_GPIO_BIT 24
#define LPC4330_XPLORER_TEST 1
/************************** PRIVATE VARIABLES *************************/
int32_t msec;
/************************** PRIVATE FUNCTIONS *************************/
void SysTick_Handler (void) ;
/*----------------- INTERRUPT SERVICE ROUTINES --------------------------*/
/*********************************************************************//**
* @brief SysTick handler sub-routine (1ms)
* @param[in] None
* @return None
**********************************************************************/
#ifndef _Delay_Ms
#define _Delay_Ms
int32_t msec;
void SysTick_Handler (void) // SysTick Interrupt Handler @ 1000Hz
{
if(msec)msec--;
}
#define DelayMs(ms) for(msec=(ms);msec;)
#endif
//timer init
int main(void)
{
SystemInit();
CGU_Init();
SysTick_Config(SystemCoreClock/1000); /* Generate interrupt each 10 ms */
scu_pinmux(LED1_Pin_name_PORT ,LED1_Pin_name_BIT , MD_EZI, 4);
//LPC_SCU->SFSPD_10 = 4;
LPC_GPIO_PORT->DIR[6] |= (1UL<<24);
LPC_SCU->SFSPC_9 = (1 << 6) | 4;
LPC_GPIO_PORT->DIR[6] &= ~(1 << 8 );
while(1){
while((LPC_GPIO_PORT->PIN[6] & (1 << 8 )));
GPIO_SetValue(LED1_GPIO_PORT,(1<<LED1_GPIO_BIT));
DelayMs(1000);
while((LPC_GPIO_PORT->PIN[6] & (1 << 8 )));
GPIO_ClearValue(LED1_GPIO_PORT,(1<<LED1_GPIO_BIT));
DelayMs(1000);
}
}