[ZLG-MCU] 关于LM3S8962中断优先级设置的问题

[复制链接]
3162|2
 楼主| hhtek 发表于 2008-2-16 20:47 | 显示全部楼层 |阅读模式
程序段1:<br />开机之后设置<br />IntPrioritySet(INT_WATCHDOG,1&lt&lt5);//最高优先级<br />IntPrioritySet(INT_GPIOA,2&lt&lt5);//第二级中断优先级<br />很明显,看门狗的优先级较GPIOA的优先级要高,即看门狗可以中断GPIOA<br /><br />程序段2:<br />开机之后设置,但是没有设置GPIOA的优先等级(即为默认优先级&nbsp;PRI_0&nbsp;为0x00)<br />IntPrioritySet(INT_WATCHDOG,7&lt&lt5);//最高优先级<br />那么问题是:看门狗和GPIOA的中断等级谁更高?<br /><br />-------<br />我的程序中有一个现象:<br />IntPrioritySet(INT_GPIOA,2&lt&lt5);//第二级中断优先级<br />而我的INT_TIMER0A没有设置优先级,按理说应该是GPIOA的中断等级比TIMER0A的高,但是却发现GPIOA的中断服务程序却可以被TIMER0A中断<br /><br />--------<br />请帮忙解释一下上述现象,谢谢<br />
zlgmcu 发表于 2008-2-18 09:00 | 显示全部楼层

贴个中断优先级例程,请参考

#include&nbsp;&nbsp;&quot;hw_types.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_memmap.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_ints.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_sysctl.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_gpio.h&quot;<br />#include&nbsp;&nbsp;&quot;src/interrupt.h&quot;<br />#include&nbsp;&nbsp;&quot;src/sysctl.h&quot;<br />#include&nbsp;&nbsp;&quot;src/gpio.h&quot;<br /><br />#define&nbsp;&nbsp;SysCtlPeriEn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeripheralEnable<br />#define&nbsp;&nbsp;GPIOPinTypeIn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeGPIOInput<br />#define&nbsp;&nbsp;GPIOPinTypeOut&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeGPIOOutput<br />#define&nbsp;&nbsp;GPIOPinIntEn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinIntEnable<br />#define&nbsp;&nbsp;GPIOPinIntClr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinIntClear<br />#define&nbsp;&nbsp;IntMasterEn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntMasterEnable<br />#define&nbsp;&nbsp;IntPriSet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntPrioritySet<br /><br />#define&nbsp;&nbsp;KEY1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIO_PORTA_BASE,&nbsp;GPIO_PIN_2<br />#define&nbsp;&nbsp;LED1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIO_PORTA_BASE,&nbsp;GPIO_PIN_3<br />#define&nbsp;&nbsp;KEY2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIO_PORTB_BASE,&nbsp;GPIO_PIN_2<br />#define&nbsp;&nbsp;LED2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIO_PORTB_BASE,&nbsp;GPIO_PIN_3<br /><br />void&nbsp;&nbsp;timeDelay&nbsp;(unsigned&nbsp;long&nbsp;&nbsp;ulVal)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;while&nbsp;(&nbsp;--ulVal&nbsp;!=&nbsp;0&nbsp;);<br />}<br /><br />int&nbsp;&nbsp;main&nbsp;(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;timeDelay(1500000L);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;开机延迟<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeriEn(SYSCTL_PERIPH_GPIOA);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能GPIOA端口<br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeriEn(SYSCTL_PERIPH_GPIOB);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能GPIOB端口<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeIn(KEY1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置KEY1所在管脚为输入模式<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeOut(LED1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置LED1所在管脚为输出模式<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeIn(KEY2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置KEY2所在管脚为输入模式<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeOut(LED2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置LED2所在管脚为输出模式<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinWrite(LED1,&nbsp;0x08);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;熄灭LED1<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinWrite(LED2,&nbsp;0x08);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;熄灭LED2<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOIntTypeSet(KEY1,&nbsp;GPIO_LOW_LEVEL);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置KEY1所在管脚为低电平触发中断<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOIntTypeSet(KEY2,&nbsp;GPIO_LOW_LEVEL);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置KEY2所在管脚为低电平触发中断<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;IntPriSet(INT_GPIOA,&nbsp;(1&nbsp;&lt&lt&nbsp;5));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置KEY1所在的GPIOA中断优先级为1<br />&nbsp;&nbsp;&nbsp;&nbsp;IntPriSet(INT_GPIOB,&nbsp;(2&nbsp;&lt&lt&nbsp;5));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置KEY2所在的GPIOB中断优先级为2<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinIntEn(KEY1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能KEY1所在管脚的中断<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinIntEn(KEY2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能KEY2所在管脚的中断<br />&nbsp;&nbsp;&nbsp;&nbsp;IntEnable(INT_GPIOA);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能GPIOA总中断<br />&nbsp;&nbsp;&nbsp;&nbsp;IntEnable(INT_GPIOB);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能GPIOB总中断<br />&nbsp;&nbsp;&nbsp;&nbsp;IntMasterEn(&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能处理器中断<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(;;)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;死循环,等待按键中断的产生<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />//&nbsp;GPIOA的中断服务函数<br />void&nbsp;&nbsp;GPIO_Port_A_ISR&nbsp;(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinIntClr(KEY1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清除LEY1中断<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinWrite(LED1,&nbsp;0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;点亮LED1<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(;;)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;死循环,不退出中断服务函数<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />//&nbsp;GPIOB的中断服务函数<br />void&nbsp;&nbsp;GPIO_Port_B_ISR&nbsp;(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinIntClr(KEY2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清除LEY2中断<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinWrite(LED2,&nbsp;0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;点亮LED2<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(;;)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;死循环,不退出中断服务函数<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />(zlgmcu_wdx)
zlgmcu 发表于 2008-2-18 09:02 | 显示全部楼层

程序工作原理

在程序运行后,如果先按KEY1点亮LED1,再按KEY2时LED2不亮,原因是KEY1优先级比KEY2优先级高,KEY2中断无法打断KEY1中断。<br />相反,如果先按KEY2点亮LED2,再按KEY1时则能够点亮LED1,这说明较高级的KEY1中断能够打断较低级的KEY2中断。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

23

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部