初始化部分的顺序调整下,这里给你个例程看看
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,具体原因我现在还没有完全理解。
初始化部分的顺序调整下,这里给你个例程看看
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,具体原因我现在还没有完全理解。
举报