OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3435|回复: 11

STM32外部中断的问题

[复制链接]

76

主题

187

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2014-10-15
在线时间
138 小时
发表于 2015-12-31 11:23:34 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 chenbingjy 于 2015-12-31 13:15 编辑


     [size=14.399999618530273px]我买了《例说STM32》,对照着书做实验。
[size=14.399999618530273px]现在做外部中断实验,发现一个奇怪的问题。
[size=14.399999618530273px]程序下进去后,有时手指头一靠近按键,灯就开始闪。
[size=14.399999618530273px]这是怎么回事?干扰有这么严重吗?请高手解惑,谢谢!
[size=14.399999618530273px]代码:

[size=14.399999618530273px]void EXTI0_IRQHandler(void)
[size=14.399999618530273px]{
[size=14.399999618530273px]        long int i;
[size=14.399999618530273px]        for(i=80000;i>0;i--);
[size=14.399999618530273px]        if(WK_UP_GET()==1)
[size=14.399999618530273px]        {
[size=14.399999618530273px]                flag=!flag;
[size=14.399999618530273px]                if(flag==0)
[size=14.399999618530273px]                {
[size=14.399999618530273px]                        LED0_SET(0);
[size=14.399999618530273px]                        LED1_SET(0);
[size=14.399999618530273px]                }
[size=14.399999618530273px]                else
[size=14.399999618530273px]                {
[size=14.399999618530273px]                        LED0_SET(1);
[size=14.399999618530273px]                        LED1_SET(1);
[size=14.399999618530273px]                }
[size=14.399999618530273px]               
[size=14.399999618530273px]        }
[size=14.399999618530273px]        EXTI->PR=1<<0;
[size=14.399999618530273px]}

[size=14.399999618530273px]void EXTI15_10_IRQHandler(void)
[size=14.399999618530273px]{
[size=14.399999618530273px]        long int i;
[size=14.399999618530273px]        for(i=80000;i>0;i--);
[size=14.399999618530273px]        if(KEY0_GET()==1)
[size=14.399999618530273px]        {
[size=14.399999618530273px]                flag1=!flag1;
[size=14.399999618530273px]                if(flag1==0)
[size=14.399999618530273px]                {
[size=14.399999618530273px]                        LED0_SET(0);
[size=14.399999618530273px]                        //LED1_SET(0);
[size=14.399999618530273px]                }
[size=14.399999618530273px]                else
[size=14.399999618530273px]                {
[size=14.399999618530273px]                        LED0_SET(1);
[size=14.399999618530273px]                        //LED1_SET(1);
[size=14.399999618530273px]                }
[size=14.399999618530273px]               
[size=14.399999618530273px]        }
[size=14.399999618530273px]        EXTI->PR=1<<13;
[size=14.399999618530273px]}

[size=14.399999618530273px]//外部中断配置函数
[size=14.399999618530273px]//只针对GPIOA~G;不包括PVD,RTC和USB唤醒这三个
[size=14.399999618530273px]//参数:GPIOx:0~6,代表GPIOA~G;BITx:需要使能的位;TRIM:触发模式,1,下升沿;2,上降沿;3,任意电平触发
[size=14.399999618530273px]//该函数一次只能配置1个IO口,多个IO口,需多次调用
[size=14.399999618530273px]//该函数会自动开启对应中断,以及屏蔽线   
[size=14.399999618530273px]//待测试...
[size=14.399999618530273px]void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)
[size=14.399999618530273px]{
[size=14.399999618530273px]        u8 EXTADDR;
[size=14.399999618530273px]        u8 EXTOFFSET;
[size=14.399999618530273px]        EXTADDR=BITx/4;//得到中断寄存器组的编号
[size=14.399999618530273px]        EXTOFFSET=(BITx%4)*4;

[size=14.399999618530273px]        RCC->APB2ENR|=0x01;//使能io复用时钟

[size=14.399999618530273px]        AFIO->EXTICR[EXTADDR]&=~(0x000F<<EXTOFFSET);//清除原来设置!!!
[size=14.399999618530273px]        AFIO->EXTICR[EXTADDR]|=GPIOx<<EXTOFFSET;//EXTI.BITx映射到GPIOx.BITx
[size=14.399999618530273px]        
[size=14.399999618530273px]        //自动设置
[size=14.399999618530273px]        EXTI->IMR|=1<<BITx;//  开启line BITx上的中断
[size=14.399999618530273px]        //EXTI->EMR|=1<<BITx;//不屏蔽line BITx上的事件 (如果不屏蔽这句,在硬件上是可以的,但是在软件仿真的时候无法进入中断!)
[size=14.399999618530273px]        if(TRIM&0x01)EXTI->FTSR|=1<<BITx;//line BITx上事件下降沿触发
[size=14.399999618530273px]        if(TRIM&0x02)EXTI->RTSR|=1<<BITx;//line BITx上事件上升降沿触发
[size=14.399999618530273px]}
[size=14.399999618530273px]void EXTI_init(void)
[size=14.399999618530273px]{
[size=14.399999618530273px]        KEY_Init();
[size=14.399999618530273px]        Ex_NVIC_Config(GPIO_A,0,RTIR);                                                                                                //上升沿触发
[size=14.399999618530273px]        Ex_NVIC_Config(GPIO_A,13,FTIR);                                                                                                //下降沿触发
[size=14.399999618530273px]        MY_NVIC_Init(2,2,EXTI0_IRQn,2);                                                                                                //抢占2,子优先级2,组2
[size=14.399999618530273px]        MY_NVIC_Init(2,0,EXTI15_10_IRQn,2);                                                                                                //抢占2,子优先级0,组2
[size=14.399999618530273px]}

[size=14.399999618530273px]int main(void)
[size=14.399999618530273px]{
[size=14.399999618530273px]        u8 t;
[size=14.399999618530273px]        u8 len;
[size=14.399999618530273px]        u16 times=0;
[size=14.399999618530273px]        
[size=14.399999618530273px]        Stm32_Clock_Init(9);                    //72MHz
[size=14.399999618530273px]  delay(1000);
[size=14.399999618530273px]        LED_Init();
[size=14.399999618530273px]        EXTI_init();
[size=14.399999618530273px]        while(1)
[size=14.399999618530273px]        {

[size=14.399999618530273px]               
[size=14.399999618530273px]        }
[size=14.399999618530273px]}

最佳答案

查看完整内容[请看2#楼]

是开发板? 摸的什么脚? 这是感应信号造成的,而端口的输入阻抗太高。 在端口加上拉或者下拉电阻,可以解决。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11555
金钱
11555
注册时间
2014-4-1
在线时间
1317 小时
发表于 2015-12-31 11:23:35 | 显示全部楼层

是开发板?
摸的什么脚?

这是感应信号造成的,而端口的输入阻抗太高。
在端口加上拉或者下拉电阻,可以解决。


回复

使用道具 举报

76

主题

187

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2014-10-15
在线时间
138 小时
 楼主| 发表于 2015-12-31 12:41:16 | 显示全部楼层
是开发板。按键。
用ODR配置了一下,有点效果,不闪了。
但是貌似只有第一次按有反应,从第二次开始就不灵了,灯的状态不变。
还有一个问题:
GPIOA->ODR|=1<<15;                                     //PA15上拉
书上这样写的。可是我查手册:
发现ODR是端口输出数据寄存器。如图:
回复

使用道具 举报

76

主题

187

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2014-10-15
在线时间
138 小时
 楼主| 发表于 2015-12-31 12:42:56 | 显示全部楼层
3.jpg
回复

使用道具 举报

76

主题

187

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2014-10-15
在线时间
138 小时
 楼主| 发表于 2015-12-31 13:08:10 | 显示全部楼层
好了。程序问题。还有那个ODR寄存器的问题哪位大神给解释一下。谢谢!
回复

使用道具 举报

354

主题

1475

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
8097
金钱
8097
注册时间
2015-10-15
在线时间
2919 小时
发表于 2015-12-31 13:11:28 来自手机 | 显示全部楼层
请删掉内容全面的发帖提醒。
回复

使用道具 举报

76

主题

187

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2014-10-15
在线时间
138 小时
 楼主| 发表于 2015-12-31 13:13:44 | 显示全部楼层
明白了。
回复

使用道具 举报

76

主题

187

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2014-10-15
在线时间
138 小时
 楼主| 发表于 2015-12-31 13:15:12 | 显示全部楼层
openedvadmin 发表于 2015-12-31 13:11
请删掉内容全面的发帖提醒。

没看懂。是说内容前面吗?
回复

使用道具 举报

354

主题

1475

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
8097
金钱
8097
注册时间
2015-10-15
在线时间
2919 小时
发表于 2015-12-31 13:18:38 来自手机 | 显示全部楼层
你这个内容哪里复制来的?全面都是一堆size
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11555
金钱
11555
注册时间
2014-4-1
在线时间
1317 小时
发表于 2015-12-31 13:47:19 | 显示全部楼层
chenbingjy 发表于 2015-12-31 13:08
好了。程序问题。还有那个ODR寄存器的问题哪位大神给解释一下。谢谢!


ODR确实是输出寄存器,不是上拉或下拉的寄存器。
可以把书贴出来吗?


回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11555
金钱
11555
注册时间
2014-4-1
在线时间
1317 小时
发表于 2015-12-31 13:48:31 | 显示全部楼层

另外,你自己能看到LZ位的显示效果吗?
注意管理员的提示。


回复

使用道具 举报

76

主题

187

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2014-10-15
在线时间
138 小时
 楼主| 发表于 2015-12-31 14:05:21 | 显示全部楼层
xuande 发表于 2015-12-31 13:47
ODR确实是输出寄存器,不是上拉或下拉的寄存器。
可以把书贴出来吗?

书不好贴,是纸版的。我搞明白了,手册上有IO口位配置表,如图:
5.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 20:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表