打印
[STM32F1]

STM32外部中断的问题

[复制链接]
647|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
JY-DX-JY|  楼主 | 2015-12-31 11:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我买了《例说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)
        {

               
        }
}

沙发
gejigeji521| | 2015-12-31 11:40 | 只看该作者
那应该是管脚悬空了,需要搞个上拉电阻下来电阻的。看看有没有那个上拉电阻寄存器,配置一下。

使用特权

评论回复
板凳
JY-DX-JY|  楼主 | 2015-12-31 12:37 | 只看该作者
谢谢!用ODR配置了一下,有点效果,不闪了。
但是貌似只有第一次按有反应,从第二次开始就不灵了,灯的状态不变。
还有一个问题:
GPIOA->ODR|=1<<15;                                     //PA15上拉
书上这样写的。可是我查手册:
发现ODR是端口输出数据寄存器。如图:

使用特权

评论回复
地板
JY-DX-JY|  楼主 | 2015-12-31 13:07 | 只看该作者
好了。程序问题。还有那个ODR寄存器的问题哪位大神给解释一下。谢谢!

使用特权

评论回复
5
JY-DX-JY|  楼主 | 2015-12-31 13:16 | 只看该作者
明白了。。。。。。。。。。。。

使用特权

评论回复
6
Thor9| | 2015-12-31 15:24 | 只看该作者
是不是手上的静电产生的影响

使用特权

评论回复
7
JY-DX-JY|  楼主 | 2015-12-31 15:30 | 只看该作者
Thor9 发表于 2015-12-31 15:24
是不是手上的静电产生的影响

有可能。。。。。。。。。。。。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:晴天响霹雳,平地一声雷。

245

主题

3351

帖子

30

粉丝