FS_NXPM4的GPIO中断开发及分析

发布于:2021-12-01 14:48:44

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?<

LPC_GPIO_PIN_INT->IENF?|=?((0x1?<

LPC_GPIO_PIN_INT->SIENF?|=?((0x1?<

然后使用NVIC对应的第一个pin


引脚对应的说明为:



然后进行下面的配置:


LPC_SCU->PINTSEL0?&=?0x00000000;


LPC_SCU->PINTSEL0?|=?(0x10?<

LPC_SCU->PINTSEL0?|=?(0x6??<

(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<

GPIO_SetDir(KEY2_PORT,(1<

GPIO_SetDir(KEY3_PORT,(1<

(7)当按下KEY1后,对应的中断处理函数会被触发。然后进行标志位的设置或者数据处理(不建议在中断处理函数中进行操作)。然后清除中断状态。


void?GPIO0_IRQHandler(void)


{


//clear?the?interrupt


LPC_GPIO_PIN_INT->RISE?|=?0x1?<

LPC_GPIO_PIN_INT->FALL?|=?0x1?<

LPC_GPIO_PIN_INT->IST?|=?0x1?<

}

相关推荐

最新更新

猜你喜欢