大家好,最近我在使用TM4C123时,对PFO口不能操作。后来查看,可能是其复用NMI功能,要使用得先将其解锁,才能正常当做IO使用。下面是我的代码,大家帮忙看看,谢谢了!
int main(void)
[
vola
tile 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,所以这种处理方式合适不?