打印

【转】STM32F103系列外部中断EXTI->SWIER的用途

[复制链接]
1988|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
monkeypony|  楼主 | 2015-7-16 11:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这几天碰到外部中断EXTI->SWIER的问题,使人在没有触发中断的情况下,就进入了中断,网上找到了一个很好的帖子,分享如下。


     关于外部中断寄存器EXTI->SWIER的用途,刚开始我也是云里雾里,感觉手册说的不是很清楚。凭借自己对EXTI->SWIER功能的理解,自己写了验证程序,做了一个实验。实验成功了;实验平台是野火mini开发板。

    实验原理是:定义两个中断线EXTI0(PA0)和EXTI13(PC13)用来管理两个按键KEY0和KEY1,然后编写中断服务函数,中断服务函数的思路是,按下KEY0时,在LCD上显示“SWIER+KEY0:”;按下KEY1时就将LCD上显示的“SWIER+KEY0:”清除掉以证明KEY1按键已按下,同时也证明了外部中断线EXTI13已经触发(主函数会有相关的操作)。下面是两个中断服务函数(至于配置和分组函数就不贴出来了):
void EXTI0_IRQHandler(void)    //KEY0按键
{
    if(EXTI_GetITStatus(EXTI_Line0) != RESET)
      {

        LCD_DispStr(20, 80, (uint8_t *)"SWIER+KEY0:", RED);  //显示SWIER+KEY0:
       EXTI_ClearITPendingBit(EXTI_Line0);   
     }  
}

沙发
monkeypony|  楼主 | 2015-7-16 11:34 | 只看该作者
void EXTI15_10_IRQHandler(void)  //KEY1按键
{
   if(EXTI_GetITStatus(EXTI_Line13) != RESET)
   {
       // LCD_DispStr(20, 60, (uint8_t *)"SWIER+KEY1:", RED);
        LCD_DispStr(20, 80, (uint8_t *)"SWIER+KEY0:", WHITE);    //清除LCD显示的SWIER+KEY0:
        EXTI_ClearITPendingBit(EXTI_Line13);     
        EXTI->SWIER=0;  //清除EXTI->SWIER寄存器相应的位,这种写法有点不规范,其实是应该将EXTI->SWIER寄存器的bit13清零即复位
   }  
}

使用特权

评论回复
板凳
monkeypony|  楼主 | 2015-7-16 11:34 | 只看该作者
主函数:
int main(void)
{  u8 m=0;
  LCD_Init();
  LED_GPIO_Config();
  delay_init();
  uart_init(9600);

  EXTI_PC13_Config();
  EXTI_PA0_Config();

  LCD_Clear(0, 0, 240, 320, WHITE);


  EXTI->IMR|=1<<13;//  
  EXTI->EMR|=1<<13;//
  EXTI->SWIER=0;

while( 1 )
{
    m++;
   LCD_DispNumber(100, 100, m, WHITE); //显示m的值
   delay_ms(500);
  if(m==10)
   {
     EXTI->SWIER|=1<<13;  //软件触发中断线13,
      m=0;
   
   }
}

使用特权

评论回复
地板
monkeypony|  楼主 | 2015-7-16 11:34 | 只看该作者
主函数其实很简单,程序运行之后,先按下KEY0按键这时会在LCD上显示“SWIER+KEY0”;同时,在LCD上每隔500ms显示一次m的值,当m等于10的时候程序将 EXTI->SWIER寄存器的bit13位置1,这时就相当于按下KEY1按键只不过是由程序执行的而已,这时LCD上显示的“SWIER+KEY0”会被清除;证明外部中断线EXTI13已经触发。

使用特权

评论回复
5
王大熊| | 2015-7-17 09:29 | 只看该作者
一直搞不懂,这个寄存器的意义是什么呢?除了用了测试,验证中断服务函数外,还可以用来干嘛呢?

使用特权

评论回复
6
angerbird| | 2015-7-17 22:41 | 只看该作者
定义两个中断线EXTI0(PA0)和EXTI13(PC13)用来管理两个按键KEY0和KEY1,然后编写中断服务函数实现。

使用特权

评论回复
7
smilingangel| | 2015-7-18 15:00 | 只看该作者
这个LCD的显示的不应该放到中断程序里面去执行吧。。

使用特权

评论回复
8
smilingangel| | 2015-7-18 15:01 | 只看该作者
能不能的把LCD的显示程序的放到主main函数里面去执行的,在中断里面设置一个标识的就OK啦。

使用特权

评论回复
9
smilingangel| | 2015-7-18 15:02 | 只看该作者
主程序中见到这个标识的被置位了就自动启用LCD显示的就可以啦。

使用特权

评论回复
10
monkeypony|  楼主 | 2015-7-24 07:52 | 只看该作者
smilingangel 发表于 2015-7-18 15:01
能不能的把LCD的显示程序的放到主main函数里面去执行的,在中断里面设置一个标识的就OK啦。 ...

这样也可以的,但最好的办法是定时器扫描。

使用特权

评论回复
11
zhangbo1985| | 2015-7-25 14:54 | 只看该作者
多线程中断的触发很重要,注意中断源的。

使用特权

评论回复
12
monkeypony|  楼主 | 2015-7-29 15:23 | 只看该作者
zhangbo1985 发表于 2015-7-25 14:54
多线程中断的触发很重要,注意中断源的。

多线程的,很复杂。最好不要多线程多优先级,很容易绕死的。

使用特权

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

本版积分规则

133

主题

715

帖子

0

粉丝