中断是一个非常重要的概念,每一个单片机都会有中断。不同的单片机处理中断的方式不同。 Cortex-M4和M3一样,在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。本文不会具体讲中断的概念,只是讲述如何在 LM4F232上应用中断。
采用库函数使用中断。
#include "inc/hw_ints.h"
#include "inc/hw_types.h"
#include "inc/hw_nvic.h"
#include "inc/hw_memmap.h"
#include "driverlib/fpu.h"
#include "driverlib/debug.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#include "driverlib/interrupt.h"
//**********************************
//* 定义一个变量指示LED的开关
//**********************************
static unsigned char ucFlag = true;
//**********************************
//* 保存中断状态
//**********************************
static unsigned long ulIntStatus;
//**********************************
//* 主函数
//**********************************
int main(void)
{
//使能FPU及栈
FPUEnable();
FPULazyStackingEnable();
//
//使用PLL。频率80MHz
//
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |SYSCTL_XTAL_16MHZ);
//
// 使能PORTA和PORTG端口
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
//
// 设置PA口和PG口的状态,PA7为输入,PG5为输出
// 上电点亮LED,并配置PA7口带弱上拉电阻
//
GPIOPinTypeGPIOOutput(GPIO_PORTG_BASE,GPIO_PIN_5);
GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_7);
GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_5,0x20);
GPIOPadConfigSet(GPIO_PORTA_BASE,GPIO_PIN_7,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);
//
// 设置PA7口的中断,高电平触发
//
GPIOIntTypeSet(GPIO_PORTA_BASE, GPIO_PIN_7, GPIO_HIGH_LEVEL);
//
// 设置中断优先级
//
IntPrioritySet(INT_GPIOA, 0x00);
//
// 使能PA口中断
//
IntEnable(INT_GPIOA);
//
// 使能PA7中断
//
GPIOPinIntEnable(GPIO_PORTA_BASE, GPIO_PIN_7);
//
// 总中断使能
//
IntMasterEnable();
//
// 循环等待中断
//
while(1);
}
//**********************************
//* 中断处理函数
//**********************************
void IntGPIOa(void)
{
//
// 获取PA口的中断状态
//
ulIntStatus = GPIOPinIntStatus(GPIO_PORTA_BASE,true);
//
// 清除PA口的中断
//
GPIOPinIntClear(GPIO_PORTA_BASE,ulIntStatus);
ucFlag ? (
GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_5, GPIO_PIN_5),
ucFlag = false
):(
GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_5, !GPIO_PIN_5),
ucFlag = true
);
}
程序看起来比较长,但是其实很简单。程序中大部分语句都给出了说明。主程序一开始就通过锁相环将时钟频率设置在80MHz,其实不设置也行。因为要使用 PA和 PG口,所有先要使能两个端口,给两个端口接通时钟信号。然后就是配置 PA7和PG5 口的方向和状态了。首先将PG5 口设置为输出,然后将 PG5设置为高电平,点亮LED。接下来将 PA7 口设置为输入,但是一定要加上拉电阻,这样给PA7一个确定的状态。以上做好之后就可以设置 PA7 的中断了。首先将 PA7设置为高电平触发,设置中断优先级,然后开中断。开中断的时候要将 PA 口的中断和 PA7的中断都打开,然后开总中断。至此主函数算是写完了。
本例程中,进入中断处理函数后要先将 PA 口的中断清除,然后判断并翻转LED的状态。当然中断处理函数这么做是不妥的,要加入软件或硬件的消抖。软件消抖的做法一般是进入中断后循环等待一段时间然后检测中断源是否还有中断,如果有则确认产生中断,没有则认为是干扰。在程序中加入了一个获取当前中断状态的函数,以便读者理解如何消除抖动。
程序只这么做是不行的。因为要在中断向量表中加入中断处理函数的入口地址,当中断产生时才会跳到中断处理函数中区。在IAR中,打开工程中的startup.C文件,然后做如图7修改
上图中加EXTERN表示外部的程序,后面加程序的名称,也就是入口地址,一定要和终端处理函数的名称相同。然后,将中断向量表中的GPIO PORT A的中断函数入口地址按下图修改:
如上图中IntGPIOa,将原来的中断地址注释掉,添加上自己写的中断处理函数地址。至此该中断表修改完毕,毕竟工程完成了。
[
本帖最后由 youki12345 于 2012-2-3 22:41 编辑 ]