NXP

FS_NXPM4的GPIO中断开发及分析

2019-07-12 13:06发布

作者:周志强,华清远见嵌入式学院讲师。 开发板采用的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<         GPIO_SetDir(KEY2_PORT,(1<         GPIO_SetDir(KEY3_PORT,(1<         {
                //clear the interrupt
                LPC_GPIO_PIN_INT->RISE |= 0x1 << 0;
                LPC_GPIO_PIN_INT->FALL |= 0x1 << 0;
                LPC_GPIO_PIN_INT->IST |= 0x1 << 0;
        } 华清远见近期免费活动公告:http://www.embedu.org/news/free.htm