你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32学习笔记03—中断架构

[复制链接]
STMCU 发布时间:2020-10-27 14:16
STM32学习笔记03—中断架构



3.1 STM32F103中断概述
       Cortex-M3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32并没有使用Cortex-M3内核的全部东西,而是只用了它的一部分。STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。而我们常用的就是这68个可屏蔽中断,但是STM32的68个可屏蔽中断,在STM32F103ZET6中只有60个。


3.2 STM32F103中断优先级
3.2.1 优先级结构
       STM32F103的中断分为抢占优先级和响应优先级两种,这两种优先级的顺序是抢占优先级高于响应优先级,假设存在两个事件,那就会存在以下几种可能:


(1)情况1:事件1和事件2的抢占优先级都是1,事件1的响应优先级为1,事件2的响应优先级为2,那么事件1和事件2同时发生的时候,CPU优先处理事件1,然后处理事件2;


(2)情况2:事件1和事件2的响应优先级都是1,事件1的抢占优先级为2,事件2的抢占优先级为1,那么,事件1和事件2同时发生的时候,CPU优先处理事件2,然后处理事件1;


(3)情况3:事件1的响应优先级为1,事件2的响应优先级为2,事件1的抢占优先级为2,事件2的抢占优先级为1,当事件1和事件2同时发生的时候,CPU优先处理事件2,然后处理事件1;


       通过上面两种情况,我们可以发现,当抢占优先级一致,谁的响应优先级的数小,谁的优先级就高,中断同时发生的时候CPU就先处理谁;如果抢占优先级不一样,那么无所谓响应优先级,谁的抢占优先级数小,优先级就高,中断同时发生的时候CPU就先处理谁。


       STM32F103的抢占优先级和响应优先级各有4级,即0~3,根据乘法原理,也从侧面反映了16级可编程的中断优先级,并且抢占优先级和响应优先级的数量是可以设置的,通过中断分组来配置,中断分组和优先级数量的对应如下表所示。
1.png

3.2.2 相关寄存器
(1)中断应用和复位控制寄存器:AIRCR
2.png

Bit 31~Bit 16:激活代码,写入0x05FA激活寄存器

Bit 15:指示数据的字节序(这只能在重置后更改)

              0:表示小尾数

              1:表示大字节序

Bit 10~Bit 8:中断优先级分组

Bit 2:请求芯片控制逻辑产生复位

Bit 1:清除所有活动状态信息中的异常

Bit 0:重置Cortex-M3处理器(调试逻辑除外)

(2)中断使能寄存器组:ISER

       在STM32中,ISER寄存器一共有3个,ISER[0]的0到31位对应中断0~31,ISER[1]的0到31位对应中断32~63,ISER[2]的0到3对应中断64~67,如果需要使能某个中断,必须设置对应的ISER位为1,要清除的话可以设置ICER寄存器组对应位为1,或者对ISER写0,但是对于ICER寄存器组写0是不起作用的。

(3)中断优先级控制寄存器组:IP
3.png
对于STM32,优先级控制寄存器IP一共有68个,对应着68个中断,每个寄存器的结构都是相同的,如下图所示。


Bit 7~Bit 6:抢占优先级

Bit 5~Bit 4:响应优先级

3.2.3 中断优先级配置函数

  1. /***************************************************
  2. Name    :NVIC_Init
  3. Function  :设置NVIC
  4. Parameter  :
  5.       PrePriority  :抢占优先级
  6.       SubPriority  :响应优先级
  7.       Channel    :中断编号
  8.       Group    :中断分组 0~4
  9. Return    :None
  10. ***************************************************/
  11. void NVIC_Init( u8 PrePriority, u8 SubPriority, u8 Channel, u8 Group )
  12. {
  13.   u32 temp, temp1 ;
  14.   //设置分组
  15.   temp1 = ( ~Group )&0x07 ;                  //取后三位
  16.   temp1 <<= 8 ;
  17.   temp = SCB->AIRCR ;                    //读取先前的设置
  18.   temp &= 0x0000F8FF ;                    //清空先前分组
  19.   temp |= 0x05FA0000 ;                    //写入钥匙
  20.   temp |= temp1 ;     
  21.   SCB->AIRCR = temp ;                    //设置分组
  22.   //设置优先级
  23.   temp = ( u32 )PrePriority<<( 4-Group ) ;
  24.   temp |= SubPriority&( 0x0f>>Group ) ;
  25.   temp &= 0x0F ;                      //取低四位
  26.   NVIC->ISER[ Channel/32 ] |= ( 1<<Channel%32 ) ;        //使能中断位
  27.   NVIC->IP[ Channel ] |= temp<<4 ;              //设置响应优先级和抢断优先级
  28. }
复制代码


3.3 外部中断EXIT结构
3.3.1 EXIT概述
       外部中断/事件控制器由连接线设备中的多达20个边缘检测器或其他设备中的19个边缘检测器组成,用于生成事件/中断请求。每条输入线可以独立配置以选择类型(事件或中断)和相应的触发事件(上升或下降或两者)。每条线也可以独立屏蔽。

       对于STM32来说,每一个端口都可以配置为外部中断,根据中断信号的类型都可以单独配置上升沿触发或者下降沿触发,中断服务函数相互独立。

3.3.2 EXIT相关寄存器
(1)中断屏蔽寄存器:IMR

4.png
it 19~Bit 0:线x上的中断请求配置位

       0:禁止输入线x上的中断请求
       1:允许输入线x上的中断请求

(2)上升沿触发选择寄存器:RTSR

5.png
it 19~Bit 0:线x上的上升沿触发事件配置位

       0:禁止输入线x上的上升沿触发
       1:允许输入线x上的上升沿触发

(3)下降沿触发选择寄存器:FTSR

6.png
Bit 19~Bit 0:线x上的下降沿触发事件配置位

       0:禁止输入线x上的下降沿触发
       1:允许输入线x上的下降沿触发
(4)外部中断配置寄存器1:EXTIXR1

7.png
EXTIx[3:0]:EXTIx配置(x = 0~3)

0000:PA[x]引脚                 0100:PE[x]引脚                 0001:PB[x]引脚                 0101:PF[x]引脚
0010:PC[x]引脚                 0110:PG[x]引脚                 0011:PD[x]引脚

(5)外部中断配置寄存器2:EXTIXR2

8.png
EXTIx[3:0]:EXTIx配置(x = 4~7)
0000:PA[x]引脚
0100:PE[x]引脚
0001:PB[x]引脚
0101:PF[x]引脚
0010:PC[x]引脚
0110:PG[x]引脚
0011:PD[x]引脚

(6)外部中断配置寄存器3:EXTIXR3

9.png
EXTIx[3:0]:EXTIx配置(x = 8~11)
0000:PA[x]引脚
0100:PE[x]引脚
0001:PB[x]引脚
0101:PF[x]引脚
0010:PC[x]引脚
0110:PG[x]引脚
0011:PD[x]引脚

(7)外部中断配置寄存器4:EXTIXR4

EXTIx[3:0]:EXTIx配置(x = 12~15)
10.png
0000:PA[x]引脚
0100:PE[x]引脚
0001:PB[x]引脚
0101:PF[x]引脚
0010:PC[x]引脚
0110:PG[x]引脚
0011:PD[x]引脚

(8)APB2外设时钟使能寄存器:APB2ENR

11.png
Bit 14:USART1时钟使能(写1开启,写0关闭)
Bit 12:SPI1时钟使能(写1开启,写0关闭)
Bit 11:TIM1时钟使能(写1开启,写0关闭)
Bit 10:ADC2时钟使能(写1开启,写0关闭)
Bit 9:ADC1时钟使能(写1开启,写0关闭)
Bit 6:GPIOE时钟使能(写1开启,写0关闭)
Bit 5:GPIOD时钟使能(写1开启,写0关闭)
Bit 4:GPIOC时钟使能(写1开启,写0关闭)
Bit 3:GPIOB时钟使能(写1开启,写0关闭)
Bit 2:GPIOA时钟使能(写1开启,写0关闭)
Bit 0:辅助功能IO时钟使能(写1开启,写0关闭)

3.3.3 外部中断配置函数



  1. /***************************************************
  2. Name    :EXIT_Config
  3. Function  :外部中断配置
  4. Parameter  :
  5.       GPIOx:0~6,代表GPIOA~G
  6.       BITx:需要使能的位
  7.       TRIM:触发模式
  8.         1:下升沿
  9.         2:上降沿
  10.         3:任意电平触发
  11. Return    :None
  12. ***************************************************/
  13. void EXIT_Config( u8 GPIOx, u8 BITx, u8 TRIM )
  14. {
  15.   u8 EXTADDR ;
  16.   u8 EXTOFFSET ;
  17.   EXTADDR = BITx/4 ;                      //得到中断寄存器组的编号
  18.   EXTOFFSET = ( BITx%4 )*4 ;
  19.   RCC->APB2ENR |= 0x01 ;                    //使能io复用时钟      
  20.   AFIO->EXTICR[ EXTADDR ] &= ~( 0x000F<<EXTOFFSET );      //清除原来设置
  21.   AFIO->EXTICR[ EXTADDR ] |= GPIOx<<EXTOFFSET ;        //EXTI.BITx映射到GPIOx.BITx
  22.   EXTI->IMR |= 1<<BITx ;                    //开启line BITx上的中断
  23.    if( TRIM&0x01 )  EXTI->FTSR |= 1<<BITx ;            //下降沿触发
  24.   if( TRIM&0x02 )  EXTI->RTSR |= 1<<BITx ;            //上升降沿触发
  25. }
复制代码


3.4 其他文件的添加
3.4.1 寄存器定义文件
(1)添加用到的NVIC寄存器组和EXTI寄存器组的定义。

12.png
(2)定义寄存器组地址
13.png
3.4.2 sys.h文件
14.png
上图就是添加子函数声明,为了用于其他文件调用。

3.4.3 sys.c文件
(1)在STM32时钟配置函数之前增加复位时钟和中断的功能,最终函数如下图所示。
15.png
(2)添加刚才的两个子函数
16.png
至此,sys文件里面最基础的函数就全部添加完毕了。


上一篇:
STM32学习笔记02—时钟树架构

收藏 评论1 发布时间:2020-10-27 14:16

举报

1个回答
开发者 回答时间:2020-10-28 16:57:02

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版