您的位置:首页 > 产品设计 > 产品经理

FS_NXPM4的GPIO中断开发及分析

2012-09-06 18:04 375 查看
FS_NXPM4的GPIO中断开发及分析
开发板采用的MCU是NXP公司开发的LPC4350。开发板由华清远见研发中心开发。
(1)程序开始首先要对硬件进行初始化,在此使用SystemInit()函数,根据程序启动方式,进行对向量表,Flash的选择。
(2)然后初始化系统时钟:
uint32_t
CGU_Init(void){
CGU_SetXTALOSC(12000000);
CGU_EnableEntity(CGU_CLKSRC_XTAL_OSC, ENABLE);
CGU_EntityConnect(CGU_CLKSRC_XTAL_OSC, CGU_CLKSRC_PLL1);
// Disable PLL1 MCU hang???
//CGU_EnableEntity(CGU_CLKSRC_PLL1, DISABLE);
CGU_SetPLL1(6);
CGU_EnableEntity(CGU_CLKSRC_PLL1, ENABLE);
CGU_EntityConnect(CGU_CLKSRC_PLL1, CGU_BASE_M4);
CGU_UpdateClock();
return 0;
}
(3)对于LPC4350的引脚,每个引脚可能会对应着多个功能。利用LPC4350的SCU功能进行引脚功能的选择。就FS_NXPM4开发板上的按键KEY1进行说明:
按键的板级硬件连接入下图所示:

然后查看与MCU的连接管脚是哪个:

可以看到,MCU上控制KEY1的管脚是PD.2。
(3)查看LPC4350用户手册,得到该引脚能够控制的所有外设功能,如下图所示:

在这里,选择该引脚对应的GPIO功能,LPC4350共有8组(0~7)组GPIO口,从图中可以看出,KEY1对应的是GPIO口的第6组第16个引脚。也就是选择第4个函数功能。
scu_pinmux(0xd ,2 , MD_PDN | MD_EZI, FUNC4);
// Pd.1 :  key1
scu_pinmux(0xd ,3 , MD_PDN | MD_EZI, FUNC4);
// Pd.2 :  key2
scu_pinmux(0xd ,4 , MD_PDN | MD_EZI, FUNC4);
// Pd.3 :  key3
函数的实现为:
/*********************************************************************//**
 * @brief 
Configure pin function
 * @param[in]
port
Port number, should be: 0..15
 * @param[in]
pin
Pin number, should be: 0..31
 * @param[in]
mode
Pin mode, should be:
 * 
- MD_PUP
:Pull-up enabled
 * 
- MD_BUK
:Plain input
 * 
- MD_PLN
:Repeater mode
 * 
- MD_PDN
:Pull-down enabled
 * 
- MD_EHS        :Slew rate
 * 
- MD_EZI        :Input buffer enable
 * 
- MD_ZI         :Glitch filter enabled
 * 
- MD_EHD0       :High drive  8 mA
 * 
- MD_EHD1       :High drive 14 mA
 * 
- MD_EHD2       :High drive 20 mA
 * @param[in]
func 
Function mode, should be:
 * 
- FUNC0
:Function 0
 * 
- FUNC1
:Function 1
 * 
- FUNC2
:Function 2
 * 
- FUNC3
:Function 3
 * 
- FUNC4
:Function 4
 * 
- FUNC5
:Function 5
 * 
- FUNC6
:Function 6
 * 
- FUNC7
:Function 7
 * @return
None
 **********************************************************************/
void scu_pinmux(uint8_t port, uint8_t pin, uint8_t mode, uint8_t func)
{
  uint32_t * scu_base=(uint32_t*)(LPC_SCU_BASE);
  scu_base[(PORT_OFFSET*port+PIN_OFFSET*pin)/4]=mode+func;
} /* scu_pinmux */
(4)引脚功能以及中断控制的初始化
LPC4350的NVIC能设置8个引脚,在进行引脚中断设置的时候,需要注意一个地方:
进行引脚中断设置需要根据所要产生中断的引脚进行SCU功能的配置,说明如下:

配置KEY1的中断,使其中断对应8个NVIC中断的第一个,下面的几个代码是对中断触发模式的设置,在这里选择的是下降沿触发。
LPC_GPIO_PIN_INT->ISEL |= ((0x0 << 0) | (0x0 << 1) | (0x0 << 2)) ;

LPC_GPIO_PIN_INT->IENF |= ((0x1 << 0) | (0x1 << 1) | (0x1 << 2));

LPC_GPIO_PIN_INT->SIENF |= ((0x1 << 0) | (0x1 << 1) | (0x1 << 2));
然后使用NVIC对应的第一个pin
引脚对应的说明为:

然后进行下面的配置:
LPC_SCU->PINTSEL0 &= 0x00000000;
LPC_SCU->PINTSEL0 |= (0x10 << INTPIN0);
LPC_SCU->PINTSEL0 |= (0x6  << PORTSEL0);
(5)使能中断
NVIC_DisableIRQ(PIN_INT0_IRQn); //禁能中断
NVIC_SetPriority(PIN_INT0_IRQn, ((0x01<<0)|0x01));
//设置优先级
NVIC_EnableIRQ(PIN_INT0_IRQn);
//使能中断
(6)引脚方向设置
要想检测中断,需将引脚设置为input
GPIO_SetDir(KEY1_PORT,(1<<KEY1_BIT), 0);//set the pin as input function
GPIO_SetDir(KEY2_PORT,(1<<KEY2_BIT), 0);
GPIO_SetDir(KEY3_PORT,(1<<KEY3_BIT), 0);
(7)当按下KEY1后,对应的中断处理函数会被触发。然后进行标志位的设置或者数据处理(不建议在中断处理函数中进行操作)。然后清除中断状态。
void GPIO0_IRQHandler(void)
{
//clear the interrupt
LPC_GPIO_PIN_INT->RISE |= 0x1 << 0;
LPC_GPIO_PIN_INT->FALL |= 0x1 << 0;
LPC_GPIO_PIN_INT->IST |= 0x1 << 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  function flash