LPC4357学习笔记(一)GPIO口的使用

一、使用一个GPIO口的步骤

1、选择合适的IO口:

参考应用手册,选择合适功能的GPIO口,例如(摘自Datasheet 6.2):
选择合适功能的GPIO口
这里我们选择了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);
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值