高级会员

- 积分
- 597
- 金钱
- 597
- 注册时间
- 2014-10-15
- 在线时间
- 138 小时
|
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#楼]
是开发板?
摸的什么脚?
这是感应信号造成的,而端口的输入阻抗太高。
在端口加上拉或者下拉电阻,可以解决。
|