OpenEdv-开源电子网

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

外部中断执行不正常

[复制链接]

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2011-11-2
在线时间
0 小时
发表于 2011-11-3 00:07:03 | 显示全部楼层 |阅读模式
 参照原子哥的不完全手册调stm32外部中断,按键之后串口不再输出,但二极管的状态不翻转。怎么回事?程序看了好多遍,没发现问题。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-11-3 00:32:37 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2011-11-2
在线时间
0 小时
 楼主| 发表于 2011-11-3 23:26:33 | 显示全部楼层
老师好!我的板子三个按键分别接PA8,PD3,PA0,且一端都接地。端口时钟使能及模式设置都写了。中断配置改成了这样:
GPIOA->ODR|=1<<0;   //PA0上拉
GPIOA->ODR|=1<<8;   //PA8上拉
GPIOD->ODR|=1<<3;   //PD3上拉

Ex_NVIC_Config(GPIO_A,8,FTIR);
Ex_NVIC_Config(GPIO_D,3,FTIR);
Ex_NVIC_Config(GPIO_A,0,FTIR);
MY_NVIC_Init(2,1,EXTI9_5_IRQChannel,2); //user1键(PA8)中断初始化
MY_NVIC_Init(2,1,EXTI3_IRQChannel,2);   //user2键(PD3)中断初始化
MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);   //key_wake键(PA0)中断初始化

中断服务函数如下:
void EXTI0_IRQHander(void) //PA0(wake键)触发的外部中断服务函数
{
  delay_ms(10);     //消抖
if(key_wake==0)
{
led1=!led1;
led2=!led2;
}
EXTI->R=1<<0; //清除line0中断线上的中断标志位
}
 
void EXTI19_5_IRQHand(void)  //PA8(user1键)触发的外部中断服务函数
{
delay_ms(10);
if(key0==0)
led1=!led1;//二极管从led1开始
EXTI->R=1<<8;
}

void EXTI3_IRQHandler(void) //PD3(user2键)触发的外部中断服务函数
{
delay_ms(10);
if(key1==0)
led2=!led2;
EXTI->R=1<<3;
}
问题何在?感谢老师不吝赐教!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-11-4 00:32:22 | 显示全部楼层
回复【3楼】好好学习:
---------------------------------
IO初始化这块,没看到你的设置.
麻烦贴出来,最好就是给整个工程文件(注意删掉垃圾文件).

其次,这种问题,可以用软件仿真,跟踪下结果的.一步步观察,很容易找到问题.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2011-11-2
在线时间
0 小时
 楼主| 发表于 2011-11-4 20:05:17 | 显示全部楼层
仿真执行到中断就只能停止了……工程文件如下:
exti.h代码:
#ifndef _EXTI_H
#define _EXTI_H
void exti_init(void);
#endif

exti.c代码:
#include"exti.h"
#include"led.h"
#include"key.h"
#include"delay.h"
#include"usart.h"
void EXTI0_IRQHander(void) //PA0(wake键)触发的外部中断服务函数
{
  delay_ms(10);     //消抖
if(key_wake==0)
{
led1=!led1;
led2=!led2;
}
EXTI->R=1<<0; //清除line0中断线上的中断标志位
}
 

void EXTI19_5_IRQHand(void)  //PA8(user1键)触发的外部中断服务函数
{
delay_ms(10);
if(key0==0)
led1=!led1;
EXTI->R=1<<8;
}

void EXTI3_IRQHandler(void) //PD3(user2键)触发的外部中断服务函数
{
delay_ms(10);
if(key1==0)
led2=!led2;
EXTI->R=1<<3;
}

void exti_init(void)
{
RCC->APB2ENR|=1<<2; //使能portA时钟
RCC->APB2ENR|=1<<5; //使能portD时钟
JTAG_Set(JTAG_SWD_DISABLE);
//KEY0设置
GPIOA->CRH&=0XFFFFFFF0;   //PA8设置成输入模式
GPIOA->CRH|=0X00000008;   //PA8进一步设置成上下拉输入模式
//KEY1设置
GPIOA->CRL&=0XFFFFFFF0;   //PA0设置成输入模式
GPIOA->CRL|=0X00000008;   //PA0进一步设置成上下拉输入模式
//wake_up设置
GPIOD->CRL&=0XFFFF0FFF;   //PD3设置成输入模式
GPIOD->CRL|=0X00008000;   //PD3进一步设置成上下拉输入模式

GPIOA->ODR|=1<<0;   //PA0上拉
GPIOA->ODR|=1<<8;   //PA8上拉,PA0下拉(默认)
GPIOD->ODR|=1<<3;   //PD3上拉
Ex_NVIC_Config(GPIO_A,8,FTIR);
Ex_NVIC_Config(GPIO_D,3,FTIR);
Ex_NVIC_Config(GPIO_A,0,FTIR);
MY_NVIC_Init(2,1,EXTI9_5_IRQChannel,2); //user1键(PA8)中断初始化
MY_NVIC_Init(2,1,EXTI3_IRQChannel,2);   //user2键(PD3)中断初始化
MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);   //key_wake键(PA0)中断初始化
}


test.c代码:
#include<stm32f10x_lib.h>
#include"sys.h"
#include"usart.h"
#include"delay.h"
#include"led.h"
#include"key.h"
#include"exti.h"
int main()
{
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
led_init();
exti_init();
while(1)
{
printf("ok  ");
delay_ms(1000);
}
}
整个工程编译通过,没贴出来的led.h等都调试通过了,系统代码用的您的。麻烦老师再帮忙看一下。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-11-5 00:50:36 | 显示全部楼层
回复【5楼】好好学习:
---------------------------------
终于找到你的问题了.
你中断函数的名字没写正确.
void EXTI3_IRQHandler(void) 
void EXTI19_5_IRQHand(void)  
void EXTI0_IRQHander(void) 

居然3个handler,都不一样,你牛逼!!!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2011-11-6 12:37:47 | 显示全部楼层
 回复【6楼】正点原子:
---------------------------------
用外部中断搞按键很不错的,可以做到实时性,这点stm32相当不错啊。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-11-6 14:37:14 | 显示全部楼层
什么都用中断,也不好。尽量不用。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2011-11-2
在线时间
0 小时
 楼主| 发表于 2011-11-13 22:29:35 | 显示全部楼层
前几天在忙其他的事,刚调好了。以后还是得先多找自己的问题呵呵……灰常感谢!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 10:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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