大家好,最近我在使用TM4C123时,对PFO口不能操作。后来查看,可能是其复用NMI功能,要使用得先将其解锁,才能正常当做IO使用。下面是我的代码,大家帮忙看看,谢谢了!
int main(void)
{
   volatile unsigned long ulLoop;
 
  SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
                               SYSCTL_XTAL_16MHZ); 
 
  /*HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY_DD;
     HWREG(GPIO_PORTF_BASE + GPIO_O_CR) = 0x01; 
 
     GPIOPadConfigSet(GPIO_PORTF_BASE, 0x01,GPIO_STRENGTH_2MA, 
                                         GPIO_PIN_TYPE_STD); 
    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, 0x01);
HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY_DD;
HWREG(GPIO_PORTF_BASE + GPIO_O_CR) = 0x00;
     HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = 0;
 */
      SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); 
      GPIOPadConfigSet(GPIO_PORTF_BASE, 0x02,GPIO_STRENGTH_2MA, 
                                           GPIO_PIN_TYPE_STD); 
      GPIODirModeSet(GPIO_PORTF_BASE, 0x02, GPIO_DIR_MODE_OUT); 
   while(1)
    { 
             GPIO_PORTF_DATA_R |= 0x03;
             for(ulLoop = 0; ulLoop < 200000; ulLoop++)
                     {
                    }
            GPIO_PORTF_DATA_R &= ~(0x03);
             for(ulLoop = 0; ulLoop < 200000; ulLoop++)
                  {
                  }
     }
}
现在的问题是:
(1)当将/* */内容注释掉,PF1口可以正常输出高低电平;
(2)但是添加/* */解锁的代码,此时PF0口并不能输出高低电平,而且它还会影响PF1端口,此时PF1的端口没有信号
(3)我想问问我这样解锁正确吗?哪里还需要修改?
(4)另外我注意到,在Stellaris的库文件包里,inc/gpio.h中,
                  #define GPIO_LOCK_KEY 0x1ACCE551 // Unlocks the GPIO_CR register
                 #define GPIO_LOCK_KEY_DD 0x4C4F434B // Unlocks the GPIO_CR register on
                                                                                                 // DustDevil-class devices and
                                                                                               // later
          但是在对应的器件头文件中,例如lm4f111e5qr.h中
             #define GPIO_LOCK_KEY 0x4C4F434B // Unlocks the GPIO_CR register
        此时编译的时候就会报错,我现在的处理方法是将inc/gpio.h注释掉,因为在代码中并没有用到GPIO_LOCK_KEY,所以这种处理方式合适不?