找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2134|回复: 2
打印 上一主题 下一主题
收起左侧

(菜鸟笔记)对比STC单片机说STM32F1xx的外部中断

[复制链接]
跳转到指定楼层
楼主
   在外部中断操作过程中,STM32F引用了‘中断’和‘事件’两个概念,对于俺这样的初学者来说,这两个概念比较容易产生混淆,其实对比STC单片机类似的过程就可以明确加以区分。
    STC单片机的外部中断引脚(INT0、INT1)不仅能通过一系列配置产生外部中断,还可以干预针对引脚T0或T1的脉冲计数,下图是STC单片机INT0中断和T0计数之间的关联逻辑。



    我们用这个图来说明中断和事件的概念。
    从图中可以看出,INT0(P3.2脚)可以独立产生下降沿中断或上升沿/下降沿中断,(后者的意思是上升沿和下降沿都可以产生中断,)也可以不产生中断,仅仅参与T0计数器的脉冲门控制。
    如果INT0用来产生中断,配置TCON寄存器的IT0选择下降沿触发模式或上升沿/下降沿触发模式,再使能IE0和EA,那么它就是一个‘中断’源;如果它是用来控制T0脉冲,进而由T0产生计数溢出中断,那就转而操作T0_GATE和TR0,就可以闭合或断开T0脉冲通道,此时的INT0就是触发T0计数的成因之一,或者说,它是触发T0计数中断的‘事件’之一。
    类似的概念也出现在STM32F1xx当中,但过程要比STC复杂一些。


    图中以PC5和PC9的下降沿作为中断源,它们将通过一个比较复杂的设置通道进入NVIC中断逻辑。这两个下降沿也可以充当事件源,用来产生事件脉冲。
    STM32F1xx的所有GPIO引脚都可以充当‘中断’源或‘事件’源,不像STC那样只有孤零零的INT0和INT1。STM32F1xx把所有的GPIO引脚按位序分成了若干组,也就是PA0、PB0……PG0这7个0序引脚放在一组,直至PA15、PB15……PG15为第15组,总计16个组。通过寄存器设置,每组可以选择其中一个引脚作为‘值日生’产生中断/事件,如此一来,分为16组的112个引脚就可以同时生成7个外部中断请求/事件触发。哦?怎么不是16个中断请求呢?原来0~4组可以生成独立的外部中断/事件EXTI0~EXTI4,而5~9组和10~15组只能各自产生一个外部中断/事件EXTI9_5和EXTI15_10。STM32F1XX把这7个二级中断源/事件源又称为‘中断线’,在手册里叫LINE0~LINE[9:5]、LINE[15:10]。
    某一组从七个引脚中选出一个‘值日生’是寄存器AFIO_EXTICR1~AFIO_EXTICR4的功劳,每个寄存器用4个位EXTIx[3:0]管一组,比方说图中5线组到底选谁是由AFIO_EXTICR2的EXTI5[3:0]的值说了算,当EXTI5[3:0]=0010时,PC5就被选中了,所以AFIO_EXTICR的作用相当于多路选择开关。
    下一关是通过EXTI_RTSR和EXTI_FTSR的TR5和TR9确定边沿触发方式,图中示例是选择下降沿触发。很不幸的是,STM32F1XX虽然可以选定上升沿和下降沿均可触发,但它没有像STC一样的电平触发,这给某些应用带来了不便。
    再往后就进入了‘复杂’的重点区域,造成复杂局面的寄存器有4个:软件中断/事件寄存器EXTI_SWIER、外部中断挂起寄存器EXTI_PR、外部事件屏蔽寄存器EXTI_EMR和外部中断屏蔽寄存器EXTI_IMR。通过这4个家伙,刚才哪些中断线可以像STC一样产生中断请求,也可以以事件源的方式触发脉冲发生器产生事件脉冲。
    EXTI_EMR和EXTI_IMR比较好理解,负责屏蔽EXTI5事件线路的是EXTI_EMR的MR5,负责屏蔽EXTI5中断线路的是EXTI_IMR的MR5,写0将屏蔽所在线路不产生事件或中断。
    最麻烦的是这两个与门前面的EXTI_SWIER和EXTI_PR。
    如果我们想让PC5成为EXTI5之后只产生中断,那么,EXTI_EMR的MR5写0屏蔽事件线路,EXTI_IMR的MR5写1开放中断线路,EXTI_SWIER的SWIER5写0(其实也不用特意写0,因为它的复位值就是0。)EXTI5有效的下降沿通过或门,在图中的位置向下进入与门之后形成EXTI9_5中断线,同时,EXTI_PR的PR5就会自动置1,如果此时NVIC_ISER0的SETENA23为1,就会产生外部中断请求,至于其优先级如何就要看NVIC_IP5的IP[23]是什么值了。
    注意,在上述过程中这个SWIER5千万不要写1,否则不管PC5来没来下降沿,只要EXTI_IMR的MR5=1就会立刻产生EXTI9_5中断请求。这个功能到底是干什么的,俺也没搞明白。
    EXTI_PR其实是一个中断标志寄存器,作用类似于STC单片机TCON中的IE0或IE1。EXTI5有效了,EXTI_PR的PR5就被硬件置1,等NVIC响应这个中断以后,要软件清除它。需要注意的是,清除PR5不是写0,而是写1。
    另外,EXTI_PR和EXTI_SWIER是相互关联的:PR5写1不仅能够清除PR5,还同时清除SWIER5;如果SWIER5写1,则PR5也会被自动置1。 这就是图中想要表达的意思。
    最后说说STM32F1xx搞出来一个EXTI_PR的另外用途。
    如果PC5和PC9要同时产生中断,而它们又处于同一个中断线EXTI9_5上,NVIC的中断响应程序EXTI9_5_IRQHandler咋知道到底是PC5的EXTI5还是PC9的EXTI9呢?当然了,它是不知道的,这就需要在程序中判断EXTI_PR的PR5和PR9到底谁是1了。

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:57414 发表于 2021-6-7 13:52 | 只看该作者
楼主你好,我看你发帖所用到的图片都很精美,请问是您自己画的还是从其它学习资料中截图的?
回复

使用道具 举报

板凳
ID:404881 发表于 2021-6-9 00:08 | 只看该作者
楼主好细心,感谢分享!
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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