5.关于NVIC 和 EXIT的的配置

再次学外部中断然后一下子就把我卡这里了,本来一晚上就能搞懂的,谁知道那天只是比较简单懂了
IO映射,EXIT 和 NVIC 的关系,直到今天才有机会把思路理清一下,深入理解NVIC 和 EXIT 还有IO映射
之间的关系。

/**********************************************************************************************/

1.你不得不知道的IO口映射
  1.关于映射,其实之前我是不是很懂的,之前在用HAL库,其实无形之中就使用了IO口映射,因为是图形化
    操作界面嘛,直接点击EXTI就行了,哪里考虑过这么麻烦的还要设置。废话不多说,下面讨论下怎样进行
    IO口映射设置。
  2.其实映射设置,就又提到了IO端口复用,之前说过的,IO端口如果不进行端口复用那么就只能设置高低电平
    那么还有什么意思呢?一共9组GPIO口在涉及到后面高级应用时不能派上用场,那么这个微处理器基本就是废了,
    所以我很佩服这些微处理器设计者,其实个人感觉吧,关于端口复用也没什么神奇的,无非就是多了一个MUX
    而已,需要用到什么的时候直接选择到相应的功能。
  3.关于32407的端口复用和之前的103等处理器的端口复用有着比较大的差别,使用起来也很是方便,首先我要提
    的是,32407的端口复用大概分为两部分,
    1.一些外设的端口 
    2.EXTI。
    是的,没错,EXTI专门作为一种类型从端口复用分离出去
  4.接下来简单谈下第一种,普通外设的接口实现端口复用,很简单,之前提到过了的,在GPIO端口里面设置,
    需要注意两个寄存器,首先是MODER寄存器,需要设置成复用模式,而不是输入或者输出。最后就是AFRL和AFRH
    这两个寄存器,端口复用高寄存器和端口复用低寄存器,这里就需要看着映射表选择需要的映射。
  5.EXTI映射,我本来以为这个映射会是使用端口复用呢?虽知道差了好多资料发现没找到也不需要像上面介绍的
    那样,这个暂且可以称为伪端口复用,都差不多吧,只不过时从GPIO里面分离出来了而已,下面简单介绍下,
    EXTI其实在ST官方手册里面只有两组寄存器介绍,然而我当初就只找到了一组而已,或许你跟我一样不是那么细心,
    也就只能找到一组,相信我你找到的那组EXTI寄存器只是EXTI的配置,并不是上面提到的伪端口复用,是吧,
    伪端口复用寄存器藏在SYSCFG里面,SYSCFG指的是系统配置控制器,说到这里不得不提下这个SYSCFG系统配置控制器,
    他有三个功能,1.管理关于可执行代码的存储区域的地址重映射,2.选择以太网PHY接口,3.管理GPIO的EXTI的
    中断线连接,然后里面还有一个小东西,叫IO补偿单元。当初刚开始的时候我还以为1.是地址重映射,后来仔细一看,
    发现是关于可执行代码的存储区域的,也就是有关BOOT0.BOOT1的,感觉暂时没什么用,就没管它。下一个是以太网的,
    涉及到比较高端一点的部分,想来是海螺大腿这类人才能搞得,混个眼熟吧,以后用到再来看,然后这个SYSCFG就只剩下
    GPIO的EXTI的伪端口复用了,就是说所有端口都可以做为EXTI的输入,然后集中管理是在这个寄存器,然后懂了吧。
    最后提下关于IO补偿单元,意思是当IO口频率设置为50M / 100M 频率时,有可能IO口会对内部电源造成影响,所以需要这个
    东西进行进行斜率控制,反正感觉ST搞得还挺有意思的,各种看起来鸡肋的东西关键时刻可能会帮你大忙,不管怎样,
    混个眼熟吧!
  6.来对IO映射和端口复用做个总结吧
    其实我觉得映射和端口复用区别并不大,是一个意思吧,只有端口映射了才能复用吧不然谈什么其他后面的。
    如果你需要使用外部中断,首先要先去SYSCFG寄存器里面实现伪端口复用,然后再去EXTI寄存器里面配置(这是后话)
    如果你需要使用到一些其他外设,肯定要使用到端口复用,就必须需要在GPIO里面进行设置,最需要关注是两个
    端口复用寄存器(MODER and  AFRH/L),然后其他设置都和之前需要配置GPIO输出和输入一样

/**********************************************************************************************/ 

2.EXTI外部中断
  其实上面就已经简单介绍过了,在ST官方手册中就那么两处有EXTI的寄存器,所以我想就算是傻瓜都知道怎么配置了吧
  但是就算是这样还是有几点需要讲清楚,很重要,能直接帮助你理解一些看起来很怪的东西
  1.32407ZG这个芯片支持23个外部中断/事件的事件检测线,是吧,看清楚了,并不是23个外部中断/事件,和上面说的每个IO
    都能拿来做EXTI没冲突吧,接下来看下这23个外部中断线到底是什么

    1. 0-15对应个每个GPIO
    2.16-22每个外部中断/事件检测线都对应于一个专门的外部中断,这里就不具体介绍了,可以去看看ST官方手册

  2.接下来就是EXIT寄存器了

    1.IMR     中断屏蔽寄存器
    2.EMR     事件屏蔽寄存器
    3.RTSR    上升沿触发选择寄存器 
    4.FTSR    下降沿触发选择寄存器
    5.SWIER   软件中断事件寄存器(几乎不用)
    6.PR      挂起寄存器
  3.下面简单介绍一下这几个寄存器,很有帮助的
    1.IMR 32位 但是只用到前23位,为什么呢?因为前面EXTI一共提供23个外部中断检测线,所以每位都对应于
      一个检测线,这个寄存器就差不多类似于外部中断使能寄存器了
    2.EMR 同上,也可以称为事件使能寄存器
    3/4.上升或者是下降沿检测,对吧,很简单
    5.几乎用不到 
    6.PR 挂起寄存器,这个也是很重要的寄存器,可读可写,但是只能写入1
      就是说首先作为状态寄存器用,当下降沿触发或者是上升沿触发后,该位会被置1,然后可以用来检测是否发生
      外部中断,然后只能写入1,当写入1时,可以清除该标志位,也就是说,当进入中断后,通过向该位写入1
      来清除标志位,很有用吧,对吧。
  4.差不多就到这里,EXTI比较简单

/**********************************************************************************************/ 
3.令人头疼的NVIC
  /*
    STM32F405xx/07xx 和 STM32F415xx/17xx 具有 82 个可屏蔽中断通道,
    16 个可编程优先级(使用了 4 位中断优先级)
  */
  1.以上这句话来自ST官方手册,我他么,我想吐槽了,这么重要的一点你不想介绍咋的?就提供了两句有用的话,
    407提供了82个可屏蔽中断通道,也就是说有82常用的中断,包括外部中断
  2.然后翻看其他资料,发现CM4支持256个中断,但是常用的只有82个可屏蔽中断,什么是可屏蔽,想必我不必
    多说了吧,也就是说,既然有可屏蔽,那么就肯定有不可屏蔽,这个我们后面再提。
    然后看下NVIC的寄存器和其介绍,这些东西ST官方手册都是没提到的,我也不知道,相同的,SysTick也是没有提到
    寄存器,
    1.ISER[8]  中断使能寄存器
    2.ICER[8]  中断失能寄存器
    3.ISPR[8]  中断挂起寄存器
    4.ICPR[8]  中断解挂寄存器
    5.IAPR[8]  中断激活标志位寄存器
    6.IP[240]  中断优先级控制寄存器
    7.STIR     几乎用不到
  3.下面简单介绍一下这几个寄存器 特别重要
    1.ISER 这里提到过一共有256个中断,但是常用的只有82个中断,ISER为32位寄存器一共有8组,所以正好提供256个中断
      控制,但是只用到前82个因此这个寄存器,只有前面3组用到了的,并且第三组还有空余,分别是ISER[0] 0-31 ,
      ISER[1] 0-31  ISER[3] 0-17,一共82个中断 分布在启动文件里的90 - 171 里面,每行对应一个中断,也就是对应一个
      ISER[]的值;
    2.ICER同上啊 对应的,不过需要注意,这种分开搞得使能与失能寄存器都是要写入1才能执行命令的,写入0无效
    3.ISPR同上啊,通过置1可以使某个中断被挂起,相应执行更高优先级的中断
    4.ICPR同上啊,置1解挂
    5.IAPR同上啊,这个寄存器是只读的,通过读该寄存器某位是否是1可以用来判断该中断是否正在被执行,中断执行完硬件置0
    6.IP 这个寄存器很重要啊,从名字上就可以看到,中断优先级控制寄存器,IP寄存器由240个8位的的寄存器组成,
      相应的,每个中断占一位,一共可表示240位,但是我们只用到了82位,即0-81;然后每个8位可屏蔽的中断并没有
      都使用,只使用了高四位,这高四位又分为抢占优先级和子优先级,这个抢占优先级和子优先级是由SCB->AIRCR
      来决定的,先到这里,解释下SCB->AIRCR
    7.407将中断分为5组,0-4,这个设置是由SCB->AIRSC分配的 具体如下
      组别    AIRCR[10:8]    分配结果
      组0     111            0抢占4响应
      组1     110            1抢占3响应
      组2     101            2抢占2响应
      组3     100            3抢占1响应
      组4     011            4抢占0响应
      然后还有SCB->AIRCR 这个寄存器也是厉害的很,我需要给你们介绍一下,不然操作不成功的
   8.SCB是一个寄存器组,里面定义了很多与内核相关的寄存器,我们只需要关注AIRCR 应用中断和复位控制寄存器
    然后看里面的寄存器定义,31-16位是访问秘钥,很蛋疼的是,任何对该寄存器进行的操作都必须同时写入0X05FA
    否则操作被忽略,然后10-8位是优先级分组,也就是上面提到的
   9.那么,我们可以总结出配置NVCI的一般步骤
     1.首先,SCB->AIRCR 对该寄存器设置分组,同时注意写入秘钥0X05FA
     2.其次设置ISER,使能某个中断
     3.设置IP寄存器分组,设置抢占优先级和子优先级
     4.最后在中断处理函数里面直接处理就行了
  10.需要注意的几点
     第一.如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
     第二.高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
     第三.而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。
差不多就这么多

/**********************************************************************************************/

注 :EXTI目前来说只有按键,但是NVCI却是后面使用中断处理函数必须使用到的,所以有必要解释清楚
     还有在ST官方手册中,介绍的外部中断实现按键是按以下步骤来说的
     1.初始化GPIO
     2.设置EXTI
     3.设置NVIC
     4.最后别忘了在中断处理函数里面执行想要的动作

你可能感兴趣的:(5.关于NVIC 和 EXIT的的配置)