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.

关于TM4C123G 外部中断设置的问题



作为控制器,我希望TM4C123G可以接收来自其他传感器的高电位中断信号。所以我设置了PD7作为中断接收点。可是在运行过程中似乎并没有实现。

并且我也有在startup里注册中断程序  并且我的UART中断是可以正常工作的,所谓的高电位中断,端口要接受到的电压超过多少才算高电位呢?在D7口与传感器管脚之间,还需要增加电阻之类的东西吗?

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);                                                          //使能PORT D

GPIODirModeSet(GPIO_PORTD_BASE, GPIO_PIN_7, GPIO_DIR_MODE_IN);            //设置D7为中断输入

GPIOIntRegister(GPIO_PORTD_BASE, PortDIntHandler);                                                 //注册中断程序

GPIOPinTypeGPIOInput(GPIO_PORTD_BASE, GPIO_PIN_7);                                         //设置D7为中断输入

GPIOIntTypeSet(GPIO_PORTD_BASE, GPIO_PIN_7 , GPIO_HIGH_LEVEL);               //设置D7高电位时中断

GPIOIntEnable(GPIO_PORTD_BASE, GPIO_PIN_7);                                                         //使能D7的中断

IntEnable(INT_GPIOD);

IntMasterEnable();

是不是还少了什么? 望各位前辈斧正!

  • 初始化部分的顺序调整下,这里给你个例程看看

    M4C123G 所有的外设接口都可以设置成外部中断源。下面以一个例子来说明。
    
    下面这个例程PD6和PD7作为中断源,分别接按钮;PF1和PF3分别驱动一个LED灯;当按下其中一个按钮时,可以驱动一个LED灯点亮。
    
    首先设置时钟,使用LED驱动端全能输出:
    
        // 设置系统主频
    
        SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN
    
                | SYSCTL_XTAL_16MHZ);
    
        // Enable and configure the GPIO port for the LED operation.
    
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    
    (似乎用的外设,都必须先使能,这个印象中看到过说明,这些外设默认是不能用,要想用到这些外设,必须先使能)
    
    下面这个代码是使相应LED驱动端为输出。
    
        GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,RED_LED|BLUE_LED|GREEN_LED);
    
    下面介绍如何设置外部中断:
    
    void Init_Int_Key() {
    
     
    
        // Make PD6/7 an output.
    
    使能外部中断源外设:
    
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    
    按钮接入端设置为输入:
    
        GPIODirModeSet(GPIO_PORTD_BASE, GPIO_PIN_6 | GPIO_PIN_7, GPIO_DIR_MODE_IN);
    
    端口设置功率和弱上拉:
    
        GPIOPadConfigSet(GPIO_PORTD_BASE, GPIO_PIN_6 | GPIO_PIN_7, GPIO_STRENGTH_2MA,    GPIO_PIN_TYPE_STD_WPU);
    
    中断设置为低电平触发:
    
        GPIOIntTypeSet(GPIO_PORTD_BASE, GPIO_PIN_6 | GPIO_PIN_7, GPIO_LOW_LEVEL);
    
    使能相应端口中断
    
        GPIOIntEnable(GPIO_PORTD_BASE, GPIO_PIN_6 | GPIO_PIN_7);
    
    使能中断:
    
        IntEnable(INT_GPIOD);
    
    这个应该是使能全局中断:
    
        IntMasterEnable();
    
    (不理解为什么要设置这么多中断)
    
    下面是清除相应端口中断标志:
    
        GPIOIntClear(GPIO_PORTD_BASE, GPIO_PIN_6 | GPIO_PIN_7);
    
    }
    
    下面这一段是中断响应程序,比较易理解,这里只是贴出。
    
    void Int_GPIO_D_Handler(void)
    
    {
    
           unsigned long ulStatus;
    
           // 读取中断状态
    
           ulStatus = GPIOIntStatus(GPIO_PORTD_BASE, true);
    
           // 清除中断状态
    
           GPIOIntClear(GPIO_PORTD_BASE, ulStatus);
    
           // 如果KEY的中断状态有效
    
           if (ulStatus & GPIO_PIN_7)
    
           {
    
                  // 延时约10ms,消除按键抖动
    
                  SysCtlDelay(10 * (SysCtlClockGet() / 3000));
    
                  // 等待KEY抬起
    
                  while (GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_7) == 0x00);
    
                  // 延时约10ms,消除松键抖动
    
                  SysCtlDelay(10 * (SysCtlClockGet()  / 3000));
    
                  //TODO 逻辑处理
    
    //            if(cur_Col < (NUM_CHAR - 1))
    
    //                   cur_Col++;
    
     
    
                  GPIOPinWrite(GPIO_PORTF_BASE,
    
                                RED_LED|BLUE_LED|GREEN_LED, RED_LED);
    
                  // Delay for a bit
    
                  SysCtlDelay(200000);
    
           }
    
     
    
           if (ulStatus & GPIO_PIN_6)// 如果KEY的中断状态有效
    
           {
    
                  // 延时约10ms,消除按键抖动
    
                  SysCtlDelay(10 * (SysCtlClockGet() / 3000));
    
                  // 等待KEY抬起
    
                  while (GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_6) == 0x00);
    
                  // 延时约10ms,消除松键抖动
    
                  SysCtlDelay(10 * (SysCtlClockGet()  / 3000));
    
                  //TODO 逻辑处理
    
                  //            if(cur_Col > 0)
    
                  //                   cur_Col--;
    
     
    
                  // Turn on the Green LED
    
                  GPIOPinWrite(GPIO_PORTF_BASE,
    
                                RED_LED|BLUE_LED|GREEN_LED, GREEN_LED);
    
                  // Delay for a bit
    
                  SysCtlDelay(200000);
    
           }
    
    }
    
    下面是主程序代码:
    
    int main(void) {
    
    // 设置系统主频
    
    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN
    
                         | SYSCTL_XTAL_16MHZ);
    
    // Enable and configure the GPIO port for the LED operation.
    
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    
    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,RED_LED|BLUE_LED|GREEN_LED);
    
    Init_Int_Key();
    
    while(1)
    
           {
    
           }
    
    }
    
    注意:
    
    1)        包含头文件路径必须要添加,这个在前面已经说明;
    
    2)        必须在工程中添加文件:startup_ccs.c(目前还没有完全理解这个文件工作过程,这里只是提示一下,不做解释);
    
    3)        必须添加一个宏定义:右键工程文件名→Properties→Build→ARMCompiler→Advance Options→Predefined Symbols,在Pre-definge NAME中添加变量:PART_TM4C123GH6PM和TARGET_IS_BLIZZARD_RA1,具体原因我现在还没有完全理解。
  • 找到原因了,我把接收中断的引脚设置成了PC5,然后就神奇的好了,哈哈。 

  • 你这也太诡异了吧,不科学。还是建议你按照上面的例程配置来。