二.中断控制
1.使能GPIO口
方法如上面所示,使能要用的GPIO口,并设置为输入。
2.设置中断方式
中断方式分为边沿触发、电平触发两大类,共5种。
使用函数GPIOIntTypeSet( )来进行设置。
设置所选GPIO端口指定管脚的中断触发类型
void GPIOIntTypeSet(unsigned long ulPort, unsigned char ucPins, unsigned long ulIntType)
ulPort:所选GPIO端口的基址
ucPins:指定管脚的位组合表示
ulIntType:指定中断触发机制的类型,应当取下列值之一:
GPIO_FALLING_EDGE // 下降沿触发中断
GPIO_RISING_EDGE // 上升沿触发中断
GPIO_BOTH_EDGES // 双边沿触发中断(上升沿和下降沿都会触发中断)
GPIO_LOW_LEVEL // 低电平触发中断
GPIO_HIGH_LEVEL // 高电平触发中断
3.中断的使能(开中断)
(1)使能外设具体中断 使用函数GPIOPinIntEnable( )来实现。
使能所选GPIO端口指定管脚的中断
void GPIOPinIntEnable(unsigned long ulPort, unsigned char ucPins)
ulPort:所选GPIO端口的基址
ucPins:指定管脚的位组合表示
(2)使能片内外设的总中断 使用函数IntEnable( )来实现
使能一个片内外设的中断
void IntEnable(unsigned long ulInterrupt)
ulInterrupt:指定被使能的片内外设中断
(3)使能处理器总中断 使用函数IntMasterEnable( )来实现
使能处理器中断 tBoolean IntMasterEnable(void)
4.编写中断服务函数
(1)中断函数的命名 命名方法有两种,一种是使用GCC下的标准名称,也就是说该中断函数的名字已经是规定好了的,只要拿了用就行。另一种是有用户命名,但是该种方法相对较复杂,需要对新命名的函数进行注册。
(2)中断函数的编写 进入中断函数后首先要进行的工作是对中断状态的查询。因为一个具体的片内外设可能存在多个子中断源,但是都共用同一个中断向量,所以通过查询来确定究竟是哪一个管脚发生了中断。
(2.1)中断查询函数GPIOPinIntStatus( )
获取所选GPIO端口所有管脚的中断状态
long GPIOPinIntStatus(unsigned long ulPort, tBoolean bMasked)
ulPort:所选GPIO端口的基址 bMasked:屏蔽标志,如果是true则返回屏蔽的中断状态,如果是false则返回原始的中断状态
(2.2)中断清除 在进入其中断服务函数后,中断状态并不能自动清除,为防止在退出中断服务函数时会立即再次触发中断而造成混乱,故需对中断进行清除。
中断清除函GPIOPinIntClear( )
清除所选GPIO端口指定管脚的中断
void GPIOPinIntClear(unsigned long ulPort, unsigned char ucPins)
ulPort:所选GPIO端口的基址
ucPins:指定管脚的位组合表示
5.中断优先级
可以通过软件来设置异常的优先级,称为软件优先级。它只可以改变可调整优先级的异常,即除了复位、NMI 和硬件故障异常外,其它中断的优先级都可以通过寄存器配置。异常一旦指定软件优先级后,硬件优先级则无效。软件优先级的设置对复位,NMI,和硬故障无效。它们的优先级始终比其他中断要高。复位(优先级-3),NMI(优先级-2),和硬故障(优先级-1)。用户可设置的最高优先级为0 号优先级,其仅次于复位,NMI 以及硬件故障的第4 优先级。
(1)中断方式 Cortex-M3 处理器其异常可以通过占先、末尾连锁和迟来等处理来降低中断的延迟。这四种方式最大的差别在于中断出现的时刻不同,具体区别如下表所示。
(2)中断优先级的设置 使用函数IntPrioritySet( )来管理一个片内外设的优先级。 函数IntPrioritySet( ) 设置一个中断的优先级
void IntPrioritySet(unsigned long ulInterrupt, unsigned char ucPriority)
ulInterrupt:指定的中断源,具体取值请参考表1.6的描述 ucPriority:要设定的优先级,应当取值(0~7) << 5,数值越小优先级越高
[ 本帖最后由 farme 于 2011-5-8 11:22 编辑 ] |