本人新手,板子是MINISTM32. 程序如下,是根据例程稍微改了一下。
#include <stm32f10x_lib.h>
#include <delay.h>
#include <led.h>
#include <key.h>
#include <usart.h>
#include <sys.h>
void EXTI0_IRQHandler(void)
{
u8 t=30;
if(key2==1)
{ delay_ms(10);
if(key2==1)
{
while(t--)
{
LED0=!LED0;
LED1=!LED1;
delay_ms(300);
}
}
}
EXTI-> R=1<<0;
}
void EXTI15_10_IRQHandler(void)
{ u8 x=20,y=20;
if(key0==0)
{
delay_ms(10);
if(key0==0)
{
while(x--)
{
LED0=!LED0;
delay_ms(100);
}
}
if(key1==0)
{
delay_ms(10);
if(key1==0)
{
while(y--)
{
LED1=!LED1;
delay_ms(200);
}
}
}
EXTI-> R=1<13;
EXTI-> R=1<15;
break;
}
}
void exti_init(void)
{
RCC->APB2ENR|=1<<2;//使能IOA口时钟使能
JTAG_Set(JTAG_SWD_DISABLE);//关闭 JTAG 和SWD
GPIOA->CRL&=0xfffffff0;
GPIOA->CRL|=0X00000008;
GPIOA->CRH&=0X0F0FFFFF;
GPIOA->CRH|=0X80800000;
GPIOA->ODR|=1<<13;
GPIOA->ODR|=1<<15;
Ex_NVIC_Config(GPIO_A,0,RTIR);
Ex_NVIC_Config(GPIO_A,13,FTIR);
Ex_NVIC_Config(GPIO_A,15,FTIR);
MY_NVIC_Init(0,2,EXTI0_IRQChannel,2);
MY_NVIC_Init(1,2,EXTI15_10_IRQChannel,2);
}
现在问题是:我把抢占优先级设置为EXTI0<EXTI15_10,比如 MY_NVIC_Init(0,2,EXTI0_IRQChannel,2); MY_NVIC_Init(1,2,EXTI15_10_IRQChannel,2);
这个程序就正常,可是实现EXTI0嵌套中断EXTI15_10。
如果反过来把抢占优先级设置为EXTI0<EXTI15_10,比如 MY_NVIC_Init(1,2,EXTI0_IRQChannel,2); MY_NVIC_Init(0,2,EXTI15_10_IRQChannel,2);
程序就不正常了,我试验结果是:按KEY0可以进入中断,再按KEY1或KEY2也可以嵌套中断KEY0,但是执行到这里后,程序就不能返回主程序了。同时按KEY1或KEY2还可以执行。
麻烦高手指点迷津!!!
|