打印
[应用相关]

STM32中断嵌套及外部中断全程攻略

[复制链接]
1372|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
断断续续学习STM32一学期了,时间过的好快,现在对STM32F103系列单片机的中断嵌套及外部中断做一个总结,全当学习笔记。废话不多说,ARM公司的Cortex-m3 内核,支持256个中断,其中包含16个内核中断和240个外部中断,并且具有256级的可编程中断设置。在ST公司的STM32单片机中最多有84个中断,包括16个内核中断(这16个内部中断是任何半导体商也改不了的),和68个可屏蔽中断,具有16级可编程的中断优先级。但是在STM32F103系列中只有60个可屏蔽中断,(107系列有68个)。

使用特权

评论回复
沙发
无法去污粉|  楼主 | 2022-3-25 14:54 | 只看该作者
针对这60个可屏蔽中断,重点掌握它的一个中断优先级寄存器组IPR,全称Interrupt Priority Registers。这个寄存器组包含15个32位的寄存器,一个可屏蔽中断占用8bit,那么一个寄存器可以控制4个可屏蔽中断,一共15*4=60。然而在这占用的8bit中又只使用了高4bit,这高4bit的分配才是STM32F103系列单片机中断嵌套的设置所在。STM32F103系列的中断嵌套分为5个组,分别是0、1、2、3、4  这5个组,下面是5个组与中断嵌套的对应关系。

使用特权

评论回复
板凳
无法去污粉|  楼主 | 2022-3-25 14:55 | 只看该作者

使用特权

评论回复
地板
无法去污粉|  楼主 | 2022-3-25 14:56 | 只看该作者
对于抢占优先级和响应优先级,只需记住两点,第一、抢占任何优先级比都比所有响应优先级优先级高。只有抢占优先级更高的具有中断嵌套功能。(即打断其他正在执行的中断)。第二、数字越小优先级越高 ,抢占优先级和响应优先级都一样时,首先响应中断通道对应中断向量地址低的那个中断。

使用特权

评论回复
5
无法去污粉|  楼主 | 2022-3-25 14:56 | 只看该作者
下面对0组和1组的情况做一个分析。
0组对应是0位抢占优先级,4位响应优先级,那么无抢占优先级,响应优先级可设置为0到15级(2的4次方种)中的任意一种。

使用特权

评论回复
6
无法去污粉|  楼主 | 2022-3-25 14:57 | 只看该作者
1组对应是1位抢占优先级,3位响应优先级,那么抢占优先级只可设置为0级或者1级中的任意一种(2的1次方种),响应优先级可设置为0到7级(2的3次方种)中的任意一种。
上电复位时,中断配置为4组,并且60个外部中断都是抢占优先级为0级,无响应优先级。

使用特权

评论回复
7
无法去污粉|  楼主 | 2022-3-25 14:58 | 只看该作者
外部中断:
STM32F103的外部中断EXTI支持19个外部中断/事件请求。每个中断/事件都有独立的触发和屏蔽设置。
0到15线:对应外部I/O口输入中断
线16:接到PVD输出
线17:接到RCT闹钟事件
线18:接到USB唤醒事件
线16到线18我自己都没用过,主要对线0到15的I/O输入中断做一个总结,有个注意的地方是这0到15线的外部中断,其中0到4线,这5个外部中断都有自己单独的中断响应函数。5到9线公用一个中断服务函数,10到15线公用一个中断服务函数。
外部中断配置寄存器组EXTICR包含4个32位的寄存器,分别是EXTICR0、EXTICR1、EXTICR2、EXTICR3、但每一个寄存器只用了低16位,每4位控制一个I/O口,一个寄存器控制4个I/O口,EXTICR寄存器组控制16个I/O口,刚好一个GPIO的I/O口数。下面以 EXTICR0为例,用一个表格表示:

使用特权

评论回复
8
无法去污粉|  楼主 | 2022-3-25 14:59 | 只看该作者

使用特权

评论回复
9
无法去污粉|  楼主 | 2022-3-25 15:00 | 只看该作者
比如配置GPIOA.0就是将EXTICR0的低4位配置成0000,若配置GPIOB.1就是配置EXTICR0的4到7位,为0001。

使用特权

评论回复
10
无法去污粉|  楼主 | 2022-3-25 15:01 | 只看该作者
这里有一个问题,如果要配置GPIOA.0和GPIOB.0,会引起冲突,不知道是不是分时配置解决的。我用的固体库的方式,不需要考虑这些,呵呵。注意使用固件库时中断复位函数是写在stm32f10x_it.c这个文件里的。

使用特权

评论回复
11
无法去污粉|  楼主 | 2022-3-25 15:03 | 只看该作者
下面结合外部中断附上固件库版本的程序:

主函数里:

void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitSructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //设置为优先级组2

NVIC_InitSructure.NVIC_IRQChannel = EXTI15_10_IRQn;       //定义外部中断线13中断通道
NVIC_InitSructure.NVIC_IRQChannelPreemptionPriority = 0;        //抢占优先级0
NVIC_InitSructure.NVIC_IRQChannelSubPriority = 0;                       //响应优先级0
NVIC_InitSructure.NVIC_IRQChannelCmd = ENABLE;                               //使能指定通道
NVIC_Init(&NVIC_InitSructure);                                                                     

NVIC_InitSructure.NVIC_IRQChannel = EXTI15_10_IRQn;        //定义外部中断线15中断通道
NVIC_InitSructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitSructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitSructure.NVIC_IRQChannelCmd = ENABLE;                               //使能指定通道
NVIC_Init(&NVIC_InitSructure);

NVIC_InitSructure.NVIC_IRQChannel = EXTI0_IRQn;        //定义外部中断线0中断通道
NVIC_InitSructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitSructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitSructure.NVIC_IRQChannelCmd = ENABLE;                               //使能指定通道
NVIC_Init(&NVIC_InitSructure);


}

使用特权

评论回复
12
无法去污粉|  楼主 | 2022-3-25 15:05 | 只看该作者
void EXTI_Configuration(void)
{      
  EXTI_InitTypeDef EXTI_InitStructure;                                                    //初始化结构

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource13);  //指明当前哪个引脚为外部中断触发引脚
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15);

  EXTI_ClearITPendingBit(EXTI_Line13);                                      //清除中断标志位 EXTI_Line13对应相应的中断线13
  EXTI_ClearITPendingBit(EXTI_Line15);

  EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;                            //选择中断模式请求
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;                    //下降沿触发
  EXTI_InitStructure.EXTI_Line = EXTI_Line13|EXTI_Line15;  // 选择待使能的外部中断线
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                                        // 定义选中线的新状态  使能
  EXTI_Init(&EXTI_InitStructure);                     //把EXIT_InitStructure中的每一个参数按缺省值填入

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);     //指明当前哪个引脚为外部中断触发引脚
  EXTI_ClearITPendingBit(EXTI_Line0);  
  EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;                            //选择中断模式请求
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;                    //上升沿触发
  EXTI_InitStructure.EXTI_Line = EXTI_Line0;            // 选择待使能的外部中断线
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                                        // 定义选中线的新状态  使能
  EXTI_Init(&EXTI_InitStructure);                     //把EXIT_InitStructure中的每一个参数按缺省值填入

}

使用特权

评论回复
13
无法去污粉|  楼主 | 2022-3-25 15:06 | 只看该作者


stm32f10x_it.c这个文件里
void EXTI15_10_IRQHandler(void)
{
              if(EXTI_GetITStatus(EXTI_Line13)!=RESET)
        {               GPIO_WriteBit( GPIOA,GPIO_Pin_8,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8))); //LED0翻转
                      EXTI_ClearITPendingBit(EXTI_Line13);
  }
             if(EXTI_GetITStatus(EXTI_Line15)!=RESET)
        {               GPIO_WriteBit( GPIOD,GPIO_Pin_2,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2))); //LED0翻转
                EXTI_ClearITPendingBit(EXTI_Line15);  

  }

}

void EXTI0_IRQHandler(void)
{
          if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
{ GPIO_WriteBit( GPIOA,GPIO_Pin_8,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8))); //LED0翻转
    GPIO_WriteBit( GPIOD,GPIO_Pin_2,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2))); //LED0翻转

  EXTI_ClearITPendingBit(EXTI_Line0);   
}
}

使用特权

评论回复
14
cr315| | 2023-11-3 14:42 | 只看该作者
楼主盖楼辛苦了

使用特权

评论回复
15
Clyde011| | 2023-11-5 07:24 | 只看该作者

然后将其用作在PCB组装过程中放置在另一个板上的独立部件。

使用特权

评论回复
16
公羊子丹| | 2023-11-5 08:17 | 只看该作者

选择测试方法和测试参数是检测过程中的重要步骤

使用特权

评论回复
17
Wordsworth| | 2023-11-5 09:20 | 只看该作者

它产生的噪声是对地噪声

使用特权

评论回复
18
Clyde011| | 2023-11-5 10:23 | 只看该作者

然后在专用站中检查每个半孔,

使用特权

评论回复
19
帛灿灿| | 2023-11-5 12:19 | 只看该作者

抑制各种高速信号产生的电磁波向外发射

使用特权

评论回复
20
Uriah| | 2023-11-5 13:22 | 只看该作者

它们之间的间距应至少为0.5mm。

使用特权

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

本版积分规则

47

主题

732

帖子

1

粉丝