我买了《例说STM32》,对照着书做实验。
现在做外部中断实验,发现一个奇怪的问题。
程序下进去后,有时手指头一靠近按键,灯就开始闪。
这是怎么回事?干扰有这么严重吗?请高手解惑,谢谢!
代码:
void EXTI0_IRQHandler(void)
{
long int i;
for(i=80000;i>0;i--);
if(WK_UP_GET()==1)
{
flag=!flag;
if(flag==0)
{
LED0_SET(0);
LED1_SET(0);
}
else
{
LED0_SET(1);
LED1_SET(1);
}
}
EXTI->PR=1<<0;
}
void EXTI15_10_IRQHandler(void)
{
long int i;
for(i=80000;i>0;i--);
if(KEY0_GET()==1)
{
flag1=!flag1;
if(flag1==0)
{
LED0_SET(0);
//LED1_SET(0);
}
else
{
LED0_SET(1);
//LED1_SET(1);
}
}
EXTI->PR=1<<13;
}
//外部中断配置函数
//只针对GPIOA~G;不包括PVD,RTC和USB唤醒这三个
//参数:GPIOx:0~6,代表GPIOA~G;BITx:需要使能的位;TRIM:触发模式,1,下升沿;2,上降沿;3,任意电平触发
//该函数一次只能配置1个IO口,多个IO口,需多次调用
//该函数会自动开启对应中断,以及屏蔽线
//待测试...
void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)
{
u8 EXTADDR;
u8 EXTOFFSET;
EXTADDR=BITx/4;//得到中断寄存器组的编号
EXTOFFSET=(BITx%4)*4;
RCC->APB2ENR|=0x01;//使能io复用时钟
AFIO->EXTICR[EXTADDR]&=~(0x000F<<EXTOFFSET);//清除原来设置!!!
AFIO->EXTICR[EXTADDR]|=GPIOx<<EXTOFFSET;//EXTI.BITx映射到GPIOx.BITx
//自动设置
EXTI->IMR|=1<<BITx;// 开启line BITx上的中断
//EXTI->EMR|=1<<BITx;//不屏蔽line BITx上的事件 (如果不屏蔽这句,在硬件上是可以的,但是在软件仿真的时候无法进入中断!)
if(TRIM&0x01)EXTI->FTSR|=1<<BITx;//line BITx上事件下降沿触发
if(TRIM&0x02)EXTI->RTSR|=1<<BITx;//line BITx上事件上升降沿触发
}
void EXTI_init(void)
{
KEY_Init();
Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿触发
Ex_NVIC_Config(GPIO_A,13,FTIR); //下降沿触发
MY_NVIC_Init(2,2,EXTI0_IRQn,2); //抢占2,子优先级2,组2
MY_NVIC_Init(2,0,EXTI15_10_IRQn,2); //抢占2,子优先级0,组2
}
int main(void)
{
u8 t;
u8 len;
u16 times=0;
Stm32_Clock_Init(9); //72MHz
delay(1000);
LED_Init();
EXTI_init();
while(1)
{
}
}
|