初级会员

- 积分
- 71
- 金钱
- 71
- 注册时间
- 2018-6-14
- 在线时间
- 19 小时
|
1金钱
本帖最后由 无痕丶 于 2018-6-14 14:34 编辑
这是一个关于外部中断的实验,实验会出现很奇怪的现象,附件里面有小视频。
我按键还没按下,手靠近按键,灯就自己亮了。
这是外部中断配置的代码。
#include "EXTI.h"
#include "LED.h"
#include "delay.h"
#include "stdio.h"
void EXTI_2_4_init(void)
{
//配置PE4(KEY0)和PE2 (KEY2)为浮空输入
RCC->APB2ENR |= (0x1<<6);
//PE2
GPIOE->CRL &= ~(0xf<<4*2);
GPIOE->CRL |= (0x4<<4*2);
//PE4
GPIOE->CRL &= ~(0xf<<4*4);
GPIOE->CRL |= (0x4<<4*4);
//开启复用功能时钟
RCC->APB2ENR |= (0x1<<0);
//外部中断线2
AFIO->EXTICR[0] &= ~(0xf<<4*2);
AFIO->EXTICR[0] |= (0x4<<4*2);
//外部中断线4
AFIO->EXTICR[1] &= ~(0xf<<4*0);
AFIO->EXTICR[1] |= (0x4<<4*0);
//外部中断线2位下降沿触发
EXTI->FTSR |= (0x1<<2);
EXTI->RTSR &= ~(0x1<<2); //关闭上升沿触发
//外部中断线4位下降沿触发
EXTI->FTSR |= (0x1<<4);
EXTI->RTSR &= ~(0x1<<4); //关闭上升沿触发
//开启外部中断触发
EXTI->IMR |= (0x1<<2);
EXTI->IMR |= (0x1<<4);
//配置NVIC
NVIC_SetPriority(EXTI2_IRQn,NVIC_EncodePriority(NVIC_GetPriorityGrouping(),2,4));
NVIC_SetPriority(EXTI4_IRQn,NVIC_EncodePriority(NVIC_GetPriorityGrouping(),2,3));
NVIC_EnableIRQ(EXTI2_IRQn);
NVIC_EnableIRQ(EXTI4_IRQn);
}
void EXTI2_IRQHandler()
{
delay_init(72);
delay_ms(10);
if( EXTI->PR & (0x1<<2))
{
EXTI->PR |= (0x1<<2);
LED1=!LED1;
EXTI->PR |= (0x1<<2);
}
}
void EXTI4_IRQHandler()
{
delay_init(72);
delay_ms(10);
if( EXTI->PR & (0x1<<4))
{
EXTI->PR |= (0x1<<4);
LED0=!LED0;
EXTI->PR |= (0x1<<4);
}
}
图片是按键连接图,用按键测试外部中断。
|
最佳答案
查看完整内容[请看2#楼]
WK_UP默认要设置为下拉,按键未按下时是低电平。按键按下时时高电平。其他三个按键要设置为上拉,按键未按下时为高电平,按键按下时为低电平。中断中用延时就不说了,为啥还要在中断中初始化延时程序。每次进中断都要初始化一次延时程序?
|