本小节将以中断优先级为例来介绍基于固件的NVIC编程与测试方法。
1)中断优先级程序测试接线图如图7-1所示。
2)中断优先级程序。
图7-1 中断优先级程序测试接线图
图7-2 创建的interrupts工程
3)在CCS6中创建interrupts工程,如图7-2所示。
4)添加startup_ccs.c文件,然后声明中断服务程序(IntGPIOa、IntGPIOb、IntGPIOc)为外部程序,并将其添加到startup_ccs.c中断向量表的相应位置,如图7-3所示。
图7-3 添加中断服务程序到中断向量表中
5)编译interrupts工程生成可执行的.out格式文件,如图7-4所示。
图7-4 工程编译的结果生成可执行的.out文件
6)在EK-TM4C123GXL板上对程序进行调试与测试。
①调试。
a)单击工具栏中如图7-5所示的图标及TM4C123G.ccxml文件,进入调试视图。
b)首先单击工具栏中的图标连接EK-TM4C123GXL板子,然后单击图标导入.out文件到板中,如图7-6所示。
图7-5 进入调试视图
图7-6 导入编译生成的.out文件到EK-TM4C123GXL中
c)将变量g_ui32GPIOa、g_ui32GPIOb、g_ui32GPIOc和g_ui32Index添加到观察窗口中,如图7-7所示。
d)在如图7-8所示的位置放置一个断点,接着让程序运行到该断点处,再打开PuTTY(COM7、波特率设置为115200Baud)。然后单步执行程序,当执行完UARTprintf("\033[2J中断优先级示例\n")语句后,在PuTTY上出现“中断优先级示例”,说明此前程序运行正确。最后取消该断点。
图7-7 添加到观察窗口中的变量
图7-8 在UARTprintf.处放置断点及单步执行结果
e)相同优先级。在HWREG(NVIC_SW_TRIG)=INT_GPIOC-16和GPIOC中断服务程序中的ROM_GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3,GPIO_PIN_3)、DisplayIntStatus()和HWREG(NVIC_SW_TRIG)=INT_GPIOB-16处各设置一个断点。
当程序单步执行完HWREG(NVIC_SW_TRIG)=INT_GPIOC-16语句后,触发GPIOC中断;在程序单步执行到DisplayIntStatus()时,LED_G(绿色LED)点亮,指示此时已进入GPIOC中断服务程序;当单步执行完DisplayIntStatus()语句时,在PuTTY上的显示序列号为3(GPIOC中断服务程序)的中断被激活,如图7-9所示。(www.xing528.com)
从图7-9的显示与硬件测试结果来看,执行到该断点,激活序列号为3(GPIOC中断服务程序)的中断和点亮LED_G符合该段程序所表达的思想。注意:此时应删除使用过的所有断点,以便后续设置断点之需。
继续单步运行,当程序执行完HWREG(NVIC_SW_TRIG)=INT_GPIOB-16这条语句后,触发GPIOB中断。但由于中断GPIOB和GPIOC为同等优先级,GPIOB中断不能强占GPIOC中断的执行权,因此GPIOB中断被挂起,而GPIOC中断仍处于激活状态,如图7-10所示。
当执行完GPIOC的中断服务程序时(LED_G熄灭),GPIOB中断被激活,继续单步执行指示进入GPIOB中断服务程序的蓝色LED_B被点亮。这时在HWREG(NVIC_SW_TRIG)=INT_GPIOA-16和GPIOA的中断服务程序中的DisplayIntStatus()处各放置一个断点。当程序执行完HWREG(NVIC_SW_TRIG)=INT_GPIOA-16这条语句后,触发GPIOA中断。但由于中断GPIOA和GPIOB为同等优先级,GPIOA中断不能强占GPIOB中断的执行权,因此GPIOA中断被挂起,而GPIOB中断仍处于激活状态,如图7-11所示。
图7-9 单步执行完DisplayIntStatus()后的测试结果
图7-10 GPIOC中断处于激活状态而GPIOB中断被挂起
图7-11 GPIOB中断处于激活状态而GPIOA中断被挂起
当执行完GPIOB的中断服务程序时(LED_B熄灭),GPIOA中断被激活,继续单步执行指示进入GPIOA中断服务程序的红色LED_R被点亮,此时在PuTTY上显示的中断状态如图7-12所示。
f)递减优先级。首先在UARTprintf("\n递减优先级\n")处放置一个断点,让程序运行到递减优先级程序段。再按上述放置断点,当程序执行完HWREG(NVIC_SW_TRIG)=INT_GPIOB-16这条语句后,触发GPIOB中断。但由于GPIOB中断的优先级比GPIOC中断低,因此GPIOB中断被挂起,而GPIOC中断仍处于激活状态,如图7-13所示。
当执行完GPIOC的中断服务程序时(LED_G熄灭),GPIOB中断被激活,继续单步执行指示进入GPIOB中断服务程序的蓝色LED_B被点亮。
当程序执行完HWREG(NVIC_SW_TRIG)=INT_GPIOA-16这条语句后,触发GPIOA中断。但由于GPIOA中断的优先级比GPIOB中断低,因此GPIOA中断被挂起,而GPIOB中断仍处于激活状态,如图7-14所示。
图7-12 GPIOA中断服务程序被激活
图7-13 GPIOC中断处于激活状态而GPIOB中断被挂起
当执行完GPIOB的中断服务程序时(LED_B熄灭),GPIOA中断被激活,继续单步执行指示进入GPIOA中断服务程序的红色LED_R被点亮,此时在PuTTY上显示的中断状态如图7-15所示。
图7-14 GPIOB中断处于激活状态而GPIOA中断被挂起
图7-15 GPIOA中断服务程序被激活
g)递增优先级。首先在UARTprintf("\n递增优先级\n")处放置一个断点,让程序运行到递增优先级程序段。再按上述放置断点,当程序单步执行完HWREG(NVIC_SW_TRIG)=INT_GPIOC-16语句后,触发GPIOC中断;在程序单步执行到DisplayIntStatus()时,LED_G(绿色LED)点亮,指示此时已进入GPIOC中断服务程序,如图7-16所示。
当程序执行完HWREG(NVIC_SW_TRIG)=INT_GPIOB-16这条语句后,触发GPIOB中断。由于GPIOB中断的优先级比GPIOC中断高,强占GPIOC中断的执行权,转而运行GPI-OB中断服务程序(绿色LED_B被点亮,且此时LED_G仍被点亮),如图7-17所示。
图7-16 GPIOC中断服务程序被激活
图7-17 GPIOB中断和GPIOC中断均处于激活状态
当程序执行完HWREG(NVIC_SW_TRIG)=INT_GPIOA-16这条语句后,触发GPIOA中断。由于GPIOA中断的优先级比GPIOB中断高,因此强占GPIOB中断进入GPIOA中断服务程序(红色LED_R被点亮,此时LED_B和LED_G仍被点亮,因此发出白光),如图7-18所示。
图7-18 中断GPIOA、GPIOB和GPIOC均激活
当执行GPIOA、GPIOB和GPIOC中断服务程序时,过程如图7-19所示。
图7-19 递增优先级中断的执行过程
继续单步执行程序,最后的测试结果如图7-20所示。
图7-20 中断优先级示例的测试结果
从以上中断相同优先级、中断递减优先级和递增优先级的单步调试结果来看,程序实现了设计要求达到的效果,对读者加深对中断优先级理解有较好的促进作用。
②硬件测试。将编译生成的.out文件导入到在EK-TM4C123GXL板中,打开PuTTY观察到的中断执行顺序和板载LED的点亮情况,如图7-21所示。
图7-21 在EK-TM4C123GXL板上的测试结果和观察到的现象
在观察相同中断优先级和递减中断优先级时,可以看到这些中断激活和挂起与指示其进入中断服务程序的发光LED对应,当被激活的中断服务程序执行结束后马上去执行被挂起的中断,即形成所谓的背对背(尾链)的中断处理。而在观察递增中断优先级时,可以看到2只LED、3只LED同时发光的现象,这是由于其中断服务程序还没有执行完成就被其他优先级高的中断所强占的结果。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。