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.

关于TM4C123AH6PM的PD7口为何不能进入中断的问题!!!!

Other Parts Discussed in Thread: LM3S818

具体硬件如下叙述:

                          我用 TM4C123AH6PMI的PD7管脚与一个按键相连,PD7又连了一个上拉电阻,和其他的按键管脚接法相同,这里的PD口我只用到了GPIO_PIN_7,其他的0~6都悬空没用上。

软件如下:在keydriver.c的初始化时配置如下

                  #define PB_MASK   ( GPIO_PIN_0 | GPIO_PIN_1) 

                  #define PD_MASK   ( GPIO_PIN_7 )

                  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); 

                 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); 

 GPIODirModeSet(GPIO_PORTB_BASE, PB_MASK,GPIO_DIR_MODE_IN);

 GPIODirModeSet(GPIO_PORTD_BASE, PD_MASK,GPIO_DIR_MODE_IN);

 GPIOPadConfigSet(GPIO_PORTB_BASE, PB_MASK,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD);

 GPIOPadConfigSet(GPIO_PORTD_BASE, PD_MASK,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD);             

   GPIOIntTypeSet(GPIO_PORTB_BASE, PB_MASK,  GPIO_FALLING_EDGE);    

  GPIOIntTypeSet(GPIO_PORTD_BASE, PD_MASK, GPIO_FALLING_EDGE); 

 

  GPIOPinIntEnable(GPIO_PORTD_BASE, PD_MASK);

  GPIOPinIntEnable(GPIO_PORTB_BASE, PB_MASK);   

 

IntEnable( INT_GPIOB );

IntEnable( INT_GPIOD );

IntMasterEnable( );

GPIOPinIntClear(GPIO_PORTD_BASE,PD_MASK);

GPIOPinIntClear(GPIO_PORTB_BASE,PB_MASK); 

 

相应的中断处理函数:

 void GPIOB_ISR (void){

 switch (GPIOPinIntStatus(GPIO_PORTB_BASE, true)){

     case GPIO_PIN_0:{

       delay(200000);if(GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_0)) break;         //¾­¹ý³¤Ê±¼äÑÓʱÈç¹ûΪµÍµçƽ£¬²ÅÉè±ê־λ   

      else {KeyValue = 16;   isr_evt_set(KEY_FLAG, TIDKeyProcess); break;}

        }

  case GPIO_PIN_1:{

   .....

        }

default : break;

}

GPIOPinIntClear(GPIO_PORTB_BASE,PB_MASK);

}

 

 

 void GPIOD_ISR (void){

 switch (GPIOPinIntStatus(GPIO_PORTD_BASE, true)){

     case GPIO_PIN_7:{

       delay(200000);if(GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_7)) break;         //¾­¹ý³¤Ê±¼äÑÓʱÈç¹ûΪµÍµçƽ£¬²ÅÉè±ê־λ   

       else {KeyValue = 10; isr_evt_set(KEY_FLAG, TIDKeyProcess); break;}

        }

default : break;

}

GPIOPinIntClear(GPIO_PORTD_BASE,PD_MASK);

}

 我已经把GPIOB_ISR,GPIOD_ISR放到了启动代码Startup.S相应的位置如下:

...

IMPORT GPIOB_ISR       

  DCD     GPIOB_ISR                   ; GPIO Port B   

IMPORT GPIOC_ISR        

DCD     GPIOC_ISR                   ; GPIO Port C

 IMPORT GPIOD_ISR      

  DCD     GPIOD_ISR                   ; GPIO Port D

...

 

问题就来了:

 我按PB对应的按键就有中断响应,并执行程序,可按PD7的一点反应的都没有,本人还用示波器查看PD7口的电平跳动,

结果是正常跳动的,按下是从高变低的,松开由低变高,电压3.3v,可为什么没有进入到中断处理呢,我有两种怀疑:

  1)PD口的其他脚悬空对PD7的使用有影响,或者不使用的PD管脚口不能悬空,或许PD7的管脚配置和其他的有所不同

  2) PD7口的管脚复用功能对其的影响,可我没有使用PD7口的其他功能呢,NMI功能会不会对PD7口有限制的因素呢,因为这是个很特殊的功能

PD7口复用功能 :   NMI   WT5CCP1  PhB0   M0FAULT1 U2Tx

 

可该PD7口在LM3S818用其他的的管脚代替都能响应呢,可在这个M4芯片的PD7口就不行了,同样配置的其他管脚都能正常运行,这是为何呢?由于本人的学识尚浅,以上描述有所漏洞,未能参透其中的困惑,还请高手更正与指点呢,本人在此谢谢了!!

 

     

  • TM4C芯片中PD.7端口默认为NMI端口模式,如果要使能其GPIO口模式,需要先切换其复用功能。

    请注意这点,很多人都问过这个问题了。

  • 那如何切换回来呢,我不知道调用GPIO哪个函数,好像也没有专门切换模式的函数吧!

  • 楼主可以看看器件手册中GPIO章节commit control内容。

    这些需要通过寄存器来配置的。

  • Commit Control

    The GPIO commit control registers provide a layer of protection against accidental programming of critical hardware peripherals. Protection is provided for the GPIO pins that can be used as the four JTAG/SWD pins (PC[3:0])and theNMIpin (PD7andPF0). Writes to protected bits of the GPIO Alternate Function Select (GPIOAFSEL)register (see page 613),GPIO Pull Up Select (GPIOPUR) register (see page 619),GPIO Pull-Down Select (GPIOPDR)register (see page 621), andGPIO Digital Enable (GPIODEN)register (see page 624) are not committed to storage unless theGPIO Lock (GPIOLOCK)register (see page 626) has been unlocked and the appropriate bits of theGPIO Commit (GPIOCR)register (see page 627) have been set

     我就照着datasheet的来写

    在之前的代码中SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);之后加上了

      HWREG(GPIO_PORTD_BASE+GPIO_O_LOCK) &= (~(0x1<<28));

     HWREG(GPIO_PORTD_BASE+GPIO_O_CR) |= (1<<7);

     HWREG(GPIO_PORTD_BASE+GPIO_O_DEN) |= (1<<7);

     HWREG(GPIO_PORTD_BASE+GPIO_O_PDR) |= (1<<7);

     HWREG(GPIO_PORTD_BASE+GPIO_O_PUR) |= (1<<7);

     HWREG(GPIO_PORTD_BASE+GPIO_O_AFSEL) &= (~(1<<7));

    ......

    我照寄存器器的配置去做了,可是效果没有,不管我怎么配置这几个寄存器,PD7口就是没有中断进入,是不是PD7中断不能按照一般的API函数配置的,要一个一个寄存器来按位操作呢,还是由于PD7的特殊根本没有之前的一般的GPIO口功能的中断操作呢,我必须解决这个问题,因为QEI模块那里,PF0也是有NMI功能的,两信号速度捕获结果出现怎么扭只有增加的,没有减小的,检测不到反方向的,偶尔出现减小,可是在LM3S818中又能正常运行,我怀疑也是NMI在影响着,所以要解决这个问题很棘手难耐,datasheet的commt control   就那几个寄存器了,我怎么配置都不行,我还有一个疑问:照datasheet说的寄存器配置之后再加上一般的GPIO口的中断配置,这样就可以当一般的GPIO口操作了吗,这样的思路对吗,还是另有写法呢?

    不出效果还是本人对这几个寄存器配置不对呢,不过我感觉有点不懂:刚刚配置好PUII-UP寄存器 ,好像又要配置PULL-DOWN寄存器,这不是矛盾了吗?

    至于其中的奥妙还得请高手再多指点呢。

     

     

  • 你用如下代码:

    HWREG(GPIO_PORTD_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY_DD;

    HWREG(GPIO_PORTD_BASE + GPIO_O_CR)  = 0x80;      

    ROM_GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, 0x80);     

    HWREG(GPIO_PORTD_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY_DD;

     HWREG(GPIO_PORTD_BASE + GPIO_O_CR)  = 0x00;  

    HWREG(GPIO_PORTD_BASE + GPIO_O_LOCK) = 0;  

     

     

  • 我用了下面的代码成功了:

    HWREG(GPIO_PORTD_BASE+GPIO_O_LOCK)  |= 0x4C4F434B;  

    HWREG(GPIO_PORTD_BASE+GPIO_O_CR)   |= (1<<7);  

    HWREG(GPIO_PORTD_BASE+GPIO_O_DEN)  &=(~(1<<7));

     HWREG(GPIO_PORTD_BASE+GPIO_O_PDR)  &= (~(1<<7));  

    HWREG(GPIO_PORTD_BASE+GPIO_O_PUR)  &= (~(1<<7));  

    HWREG(GPIO_PORTD_BASE+GPIO_O_AFSEL) &=(~(1<<7));

     

    但是我不知道这样配置,对以后配置回来,就不知道反过来行不行,是不是解锁以后,配置好后,还要锁起来呢,

    我看你只配置GPIO_O_LOCK,GPIO_O_CR这两个寄存器就可以了,其他就会默认和一般的GPIO一样了吗,看来还得试一试才行,那以后配置回来,就

     反过来就行了吧!感谢您的指导!

  • 把Commit寄存器清掉后,

    HWREG(GPIO_PORTD_BASE + GPIO_O_CR)  &=(~(1<<7)); 

    随便对Lock寄存器写下一个值就又锁起来了

    HWREG(GPIO_PORTD_BASE + GPIO_O_LOCK) = 1;