STM32F10x 中断程序(NVIC)

中断是所有单片机的核心,也是单片机中比较难掌握的一块内容,正好我学完中断以后,来做一个总结。
中断一般的类型有两种,第一个是系统异常,是属于内核级别的中断,第二个是外部中断,这是体现在外设方面。管理中断的一个很重要的寄存器是NVIC(嵌套向量中断寄存器)。
对于M3和M4内核的MCU,每个中断的优先级都是用寄存器中的8位来设置的。那就可以产生2^8 = 256个中断,但实际上是用不到这么多的,所以一般的芯片厂商都会做出自己的调制。其中用到最多的ST公司是用了高4位作为中断优先级的配置,这样就可以产生16级的中断。
在NVIC中,其中很重要的就是中断优先级的配置,一般来说,优先级分为抢占优先级和子优先级两种,其中抢占优先级的地位是大于子优先级的,也就是说如果我们配置A中断的抢占优先级大于B中断,那么不管A中断和B中断的子优先级谁高,都先执行A中断。但如果A中断和B中断的抢占优先级是一样的,那么才会比较他们的子优先级,子优先级谁高,那就先执行那一条中断。这样需要阐述一下,优先级的数字越低,优先级越高,也就说如果A的优先级是0,B的优先级的1,那么A的优先级是高于B的优先级的。
那可能有人会问,如果A和B的抢占优先级和子优先级都是一样的,那单片机会先执行哪一个中断呢。这时候就要设计到硬件优先级的概念,前面我们所说的抢占优先级和子优先级都是我们自己在软件上面配置的,其实在单片机上,每个设备都存在自己的硬件优先级,如果当配置的软件优先级完全相同的时候,单片机就会自己首先执行硬件优先级高的中断。关于硬件优先级的查找,我们可以在寄存器手册(当中的嵌套向量中断控制器)里面查看。(下面是我一部分的截图)
在这里插入图片描述

这时候肯定会有人觉得,那是不是内核的中断就一定优先于外设的中断呢,其实不是的,中断的优先级判断还是要通过我们设置的抢占优先级和子优先级来判断,如果一样的话,我们会发现在硬件优先级上面,内核的优先级是高于外设的,所以也只有当我们配置的软件优先级相同的时候,内核的优先级才会高于外设。
前面笔者写到,在STM32里面是控制NVIC_CR寄存器的高四位来设定优先级的。
在这里插入图片描述

这就是STM32的优先级配置的分组,一共分为5类,每一类的区别就是可以设定的抢占优先级和子优先级的个数不一样,比如0类15个数据都是用来设置子优先级的,而4类15个数据都用来设定抢占优先级。

在利用STM32F10X的固件库编程的时候,配置中断的步骤是这样的。
1.先选择优先级的分组
/* 用的是void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);/
这个函数的声明时在misc.h的文件下
2.通过结构体NVIC_InitTypeDef来初始化NVIC
3.在stm32f10x_it.c中编写相应在中断函数
/
这里需要注意的是中断函数的函数名是固定的,是不能更改的,具体的函数名称可以在startup_stm32f1ox_md.s这个文件中找到 */

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
32单片机中断程序编写一般包括以下几个步骤: 1. 定义中断服务程序(ISR):中断服务程序中断响应后执行的程序,它的函数头应该声明为中断函数类型,如void ISR_name(void)。在程序中可以编写具体的中断处理代码。 2. 初始化中断控制器:在程序中需要初始化中断控制器,设置中断允许位、中断优先级等参数。中断控制寄存器的设置可以使用特定的寄存器或者寄存器位进行设置。 3. 设置中断向量表:中断向量表是用来存放中断服务程序入口地址的,每个中断向量都对应一个中断服务程序入口地址。中断向量表的地址在32单片机中是固定的,无需特别设置。 4. 启用中断:在程序中需要启用中断,使得中断控制器可以响应相关中断。具体方法可以使用特定的寄存器或者寄存器位进行设置。 下面是一个简单的例子,演示了如何编写32单片机中断程序: ```c #include <reg51.h> void ISR_name(void) interrupt 0 // 定义中断服务程序中断号为0 { // 中断处理代码 } void main() { // 初始化中断控制器 // 设置中断向量表 // 启用中断 EA = 1; // 启用总中断 EX0 = 1; // 启用外部中断0 while(1) { // 主程序代码 } } ``` 上面的代码中,我们定义了一个名为ISR_name的中断服务程序,并将其与中断号0进行关联。在main函数中,我们启用了中断控制器,并启用了外部中断0。在程序中需要注意的是,中断服务程序的执行会打断主程序的执行,因此需要保证中断服务程序的执行时间尽量短。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值