This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

P1口设为外部中断的问题

Other Parts Discussed in Thread: CC2540

怎么将P1口设为外部中断呢?就像P0口的按键一样使用,试了几天了还是不行。

求TI的工程师和路过的各位大神能指点一下

  • 把程序贴出来看看

  • 好的,下面就是我改动的程序:

    /* CPU port interrupt */
    #define HAL_KEY_CPU_PORT_0_IF P0IF
    #define HAL_KEY_CPU_PORT_1_IF P2IF
    #define HAL_KEY_CPU_PORT_2_IF P2IF

    #if defined ( CC2540_MINIDK )||( WEBEE_BOARD )
    /* SW_1 is at P0.0 */
    #define HAL_KEY_SW_1_PORT   P0
    #define HAL_KEY_SW_1_BIT    BV(0)
    #define HAL_KEY_SW_1_SEL    P0SEL
    #define HAL_KEY_SW_1_DIR    P0DIR

    /* SW_2 is at P1.6 */
    #define HAL_KEY_SW_2_PORT   P1
    #define HAL_KEY_SW_2_BIT    BV(6)
    #define HAL_KEY_SW_2_SEL    P1SEL
    #define HAL_KEY_SW_2_DIR    P1DIR

    #define HAL_KEY_SW_1_IEN      IEN1  /* CPU interrupt mask register */
    #define HAL_KEY_SW_1_ICTL     P0IEN /* Port Interrupt Control register */
    #define HAL_KEY_SW_1_ICTLBIT  BV(0) /* P0IEN - P0.0 enable/disable bit */
    #define HAL_KEY_SW_1_IENBIT   BV(5) /* Mask bit for all of Port_0 */

    #define HAL_KEY_SW_1_PXIFG    P0IFG /* Interrupt flag at source */
    #define HAL_KEY_SW_2_IEN      IEN2  /* CPU interrupt mask register */
    #define HAL_KEY_SW_2_ICTL     P1IEN /* Port Interrupt Control register */
    #define HAL_KEY_SW_2_ICTLBIT  BV(6) /* P0IEN - P0.1 enable/disable bit */
    #define HAL_KEY_SW_2_IENBIT   BV(4) /* Mask bit for all of Port_0 */
    #define HAL_KEY_SW_2_PXIFG    P1IFG /* Interrupt flag at source */

    #define HAL_KEY_SW_1_EDGEBIT  BV(0)

    #else

    //P0口中断程序

    HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR )
    {
      HAL_ENTER_ISR();
    #if defined ( CC2540_MINIDK )||( WEBEE_BOARD )
      if ((HAL_KEY_SW_1_PXIFG & HAL_KEY_SW_1_BIT))
    #else
      if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT)
    #endif
      {
        halProcessKeyInterrupt();
      }
    #if defined ( CC2540_MINIDK )||( WEBEE_BOARD )
      HAL_KEY_SW_1_PXIFG = 0;
      HAL_KEY_SW_2_PXIFG = 0;
    #else
      HAL_KEY_SW_6_PXIFG = 0;
    #endif
      HAL_KEY_CPU_PORT_0_IF = 0;
      CLEAR_SLEEP_MODE();
      HAL_EXIT_ISR();
      return;
    }

    //P1口中断程序
    HAL_ISR_FUNCTION( halKeyPort1Isr, P1INT_VECTOR )
    {
      HAL_ENTER_ISR();
    #if defined ( CC2540_MINIDK )||( WEBEE_BOARD )
      if ((HAL_KEY_SW_2_PXIFG & HAL_KEY_SW_2_BIT))
    #else
      if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT)
    #endif
      {
        halProcessKeyInterrupt();
      }
    #if defined ( CC2540_MINIDK )||( WEBEE_BOARD )
      HAL_KEY_SW_1_PXIFG = 0;
      HAL_KEY_SW_2_PXIFG = 0;
    #else
      HAL_KEY_SW_6_PXIFG = 0;
    #endif
      HAL_KEY_CPU_PORT_1_IF = 0;
      CLEAR_SLEEP_MODE();
      HAL_EXIT_ISR();
      return;
    }

    //下面的是初始化部分

     P0SEL = 0; // Configure Port 0 as GPIO
      P1SEL = 0; // Configure Port 1 as GPIO
      P2SEL = 0; // Configure Port 2 as GPIO

      P0DIR = 0xFC;
      P1DIR = 0xBF;
      P2DIR = 0x1F;

      P0 = 0x03;
      P1 = 0x40;  
      P2 = 0; 

    // 这里是按键的函数

    #if defined( CC2540_MINIDK )||( WEBEE_BOARD )
    int num;
    static void simpleBLEPeripheral_HandleKeys( uint8 shift, uint8 keys )
    {
      VOID shift;  // Intentionally unreferenced parameter

      if (keys & HAL_KEY_SW_1)
      {
       num--;  
      }
      if(keys & HAL_KEY_SW_2)
       {
           num++;     
       }   
    }
    #endif

    所有改动的部分都在这里了,麻烦您帮忙看看问题究竟在哪?我看了好多次了还是不行,谢谢了

  •   在cc2540 usb dongle 测试通过!

    中断功能:按键闪灯!

    #include "ioCC2540.h"
     void delay(void)
           {unsigned long i;
             for(i=0;i<100000;i++)
             asm(" nop ");
           }
    #pragma vector   = P1INT_VECTOR 

    __interrupt void P1INT_ISR(void)
    {P1IFG=0;
    P1IF=0;
     
     P0=0;
               
                 delay();
                 delay();
                 delay();
                 P0=0xff;
                
                 delay();
                 delay();
                 delay();
     
    }
        
      void  main()
        {
                 P0SEL =0;
               P1SEL =0x0;
               P0DIR=0xff;
               P1DIR=0x02;
               PICTL = 0x02;
    P1IEN=0x0c;
               IEN2=0x10;
               EA=1;
      
                while(1)
                 {
                 }
        }

  • 谢谢了,大秦正声,在单片机上运行的程序我也做过,并且可以使用,但是在协议栈上就不行了,不知道是怎么回事,可以在帮忙看看吗?

  • 估计老外的库函数有问题!

  • http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/p/68255/161765.aspx#161765 请看我原来回答的帖子,帖子是将P0的按键换成P1的。

    另外老外的函数看起来拐弯很多,但是读懂之后,修改就很通用,只需改挤出宏定义即可。逻辑性很强

  • 谢谢各位了,问题已经解决了,谢谢

  • 请问一下你是怎么解决的?我也遇到了相同的问题,是在centrl中无法正常工作,p1.7根本没办法拉高,设置上升沿中断,其他口,一次向下按键会触发两次中断,但松开时没有中断,谢谢