OpenEdv-开源电子网

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

通用IO中断轮询可以吗?

[复制链接]

1

主题

7

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2012-1-12
在线时间
0 小时
发表于 2012-1-12 17:20:29 | 显示全部楼层 |阅读模式
 ALIENTEK MINISTM32 实验4 外部中断实验,想改成中断轮询,即外部按键按下后,只产生标志位,不跳到中断程序里去。可以吗?我把中断屏蔽寄存器关了(如EXTI->IMR&=~(1<<15)),就不产生标志位了(EXTI_PR寄存器没反应),为什么?怎么操作才是正确的,请指教。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2012-1-12
在线时间
0 小时
 楼主| 发表于 2012-1-12 19:07:00 | 显示全部楼层

怎么操作?请给点提示。

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-1-12 21:35:10 | 显示全部楼层
回复【3楼】doner:
---------------------------------
就是你说的关闭中断屏蔽寄存器.就可以了.
只产生中断,但是并不进入中断函数,而在挂起/请求寄存器中可以查到状态.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2012-1-12
在线时间
0 小时
 楼主| 发表于 2012-1-13 09:33:59 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
int main(void)
{
      u8 i,a;
     Stm32_Clock_Init(9); //系统时钟设置
   delay_init(72);      //延时初始化
   uart_init(72,9600);  //串口初始化 
   LED_Init();           //初始化与LED连接的硬件接口
   EXTIX_Init();        //外部中断初始化
   while(1)
     {
       EXTI->IMR&=~(1<<15);  //关15中断
    EXTI->IMR&=~(1<<13);  //关13中断    
    i=(u8)(EXTI->R);
      printf("R:%d\n",i);
      i=(u8)(EXTI->R>>8);
      printf("R:%d\n",i);
      for(a=0;a<10;a++)
       {
          LED0=!LED0;
          delay_ms(1000);
       }   
   }  
}


我就在实验的主程序把中断13和15关了,用串口打印挂起/请求寄存器前16位的状态。运行程序时,按键KEY0和KEY1,挂起/请求寄存器一直为0。正如我一开始说的,只要屏蔽中断后就不产生中断标志了,什么原因?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-1-13 10:09:49 | 显示全部楼层
回复【5楼】doner:
---------------------------------
没记错的话,13和15线的中断,挂起位在EXTI->R的13和15位吧?
你把它赋值给一个u8型的数据,用手指头数数u8能到第几位?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2012-1-12
在线时间
0 小时
 楼主| 发表于 2012-1-13 10:22:50 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
我printf两次,一次8位。我把16位都打印出来了,全部是0。请再看一次主程序
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-1-13 10:48:34 | 显示全部楼层
void EXTIX_Init(void)
{
RCC->APB2ENR|=1<<2;     //使能PORTA时钟
JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD   

GPIOA->CRL&=0XFFFFFFF0; //PA0设置成输入   
GPIOA->CRL|=0X00000008;   
GPIOA->CRH&=0X0F0FFFFF; //PA13,15设置成输入   
GPIOA->CRH|=0X80800000;     
GPIOA->ODR|=1<<13;     //PA13上拉,PA0默认下拉
GPIOA->ODR|=1<<15;     //PA15上拉

Ex_NVIC_Config(GPIO_A,0,RTIR);  //上升沿触发
Ex_NVIC_Config(GPIO_A,13,FTIR); //下降沿触发
Ex_NVIC_Config(GPIO_A,15,FTIR); //下降沿触发
 
  EXTI->IMR&=~(1<<13); //  关闭line 13上的中断
   EXTI->IMR&=~(1<<15); //  关闭line 15上的中断

MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);    //抢占2,子优先级2,组2
MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2);//抢占2,子优先级1,组2    
}
nt main(void)
{
u16 pr;
  Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);      //延时初始化
uart_init(72,9600);  //串口初始化 
LED_Init();     //初始化与LED连接的硬件接口
EXTIX_Init();  //外部中断初始化
while(1)
{     
pr=EXTI->R;

printf("OK:%x\n",pr);
// delay_ms(1000);   
}  
}
这是我的设置,可以正常查询EXTI->R的13和15位中断标志位.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2012-1-12
在线时间
0 小时
 楼主| 发表于 2012-1-13 11:18:14 | 显示全部楼层
把你的程序复制过去,结果还是一样。无论怎么按按键KEY0和KEY1,串口打印出来的依然是:   OK:0     你在板上硬件试过了吗?
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2012-1-12
在线时间
0 小时
 楼主| 发表于 2012-1-13 11:19:49 | 显示全部楼层
我的按键没问题,测试过其他程序,按键完好。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-1-13 11:46:35 | 显示全部楼层
硬件测试也不行,怪了.
软件仿真可以.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2012-1-12
在线时间
0 小时
 楼主| 发表于 2012-1-13 12:17:14 | 显示全部楼层
对啊,这是个很怪的问题,难道我对中断理解错误?普通单片机的IO中断是可以轮询标志位的。一个IO引脚检测到中断信号,但CPU不去处理,等需要时再查询标志位。单片机的这个功能是很常用的。请帮忙.......
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 19:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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