在ccs下编译lm4f120h5qr时不能正确进入中断服务函数,想要用PF0中断,初始化如下
void
KEY_Init(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_0); GPIOIntTypeSet(GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_RISING_EDGE); GPIOPinIntEnable(GPIO_PORTF_BASE, GPIO_PIN_0); IntEnable(INT_GPIOF); IntMasterEnable();
}
编写的中断服务函数如下:
void
IntGPIOf(void)
{
unsigned long status;
status = GPIOPinIntStatus(GPIO_PORTF_BASE, true);
GPIOPinIntClear(GPIO_PORTF_BASE, status);
if(status & GPIO_PIN_0)
{
if(RED_luminance<=6000)
{
RED_luminance=RED_luminance+500;
RGB_Set(R,RED_luminance);
}
else
{
RED_luminance=0;
RGB_Set(R,RED_luminance);
}
}
}
是中断服务函数的名称有问题吗?应该怎么命名?非常感谢专家能够帮助解答!
repo:
回复 step by step:
非常感谢,已经把output改成了input,关于nmi问题还得感谢。
maoxin xu:
回复 step by step:
在startup_CCS.C中我的修改如下:
////*****************************************************************************void ResetISR(void);static void NmiSR(void);static void FaultISR(void);static void IntDefaultHandler(void);
void GPIO_PORT_F_ISR(void);//
。。。。。。。
IntDefaultHandler, // FLASH Control GPIO_PORT_F_ISR, // GPIO Port F
IntDefaultHandler, // GPIO Port G
但是还是进不了中断函数
void GPIO_PORT_F_ISR(void)
整个代码如下:
#include "inc/hw_ints.h"#include "inc/hw_memmap.h"#include "inc/hw_types.h"
#include "driverlib/sysctl.h"#include "driverlib/interrupt.h"#include "driverlib/gpio.h"
void enable_led_port(){ SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_1);}
void enable_key_port(){
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); GPIOPadConfigSet(GPIO_PORTF_BASE,GPIO_PIN_4,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU); //GPIOPinTypeGPIOInput(GPIO_PORTF_BASE,GPIO_PIN_4); GPIODirModeSet(GPIO_PORTF_BASE,GPIO_PIN_4,GPIO_DIR_MODE_IN);}
/*void register_key_isr(){ // IntRegister(INT_GPIOF,GPIO_PORT_F_ISR); //GPIOPortIntRegister(GPIO_PORTF_BASE,GPIO_PORT_F_ISR);}*/
void enable_key_interrupt(){ GPIOIntTypeSet(GPIO_PORTF_BASE,GPIO_PIN_4,GPIO_FALLING_EDGE);
GPIOPinIntEnable(GPIO_PORTF_BASE,GPIO_PIN_4); IntEnable(INT_GPIOF); IntMasterEnable(); }
void main(){ //// 40 MHz system clock SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
enable_led_port(); enable_key_port(); //register_key_isr(); enable_key_interrupt();
while(1);}
void GPIO_PORT_F_ISR(void){
unsigned char ucVal; unsigned long ulStatus; ulStatus = GPIOPinIntStatus(GPIO_PORTB_BASE, true); // 读取中断状态 GPIOPinIntClear(GPIO_PORTB_BASE, ulStatus); // 清除中断状态,重要 if (ulStatus & GPIO_PIN_4) // 如果KEY的中断状态有效 { ucVal = GPIOPinRead(GPIO_PORTF_BASE,GPIO_PIN_1); // 翻转LED GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, ~ucVal); SysCtlDelay(100000); // 延时约10ms,消除按键抖动 while (GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_4) == 0x00); // 等待KEY抬起 SysCtlDelay(100000); // 延时约10ms,消除松键抖动 }
}
step by step:
回复 maoxin xu:
楼主可以参考一下下面的代码:
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
ROM_GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_4); ROM_GPIOPinIntEnable(GPIO_PORTF_BASE, GPIO_PIN_4); ROM_GPIOIntTypeSet(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_FALLING_EDGE); ROM_IntEnable(INT_GPIOF);
ROM_IntMasterEnable();