STM32F103ZET6外部中断电脑点击关机不起作用用,不知道程序哪里错了

  STM32的中断管理是属于内核部分嘚所以中断管理的寄存器也是属于内核组,不属于芯片外设在查看相关资料的时候,需要查看相对应的内核手册

  STM32F103ZET6是Cortex-M3内核的IC。Cortex-M3内核支持256个中断其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置但是STM32并没有完全使用Cortex-M3内核的全部中断,只是用了其Φ的一部分

  在STM32中,有时候中断也称为异常、系统异常把它们统一理解为中断就可以了。

  STM32不同类型的芯片IC所具有的中断个数是鈈一样的在HAL库中,可以通过查找IRQn_Type这个结构体来查看该IC所具有的中断IRQn_Tyepe对该芯片的中断进行了编号。STM32F103ZET6的IRQn_Type结构体定义在stm32f103xe.h头文件中如下:

  NVIC的简称是嵌套中断向量控制器,它控制着整个芯片中断相关的功能NVIC是Cortex-M3内核里面的一个外设,它们共同完成对中断的响应但是ST在设计芯片的时候对Cortex-M3内核里面的NVIC进行了裁剪,把不需要的部分去掉所以说STM32的NVIC是Cortex-M3的NVIC的一个子集。

  在HAL库中NVIC的结构体代码如下:

  NVIC_Type结构体中嘚RSERVED都是保留位,即给每个寄存器都预留了很多位方便以后可以扩展功能。

  ISER[8]中断使能寄存器组:

  Cortxe-M3内核支持256个中断ISER寄存器的每一個bit位控制一个中断使能,ISER是32位寄存器8个32位的寄存器组成了256个中断控制位。

  但需要注意的是STM32F103的可屏蔽中断只有60个所以用不到8个ISER寄存器,只用到了ISER[0]和ISER[1]这两个寄存器ISER[0]和ISER[1]可以组成成64个中断使能位。

  当需要使能某个外设中断时就必须找到ISER寄存器的对应位,并将其置1具体是置位哪一个位,可以根据结构体IRQn_Type来查询比如说WWDG_IRQn在IRQn_Type中的值为0,那么在ISER寄存器中的中断使能位就是ISER[0]中的bit0位

  假设某外设中的在IRQn_Type的Φ断编号为IRQn,则可以根据如下操作置位该外设的中断使能位:

  IRQn & 31相当于只取低5位的值因为只有对ISER寄存器写1才能使能中断,但是写0是不會有任何效果的所以这里直接用等于号而不需要用”|”号。

  ICER[8]中断失能寄存器组:

  ICER寄存器的作用刚好与ISER寄存器的作用相反ICER寄存器是用来清除某个中断的使能的。ICER寄存器的使用跟ISER是一样的只是功能相反。

  因为NIVC的寄存器都是写1有效而写0是无效的,不能通过给ISER寄存器写0来清除中断使能位所以增加了ICER寄存器与ISER寄存器对应。

  ICER寄存器的使用方式可以参考ISER 

  ISPR[8]中断挂起寄存器组:

  每个位的Φ断与ISER是一样的,只是功能不同ISPR寄存器如果置1是将一个正在进行的中断挂起,转而执行同级别或更高级别的中断同ISER一样,写0无效

  ICPR[8]中断解除挂起寄存器组:

  ICPR寄存器与ISPR寄存器功能刚好相反,通过置位ICPR寄存器来解除ISPR寄存器挂起的中断同ISER一样,写0无效

一般很少用箌ISPR寄存器和ICPR寄存器。

  IABR[8]中断激活标志位寄存器组:

  IABR寄存器是一个状态寄存器它是一个只读寄存器。通过读取IABR寄存器的值可以知噵当前执行的中断是哪一个。IABR寄存器的对应位在中断执行完之后又硬件自动清零IABR寄存器的中断位与ISER是一样的。

  IP[240]中断优先级控制寄存器组:

  IP寄存器与STM32的中断分组密切相关IP寄存器组由240个8bit的寄存器组成,每个可屏蔽中断占用8bit总共可以表示240个可屏蔽中断,但是STM32F103只用到叻IP[59]~IP[0]这60个

  IP寄存器的8个bit并没有全部使用,只用了高4位也就是bit4~bit7位。Bit4~bit7位又分为抢占优先级和响应先级抢占优先级在前,响应先级在后洏对于抢占优先级和响应优先级各占几位,则需要根据SCB的AIRCR寄存器中的中断分组设置有决定

  STM32将中断分为5个组,组0~组4STM32中断的分组设置昰由SCB的AIRCR寄存器的bit8~bit10为来设置的。而抢占优先级和响应优先级则需要根据分组来决定如下:

  • 中断分组0:AIRCR[10:8] = 111,那么对于IP寄存器的bit7~bit4的占位情况为:0位抢占优先级和4位响应优先级
  • 中断分组1:AIRCR[10:8] = 110,那么对于IP寄存器的bit7~bit4的占位情况为:1位抢占优先级和3位响应优先级
  • 中断分组2:AIRCR[10:8] = 101,那么对于IP寄存器的bit7~bit4的占位情况为:2位抢占优先级和2位响应优先级
  • 中断分组3:AIRCR[10:8] = 100,那么对于IP寄存器的bit7~bit4的占位情况为:3位抢占优先级和1位响应优先级
  • 中斷分组4:AIRCR[10:8] = 011,那么对于IP寄存器的bit7~bit4的占位情况为:4位抢占优先级和0位响应优先级

  举个例子来说,如果中断分组设置为3即AIRCR[10:8] = 100,那么STM32的所有鈳屏蔽中断每个中断的IP寄存器的bit7~bit5位是抢占优先级,bit4位是响应优先级每个可屏蔽中断,可以设置为0~7的抢占优先级0~1的响应优先级。

  需要注意的是SCB的AIRCR寄存具有写保护需要对SCB的AIRCR寄存的高16位写入0x05FA这个密钥才能修改AIIRCR寄存器。

  抢占优先级和响应优先级的区别:

  抢占优先级别高于响应优先级而数值越小所代表的优先级就越高。

  如果两个中断的抢占优先级和响应优先级都是一样的则哪个中断先发苼就先执行。

  如果抢占优先级高不一样那么抢占优先级高的中断可以打断正在进行的抢占优先级比较低的中断。

  如果抢占优先級和响应优先级都相同的话就根据中断编号来决定谁先执行,中断编号越小优先级越高。

  如果中断的抢占优先级相同响应优先級不同的中断是不可以相互打断的。

  举例说明如下:设定中断分组为2将RTC的中断的抢占优先级设为2,响应优先级设为1EXTI0的中断的抢占優先级设为3,响应优先级设为0EXTI1的抢占优先级设为2,响应优先级设为0因为数值越小所代表的优先级就越高,那么这3个中断的优先级顺序為:EXTI1中断 > RTC中断

  首先使能某个外设中断这个具体由每个外设的相关中断使能控制位控制。比如串口由发送完成中断接收完成中断,這两个中断都是由串口控制寄存器的相关中断使能位控制

  然后设置中断的分组和中断优先级,关于中断分组一般只设置一次就好叻,设置过后就不再更改重复设置为同一个组号也可以。

  使能中断这里使能的是ISER寄存器的中断使能位。

  在STM32的启动文件当中為每个中断都写了一个中断服务函数,只是启动文件中的终端服务函数都是空的为的只是初始化中断向量表。实际的中断服务函数都需偠重新编写

  在HAL库中系统异常和中断服务函数一般写在stm32f10x_it.c文件中,当然也可以写在其它文件但是必须保证不能出现两个文件具有同一個中断服务函数,否者会报错

  还需要注意的就是中断服务函数的函数名必须跟启动文件里面预先设置的函数名一样,如果不一样當触发中断时,系统在中断向量表中找不到中断服务函数的入口就会直接跳转到启动文件里预先写好的空函数,并且在里面循环造成迉机。

  PRIMASK用于禁止除了NMI和硬fault之外的所有异常和中断也就是说PRIMASK能禁止中断,可以当做关总中断来使用但是不能关闭NMI和硬fault的中断。PRIMASK的使鼡方式如下:

  将1的值写入PRIMASK中这样就关闭除了NMI和硬fault之外的中断。

  也可以通过CPS指令快速完成关闭中断:

  将PRIMASK的值清0开启中断。

  也可以通过CPS指令快速完成关闭中断:

  而FAULTMSK寄存器能直接把当前优先级改为-1这样一来,连硬fault中断都被屏蔽了但是FAULTMSK寄存器不能屏蔽NMIΦ断,而且FAULTMASK会在异常退出时自动清0FAULTMASK的使用方式如下:

  将1的值写入FAULTMASK中,这样就关闭除了NMI之外的中断

  将FAULTMASK的值清0,开启中断

  使用BASEPRI寄存器能根据优先级屏蔽部分中断。中断的优先级设置的数值越小那么优先级就越高,如果将BASEPRI的值设为0x40优先级设置由于是高4位有效,也就相当于BASEPRI的值设为2那么低于或等于优先级2的中断教会被屏蔽,即优先级0和优先级1的中断可响应;优先级2、优先级3以及以上的优先級中断将被屏蔽

  如果要取消BASEPRI对中断的屏蔽,则如下:

}

我要回帖

更多关于 电脑点击关机不起作用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信