STM32外部中断操作

发布者:sjp5035022最新更新时间:2016-09-25 来源: eefocus关键字:STM32  外部中断 手机看文章 扫描二维码
随时随地手机看文章
内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有76个中断,包括16个内核中断和60个可屏蔽中断,具有16级可编程的中断优先级。

 

NVIC

NVIC  Nested Vectored Interrupt Controller 嵌套向量中断控制。在STM32的标准外设库和MDK定义的中断相关的变量和结构体类型,大多都是以NVIC开头的,例如 NVIC_InitTypeDef 。

NVIC_Type

NVIC寄存器结构体。在MDK380a中,这个结构体是定义在stm32f10x_map.h中,具体的定义如下

typedef struct

{

  vu32 ISER[2];

  u32  RESERVED0[30];

  vu32 ICER[2];

  u32  RSERVED1[30];

  vu32 ISPR[2];

  u32  RESERVED2[30];

  vu32 ICPR[2];

  u32  RESERVED3[30];

  vu32 IABR[2];

  u32  RESERVED4[62];

  vu32 IPR[15];

} NVIC_TypeDef;

 

ISER    Interrupt Set-Enable Register 中断使能寄存器组,两个字,共63位,用了60位,一个位对应一个中断,写1中断有效,写0无意义。

ICER    Interrupt Clear-Enable Register 中断除能寄存器组,也是两个字,和上面的使能寄存器组功能刚好相反,写1中断失效,写0无意义。

ISPR     Interrupt Set-Pending Register 中断挂起控制寄存器组。用了60个位,对应60个中断。写1有效,可以将正在运行的中断挂起,从而执行同级别或者更高级别的中断。写0 无意义。

ICPR    Interrupt Clear-Pending Register 中断解挂寄存器组。和上面的挂起寄存组功能刚好相反。写1有效,写0无意义。

IABR    Interrupt Active Bit Register   中断激活标志位寄存器组。这是一个只读寄存器,通过读这个寄存器,可以知道那个中断正在被执行,对应的位会被置1。中断执行完后对应位清零。

IPR    Interrupt Priority Register  中断优先级寄存器 15个字,共60个字节,每个字节对应一个中断,每个字节只用到了高四位,剩余四位保留。这有效4位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据SCB->AIRCR中中断分组的设置来决定。 

 

 

 

 

 

 

 

 

 

 

 

SCB->AIRCR

STM32的中断分组:STM32将中断分为5个组,组0~4。该分组的设置是由SCB->AIRCR寄存器的bit10~8来定义的。具体的分配关系如下表所示: 组 

AIRCR[10:8] 

bit[7:4]分配情况 

分配结果 

111 

0:4 

0位抢占优先级,4位响应优先级 

110 

1:3 

1位抢占优先级,3位响应优先级 

101 

2:2 

2位抢占优先级,2位响应优先级 

100 

3:1 

3位抢占优先级,1位响应优先级 

011

4:0 

4位抢占优先级,0位响应优先级 

 

通过这个表,我们就可以清楚的看到组0~4对应的配置关系,例如组设置为3,那么此时所有的60个中断,每个中断的中断优先寄存器的高四位中的最高3位是抢占优先级,低1位是响应优先级。每个中断,你可以设置抢占优先级为0~7,响应优先级为1或0。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。

这里需要注意2点: 

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

2,高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。

而在老版本的STM32标准外设库中也是有这样一个stm32f10x_map.h文件的。定义和上面的差不多,不同地方可能就是长度不同。

我现在手里拿的是最新的STM32标准外设库(3.5版),里面已经没有了stm32f10x_map.h这个文件了,要知道stm32f10x_map.h这个文件中定义了所有外设寄存器的结构和内存映射,像各个寄存器的结构体,基址,地址等等。

在新版的STM32的标准外设库中,将这些文件分开定义了,去掉了stm32f10x_map.h这个头文件后,新加入了stm32f10x.h 和core_cm3.h两个头文件。

在core_cm3.h中,定义了:

1. NVIC_Type ,

2. SCB_Type,

3. ITM_Type,

4. InterruptType_Type,

5. MPU_Type,

6. CoreDebug_Type。

在stm32f10x.h ,定义了

7. ADC_TypeDef,

8. BKP_TypeDef,

9. CAN_TxMailBox_TypeDef,

10. CAN_FIFOMailBox_TypeDef,

11. CAN_FilterRegister_TypeDef,

12. CAN_TypeDef,

13. CEC_TypeDef,

14. CRC_TypeDef,

15. DAC_TypeDef,

16. DBGMCU_TypeDef,

17. DMA_Channel_TypeDef,

18. DMA_TypeDef,

19. ETH_TypeDef,

20. EXTI_TypeDef,

21. FLASH_TypeDef,

22. OB_TypeDef,

23. FSMC_Bank1_TypeDef,

24. FSMC_Bank1E_TypeDef,

25. FSMC_Bank2_TypeDef,

26. FSMC_Bank3_TypeDef,

27. FSMC_Bank4_TypeDef,

28. GPIO_TypeDef ,

29. AFIO_TypeDef,

30. I2C_TypeDef,

31. IWDG_TypeDef,

32. PWR_TypeDef,

33. RCC_TypeDef,

34. RTC_TypeDef,

35. SDIO_TypeDef,

36. SPI_TypeDef,

37. TIM_TypeDef,

38. USART_TypeDef,

39. WWDG_TypeDef

而在stm32f10x_map.h中定义了34个类型,和stm32f10x.h 基本相似。

EXTI_TypeDef 

外部中断的设置,还需要配置相关寄存器才可以。下面就介绍外部中断的配置和使用。 

STM32的EXTI控制器支持19个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32的19个外部中断为: 

线0~15:对应外部IO口的输入中断。 

线16:连接到PVD输出。 

线17:连接到RTC闹钟事件。 

线18:连接到USB唤醒事件。 

对于外部中断EXTI控制MDK定义了如下结构体: 

typedef struct 

vu32 IMR; 

vu32 EMR; 

vu32 RTSR; 

vu32 FTSR; 

vu32 SWIER; 

vu32 PR; 

} EXTI_TypeDef; 

在新的标准外设库中,这个结构体的定义位于10x.h中。

 

IMR:中断屏蔽寄存器。这是一个32寄存器。但是只有前19位有效。当位x设置为1时,则开启这个线上的中断,否则关闭该线上的中断。 

EMR:事件屏蔽寄存器,同IMR,只是该寄存器是针对事件的屏蔽和开启。 

RTSR:上升沿触发选择寄存器。该寄存器同IMR,也是一个32为的寄存器,只有前19位有效。位x对应线x上的上升沿触发,如果设置为1,则是允许上升沿触发中断/事件。否则,不允许。 

FTSR:下降沿触发选择寄存器。同PTSR,不过这个寄存器是设置下降沿的。下降沿和上升沿可以被同时设置,这样就变成了任意电平触发了。

SWIER:软件中断事件寄存器。通过向该寄存器的位x写入1,在未设置IMR和EMR的时候,将设置PR中相应位挂起。如果设置了IMR和EMR时将产生一次中断。被设置的SWIER位,将会在PR中的对应位清除后清除。 

PR:挂起寄存器。当外部中断线上发生了选择的边沿事件,该寄存器的对应位会被置为1。0,表示对应线上没有发生触发请求。通过向该寄存器的对应位写入1可以清除该位。在中断服务函数里面经常会要向该寄存器的对应位写1来清除中断请求。  

 

 

IO复用里的外部中断配置寄存器EXTICR

EXTICR在AFIO的结构体中定义,如下: 

typedef struct 

vu32 EVCR; 

vu32 MAPR; 

vu32 EXTICR[4]; 

} AFIO_TypeDef; 

在新的标准外设库中,这个结构体的定义位于10x.h中。

这个结构体存在的原因是 STM32的每个IO都可以配置成中断输入口。但是线0~15:对应外部IO口的输入中断。只有16个。资源就不足了。为了确定是那一组IO的哪个口配置成中断,用到了EXTICR[4]。这虽然是一个32位的数组,但是只用到了16位,四位分成1组,这样就有了16组,从低到高,对应16个IO口,每组的四位数从0-6组成7种状态,对应A—G。

例如,我要设置PA3口为外部中断输入,EXTICR就要这样设置:首先PA3对应的是 EXTICR[0] ,它管口0-3,口3对应的是 EXTICR[0]的15-12位;要设置成PA,对应的就是xx xx xx xx (高16保留) 00 xx xx xx (xx表示4bit).

 

 

 

具体步骤是 :

1. 中断分组,确定系统要使用什么样的中断系统,为后面的整个设置定下基调。落实到寄存器就设置SCB-AIRCR.

2. 设置中断优先级。分完组定下基调就是该设置优先级了。落实到寄存器级别就是设置vu32 IPR[15] 这个数组了。上面提到了,8bit 表示一个中断设置,但是只用到了4个bit, 而且从低到高是对应中断的从低到高。此时你要开启的中断Channel也基本就确定了。设置完成后就确定这个中断的抢占优先级和响应优先级。

3. 开启对应的中断。落实到寄存器就是ISER[2]。60bit从低到高依次排开。至此,嵌套向量中断控制基本设置完成。但是中断还是不能用。因为还没有设置外部中断。

4. 设置外部中断。STM32支持19个外部中断。外部中断占据整个中断系统的低19个位。落实到寄存器就是设置EXTI_TypeDef结构体中的IMR(负责开启事件中断),EMR(负责屏蔽时间中断) RTSR 和FTSR (负责中断方式)。这样设置完后外部中断还是不能用。因为还没有映射到具体IO口。

5. 映射到具体IO口。STM32的设计是每一个IO口都可以充当中断引脚,这一点和51内核的单片机有很大的区别。16个外部中断对应每个端口的16个IO,但是端口可能是A-G,如何确定映射到哪个IO就成了问题。CM3的解决方法是 AFIO_TypeDef结构体中的EXTICR[4]数组来确定。具体思路就是 用这个数组4个元素的低16位,每四位对应一个IO,从低到高一一对应,四位同时变换出7种状态对应端口的A-G。这样IO就确定下来了。

更为严谨步骤是设置完成最后开启中断。剩下的工作就是编写中断服务函数了。

设置完这四个结构体,外部中断就可以用了。

关键字:STM32  外部中断 引用地址:STM32外部中断操作

上一篇:STM32外设库文件分析(V3.5)
下一篇:stm32变更外部晶振时如何配置时钟、以及HSI的使用

推荐阅读最新更新时间:2024-03-16 15:11

STM32通过DMA采集多通道AD
环境: 主机:XP 开发环境:MDK4.23 MCU:STM32F103CBT6 说明: 通过脚PA1,PA2采集AD。每路AD采集10次。 #include ad_driver.h //全局变量 //AD采样存放空间 __IO uint16_t ADCConvertedValue ; //函数 //初始化AD void init_ad(void) { ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; //----
[单片机]
stm32中AT发送可变短信
/******************** (C) COPYRIGHT 2015 ************************** * 文件名 :main.c * 描述 :使用方法: p为要发送的短信内容 * center为手机卡的短信中心 * tel为要发送的手机号的号码 * 串口会打印AT操作的内容 **********************************************************************************/ #include stm32f10x.h #include usart1.h #include wchar.h #include wc
[单片机]
STM32 JTAG失效恢复
昨天调试一块STM32L151的板子,用的是JlinkOB,调试时,出现下面的错误: JLink Error:could not start CPU core. JLink Warning:CPU could not be halted 这个错误出现的原因是,程序中有修改JTAG端口(PA13,PA14)的语句,当把JTAG当做普通IO口时,JLink就不能返回调试信息,JLink就读不回相应寄存器的值了。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_S
[单片机]
STM32笔记(五)---中断应用
一、异常类型 1-1 定义说明 F103 在内核水平上搭载了一个异常响应系统, 支持为数众多的系统异常和外部中断。其中系统异常有 8 个(如果把 Reset 和 HardFault 也算上的话就是 10 个) ,外部中断有 60个。除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。有关具体的系统异常和外部中断可在标准库文件 stm32f10x.h 这个头文件查询到,在 IRQn_Type 这个结构体里面包含了 F103 系列全部的异常声明。 表格 1 系统异常清单 二、NVIC简介 2-1 定义说明 NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯
[单片机]
<font color='red'>STM32</font>笔记(五)---中断应用
STM32F030C6外部中断问题
使用STM32F030C6外部中断的时候碰到一个很奇怪的问题: 1、中断线13一直响应(没有外部触发的这个中断); 2、在debug的时候,按下按键触发中断可以进入中断; 3、但下载到单片机中运行,发现中断没有被触发。 4、debug过程中看到中断触发请求寄存器PR13一直是1; 5、如果把延时函数去掉,debug界面看到中断触发请求寄存器PR13一直是0,其实中断还是一直响应,设置一个断点便知道; 根源问题:打开中断复位时钟函数用错了。这个函数RCC_AHBPeriphResetCmd(RCC_APB2Periph_SYSCFG,ENABLE);改为 RCC_APB2PeriphCl
[单片机]
STM32F030C6<font color='red'>外部中断</font>问题
基于STM32的嵌入式以太网门禁系统设计
  引言   当前,有很多的企业是采用佩戴工作证来完成门禁管理,而且还是采用传统的人工方式完成,不仅容易被人混入,且没有记录,存在各种人为的失误。同时,市场上门禁系统存在传输距离受限制、性能不佳等问题。   随着嵌入式技术日新月异的发展,以及以太网技术的普及,使得基于以太网的嵌入式产品越来越多,发展也越来越快。本文研究的就是采用以太网传输数据和射频芯片识别智能卡相结合的门禁系统,相对于传统的门禁系统,以太网解决了传输距离上的问题。其次,采用了基于80C51内核的射频芯片PN532,使得性能更加稳定。其工作的基本原理是先将智能卡放在门禁系统上,系统读取数据并传送给主芯片STM32进行处理,主芯片处理后再通过以太网协议LwIP将数
[单片机]
基于<font color='red'>STM32</font>的嵌入式以太网门禁系统设计
详解STM32单片机的堆栈
学习STM32单片机的时候,总是能遇到“堆栈”这个概念。分享本文,希望对你理解堆栈有帮助。 对于了解一点汇编编程的人,就可以知道,堆栈是内存中一段连续的存储区域,用来保存一些临时数据。堆栈操作由PUSH、POP两条指令来完成。而程序内存可以分为几个区: 栈区(stack) 堆区(Heap) 全局区(static) 文字常亮区程序代码区 程序编译之后,全局变量,静态变量已经分配好内存空间,在函数运行时,程序需要为局部变量分配栈空间,当中断来时,也需要将函数指针入栈,保护现场,以便于中断处理完之后再回到之前执行的函数。 栈是从高到低分配,堆是从低到高分配。 普通单片机与STM32单片机中堆栈的区别 普通单片机启动时,不需要用bootl
[单片机]
STM32如何高效接收串口数据?
硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0 DMA,直接内存存取,可以用它的双手释放CPU的灵魂,所以,本文通过USART3进行串口收发,接受使用DMA的方式,无需CPU进行干预,当接受完成之后,数据可以直接从内存的缓冲区读取,从而减少了CPU的压力。 具体的代码实现如下: usart_driver.h 封装了接口,数据接收回调函数类型,基本数据结构等; usart_driver.c 函数原型实现,中断服务函数实现等; 拷贝这两个文件即可,可以根据目录下的参考用例,进行初始化。 头文件usart_driver.h已经声明了外部函数可能用到的接口; USART3_DR的地
[单片机]
<font color='red'>STM32</font>如何高效接收串口数据?
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved