stm32中断(NVIC与EXTI)说课讲解

合集下载

STM32事件中断事件中断的详解

STM32事件中断事件中断的详解

STM32事件中断事件中断的详解凡从事过ST MCU应用开发的人往往会遇到事件、中断事件中断三个概念或术语。

这三个概念彼此关联,有时会让人有点混淆或犯迷糊。

先拿一件生活中的事情打比方对上述三个概念做个基本的粗略理解,之后再分享一个STM32 GPIO外部中断配置案例。

比如一老师在教室里给学生们上课。

课堂上的学生可能做出各种行为动作,比方做笔记、打哈气、翻书包、讲小话等,我们把这些行为统称为事件,其中有些行为老师往往只是视而不见,继续他的上课;而有些行为可能导致老师的上课中止,比方讲小话,并对学生的相关行为予以警告、批评或纠正等,然后继续上课。

我们把老师因为学生的某些行为而中止授课,并产生后续动作,之后接着上课的这个过程理解为中断或中断响应。

我们把可能导致老师上课中断的学生行为理解为中断事件。

结合上面的比方,不难理解中断事件是一种可以导致中断发生的事件,中断则是因为中断事件的发生而导致的后续行为过程。

事件与中断事件是包含关系,即事件可分为中断事件或非中断事件。

而中断事件与中断之间属于前后关联的因果关系,虽有关联,但二者在时序上、行为上并不一样。

结合具体的ST MCU运行过程,其中会有许多各种各样的事件,比方管脚电平变化、计数器溢出、DMA空、FIFO非空、AD转换结束、超时、外设使能、初始化等等,其中有些事件是不会导致中断产生的,比方外设使能或部分初始化动作是不会导致中断发生的,有些事件就可能导致中断发生,比方计数器溢出,AD转换结束等,这些就是中断事件。

当然这些中断事件最终能否触发后续中断,得看是否开启了该中断事件的中断使能,相关中断矢量控制器【NVIC】是否配置,最终让CPU内核参与进来,并完成后续的中断服务动作。

不妨借助STM32 MCU的GPIO的外部事件与中断控制器的框图来理解上述概念。

从上图可以看出,不论外部电平变化成为中断事件还是非中断事件,绿色方框部分都是一样的,即具有相同的触发源。

STM32简记之NVIC和外部中断

STM32简记之NVIC和外部中断

STM32简记之NVIC和外部中断Posted on 2013/06/20 by M1之前用stm32也就是用些内部资源或者耍耍前辈留下来的库,最近在写SPWM波的时候才知道自己对于中断这方面的欠缺,更暴漏了我学东西不打基础的恶习,所以打算重新整理下资料,原因有二:1、通过这种方式能加深记忆。

2、方便以后查看。

因为只追求自己看得懂所以总结的比较简洁,所以称之为简记。

步骤如下:1、系统初始化,如系统时钟初始化,使之进入72MHZ主频;程序启动时已调用SystemInit()函数将主频改为72MHZ。

2、 GPIO配置,务必注意打开GPIO时钟时,一定打开AFIO时钟。

在使用引脚的重映射功能和外部中断时需要使用AFIO时钟。

3、 EXTI配置,在这里配置需要选择哪个引脚作为中断引脚。

EXTI_InitTypeDef EXTI_InitStructure;定义一个EXTI初始化结构体EXTI_InitStructure.EXTI_Line = EXTI_Line1;设置中断线:EXTIL_Line1为中断线1EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;模式:这里有两个模式,一个是中断模式,也就是事件,具体区别如下:“事件:是表示检测有一某件触发事件发生了。

中断:有某个事件发生并产生中断,并跳转到对应的中断处理程序中。

事件可以触发中断,也可以不触发中断有可能被更优先的中断屏蔽,事件不会事件本质上就是一个触发信号,是用来触发特定的外设模块或核心本身(唤醒).事件只是一个触发信号(脉冲),而中断则是一个固定的电平信号”EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;设置触发中断方式:EXTI_Trigger_Falling 设置输入线路下降沿为中断请求EXTI_Trigger_Rising 设置输入线路上升沿为中断请求EXTI_Trigger_Rising_Falling 设置输入线路上升沿和下降沿为中断请求EXTI_InitStructure.EXTI_LineCmd = ENABLE;定义选择中断线的新状态EXTI_Init(&EXTI_InitStructure);根据EXTI_InitStructure中指定的参数初始化外设 EXTI 寄存器。

STM32 NVIC中断向量表设置以及EXTI中断寄存器设置

STM32 NVIC中断向量表设置以及EXTI中断寄存器设置
trigger selection register)上升沿触发寄存器
图5 4. EXTI_FTSR (Falling trigger selection register)下降沿触发器
图6
需要说明的是,作为外部唤醒线是边沿触发的,这些线上不能出现毛刺信号。 5. EXTI_SWIER (Software interrupt event register) 软件中断事件寄存器
图7 我们可以通过对相应位置写 1,来软件触发中断,对响应 PR 位写 1,清除软件中断。 该寄存器复位值为 0 6. EXTI_PR (Pending Register) 中断挂起寄存器
图8 该寄存器复位值是不确定的,如果某个激活了某个中断,则对应的挂起位会置 1, 如果要手动清除挂起,则我们需要往对应位写 1. 这里需要说明一下,就是中断和中断事件不是同一个概念。从图 2 中我们可以看到 两者的来源都是一致的,但是中断是需要 CPU 参与的,需要软件的中断服务函数才能 完成中断后产生的结果;但是事件,是靠脉冲发生器产生一个脉冲,进而由硬件自动完 成这个事件产生的结果,当然相应的联动部件需要先设置好,比如引起 DMA 操作,AD 转换等。 分析程序
NVIC 中断向量表设置以及 EXTI 中断寄存器设置
一、开始中断的步骤 A. 端口设置。这里包括了输入引脚的设置,务必记得打开 GPIO 的时钟和 AFIO 的时钟 信号 B. 中断寄存器的设置 C. NVIC 中断向量寄存器的设置。这里关键点有优先级分组设置以及中断入口地址的设 置 D. 中断函数的书写
图1 从寄存器配置中我们可以看到每个中断由四位配置,那么 STM32 总计有 16 个外部 中断(具体参照 STM32 参考手册 P133 页),因此 EXTIR 有四组,在书写时要注意。 具体对应关系如下:0000: PA[x] pin,0001: PB[x] pin,0010: PC[x] pin,0011: PD[x] pin 0100: PE[x] pin,0101: PF[x] pin,0110: PG[x] pin。假设我们需要设定外部中断 0 由 GPIOB_0 来控制,那么我就可以写成 AFIO->EXTIR[0] |=0X01; 2、 中断寄存器的设置 A. 首先我们可以观察一下下图

stm32 外部中断详细讲解 (转)

stm32 外部中断详细讲解 (转)
STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。68个通道的优先级控制字至少构成17个32位的优先级寄存器。
4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。按照这种分组,4bit一共可以分成5组
}
设置相应的时钟所需要的RCC函数在stm32f10x_rcc.c中,所以要在工程中添加此文件。
2. 设置好相应的中断
设置相应的中断实际上就是设置NVIC,在STM32的固件库中有一个结构体NVIC_InitTypeDef,里面有相应的标志位设置,然后再用NVIC_Init()函数进行初始化。详细代码如下:
第0组:所有4bit用于指定响应优先级;
第1组:最高1位用于指定抢占式优先级,后面3位用于指定响应优先级;
第2组:最高2位用于指定抢占式优先级,后面2位用于指定响应优先级;
第3组:最高3位用于指定抢占式优先级,后面1位用于指定响应优先级;
第4组:所有4位用于指定抢占式优先级。
所谓抢占式优先级和响应优先级,他们之间的关系是:具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel; //选择中断通道3
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占式中断优先级设置为1

STM32中断优先级彻底讲解

STM32中断优先级彻底讲解

STM32中断优先级彻底讲解stm32目前支持的中断共为84个(16个内核+68个外部),16级可编程中断优先级的设置(仅使用中断优先级设置8bit中的高4位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。

二:优先级推论stm32(cortex-m3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。

具备低抢占市场式优先级的中断可以在具备高抢占市场式优先级的中断处理过程中被积极响应,即为中断嵌套,或者说低抢占市场式优先级的中断可以嵌套高抢占市场式优先级的中断。

当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。

如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序同意先处置哪一个。

三:优先级分组既然每个中断源都须要被选定这两种优先级,就须要存有适当的寄存器位记录每个中断的优先级;在cortex-m3中定义了8个比特位用作设置中断源的优先级,这8个比特位在nvic应用领域中断与登位掌控递丛器(aircr)的中断优先级分组域中,可以存有8种分配方式,如下:所有8位用于指定响应优先级最低1十一位用作选定抢占市场式优先级,最高7十一位用作选定积极响应优先级最低2十一位用作选定抢占市场式优先级,最高6十一位用作选定积极响应优先级最低3十一位用作选定抢占市场式优先级,最高5十一位用作选定积极响应优先级最低4十一位用作选定抢占市场式优先级,最高4十一位用作选定积极响应优先级最低5十一位用作选定抢占市场式优先级,最高3十一位用作选定积极响应优先级最低6十一位用作选定抢占市场式优先级,最高2十一位用作选定积极响应优先级最低7十一位用作选定抢占市场式优先级,最高1十一位用作选定积极响应优先级这就是优先级分组的概念。

STM32 中断与嵌套NVIC 快速入门

STM32 中断与嵌套NVIC 快速入门

STM32 中断与嵌套NVIC 快速入门*//====================================================// STM32 中断与嵌套NVIC 快速入门// netjob 2008-8-1//====================================================STM32中断与嵌套NVIC快速入门我也是靠看这本书才弄懂的:Cortex-M3 权威指南Joseph Yiu 著宋岩译其实很简单。

//CM3 有最多240个中断(通常外部中断写作IRQs),就是软件上说的 IRQ CHANAELx(中断通道号x) 每个中断有自己的可编程的中断优先级【有唯一对应的中断优先级寄存器】.由于CM3支持硬件中断嵌套,所以可以有 256 级的可编程优先级和 256级中断嵌套【书上称:抢占(preempt)优先级】所以大家可以设:IRQ CHANAEL 0 通道 = 2 中断优先级 WWDG 窗口定时器中断IRQ CHANAEL 1 通道 = 0 中断优先级 PVD 联到EXTI的电源电压检测(PVD)中断IRQ CHANAEL 3 通道 = 255 中断优先级 RTC 实时时钟(RTC)全局中断IRQ CHANAEL 6 通道 = 10 中断优先级 EXTI0 EXTI线0中断.....IRQ CHANAEL 239 通道 = (0<x<255) 中断优先级 ..这个实在是太恐怖了!是的,其实CM3 并没有这样做。

实在的芯片例如STM32等就只有设计来可用才64级可编程优先级和8级中断嵌套。

对 64级中断就是说:( INT0 到 INT63)这个大家比较好理解,其它的64···239就不用了。

IRQ CHANAEL 0。

IRQ CHANAEL 63而8级中断嵌套这又是何解呢?是这样的,上面说一个【中断】对应一个【中断优先级寄存器】,而这个寄存器是 8 位的。

STM32 关于NVIC使用说明汇总

STM32 关于NVIC使用说明汇总

STM32之NVIC时间:2010-07-22 13:20来源:未知作者:swei 点击: 354次好了,我们再来看下NVIC,STM32 NVIC的使用可以说用很多好处,在以后的应用中可能就有所体会了我们先来看一下Reference Datasheet中是如何说的:SCB->AIRCR中目前只用到4位,也就是最高能有16级中断嵌套,如果全使用的话可以达到256级选用优先级分组(实际就是选几位用于主优先级几位用于辅优先级)注意,我们在一个工程中只能用一种分组方式The table below gives the allowed values of the pre-emption priority and subpriority accordingto the Priority Grouping configuration performed byNVIC_PriorityGroupConfig function=================================================================== ========NVIC_PriorityGroup | NVIC_IRQChannelPreemptionPriority |NVIC_IRQChannelSubPriority | Description=================================================================== ========NVIC_PriorityGroup_0 | 0 | 0-15 | 0 bits for pre-emption priority|| | 4 bits for subpriority ----------------------------------------------------------------------------------------------------------------------------NVIC_PriorityGroup_1 | 0-1 | 0-7 | 1 bits for pre-emption priority| | | 3 bits for subpriority ----------------------------------------------------------------------------------------------------------------------------NVIC_PriorityGroup_2 | 0-3 | 0-3 | 2 bits for pre-emption priority| | | 2 bits for subpriority ----------------------------------------------------------------------------------------------------------------------------NVIC_PriorityGroup_3 | 0-7 | 0-1 | 3 bits for pre-emption priority| | | 1 bits for subpriority ----------------------------------------------------------------------------------------------------------------------------NVIC_PriorityGroup_4 | 0-15 | 0 | 4 bits for pre-emption priority| | | 0 bits forsubpriority以上是我提取库中misc.h中的说明便于大家理解如果要使用中断那就得把中断向量表先存储到存储器,我们先来一段程序看一下吧1.void NVIC_Configuration(void)2.{3. NVIC_InitTypeDef NVIC_InitStructure;4.#ifdef VECT_TAB_RAM5. NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0); //如果定义了VECT_TAB_RAM就将向量表存储在RAM中6.#else7. NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0); //否则将向量表存储在FLASH8.#endif9. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //选择优先级分组方式,这里我们选第一组,即一位做抢占式优先级10.11. NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQChannel; //选择中断通道12. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0; //抢占式优先级定义13. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//子优先级定义14. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//通道时能15.16. NVIC_Init(&NVIC_InitStructure);//通过结构体对寄存器进行赋值17.}这里边包含一个条件编译,如果我们要把中断向量表存储在RAM或者FLASH就要定义相关的宏后边选用优先级分组的0组,也就是0位用于主优先级,4位用于辅优先级主优先级可以中断嵌套(可以抢占)辅优先级不可以中断嵌套,只能当前中断完成之后再相应优先级最高的如果辅优先级相同则相应中断向量表靠前的NVIC_IRQChannel 是说明用的哪种中断,包括所有的中断与异常(NVIC都管理,包括内核的)讲到这里我们要提一下不可屏蔽中断,这个中断是不能屏蔽的NMI是不能屏蔽的,其他中断都是可以屏蔽的好了,就先说到这里吧STM32中Cortex-M3寄存器说明-NVIC寄存器组、系统控制SCB寄存器组、嘀嗒定时...在STM32中用到了Cortex-M3定义的三组寄存器,有关这三组寄存器的说明不在STM32的技术手册中,需要参考ARM 公司发布的Cortex-M3 Technical Reference Manual (r2p0)。

STM32中断系统概述

STM32中断系统概述

STM32中断系统概述1.中断的基本概念2.NVIC(嵌套向量控制器)、中断及异常向量表3.中断优先级---1.中断的基本概念1.1处理器中的中断:在处理器中,CPU正在执行某一段代码时遇到内部或者外部的紧急事件需要处理,暂停当前执行的代码、转而去处理紧急事件,处理完毕后继续执行之前的代码。

1.2中断的意义:中断可以提高CPU运行的效率、避免对某一事件状态的不断轮询损耗CPU资源,同时可以对紧急事件做实时处理;中断在计算机多任务处理中尤为重要(如:uCOS、FreeRTOS),可以实现多线程、多任务的处理;1.3中断处理的过程:进入中断之前处理器将自动保存现场到堆栈中(现场:程勋运行的当前位置、变量的值等),根据中断向量表中的地址运行对应的中断服务程序,在退出中断前处理器会将之前保存在堆栈中的现场进行恢复(称之为出栈)、完成现场恢复后程序将继续从原来的位置运行备注:在处理中断服务程序的过程、以及出栈的过程都是可以被其他中断打断的,这种称为中断的嵌套中断处理过程1.4STM32F4中断体系结构中断体系结构2.NVIC(嵌套向量控制器)2.1中断管理Cortex-M4内核支持256个中断(16个内核中断、250个外部中断)、具有256级的可编程中断优先级设置,STM32F407中使用了其中部分中断,10个内核中断、82个外部中断。

Cortex-M4处理器中,每一个外部中断都可以被使能、禁止、挂起、清除NVIC寄存器列表2.2支持异常及中断向量化处理当异常或中断发生时,处理器会把PC设置为一个特定的地址,该地址就是异常向量,每一类异常源都对应一个特定的入口地址,这些地址按照优先级排列后就组成了一张异常向量表。

(中断是内核外部发送的如:串口等,异常是内核内部发生的)向量化处理中断的好处:从发生异常到异常处理的中间的时间被缩减;采用向量表处理异常,处理器会从存储器的向量表中自动定位到异常对应的程序入口。

中断向量表中断优先级3.中断优先级3.1STM32F4中断的优先级:3个固定优先级、都是负值不能改变;16个可编程优先级、4个bit位表示(中断优先级寄存器NVIC_IPRX,F407使用高4位配置);优先级越小优先级越高;3.2STM32F4中断优先级分组:NVIC_IPR中的4位又分为抢占优先级、响应优先级而这两个优先级各占几位是根据SCB->AIRCR中的中断分组来设置决定的,STM32F4将中断分为5组0-43.3中断优先级总结:抢占优先级级别高于响应优先级,数值越小优先级越高;同一时刻发生的中断,优先处理优先级高的中断;抢占优先级高的任务可以打断抢占优先级低的任务,若抢占优先级相同、响应优先级高的不可以打断响应优先级低的任务;若抢占优先级、响应优先级相同则看哪个中断先发生、则先执行,如果同时发生则处理编号较小的任务中断优先级分组。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

s t m32中断(N V I C与E X T I)一、本章大纲一、嵌套向量中断控制器—NVICCM3内核搭载了一个异常响应系统,通过NVIC(嵌套向量中断控制器)来管理和配置。

NVIC是一个总的控制器,相当于51的IE,不论是来自CM3内部的异常还是来自外设的中断,都进入该控制器进行处理和逻辑控制。

并且NVIC还通过优先级系统,来控制中断的嵌套。

1.中断优先级①优先级的数值越小,则优先级越高。

②NVIC支持中断嵌套,使得高优先级异常会抢占低优先级异常。

③有3个系统异常:复位、NMI(不可屏蔽中断)以及硬件失效(Hard fault),它们有固定的优先级,并且它们的优先级号是负数,从而高于所有其他异常。

原则上,NVIC支持3个固定的高优先级和多达256级的可设置优先级,用一个字节的8个比特位来表示。

STM32F107采用最高有效位对齐,在设计时裁掉表达优先级的4个低端有效位,所以只支持16级优先级。

2.抢占优先级与从优先级NVIC中有一个寄存器是“应用程序中断及复位控制寄存器”,它里面有一个位段名为“优先级组”。

它把优先级分为2个位段:MSB所在的位段对应抢占优先级,抢占优先级决定了抢占行为。

LSB所在的位段对应从优先级,从优先级则处理“内务”。

在STM32F107中,只使用4个位来表达优先级([7:4]),如果抢占优先级组从比特5处分,则得到4级抢占优先级,且在每个抢占优先级的内部有4个从优先级(00 01 10 11)。

3.中断输入与悬起当中断输入脚被置为有效后,该中断就被“悬起”。

所谓“悬起”,也就是等待、就绪的意思。

即使后来中断源撤消了中断请求,已经被标记成悬起的中断也被记录下来。

当某中断的服务程序开始执行时,就称此中断进入了“活跃”状态,并且其悬起位会被硬件自动清除。

在一个中断活跃后,直到其服务例程执行完毕,并且返回后,才能对该中断的新请求予以响应。

当NVIC响应一个中断时,会自动完成以下三项工作,以便安全、准确地跳转到相应的中断服务程序:入栈:把8个寄存器的值压入栈。

当响应中断时,如果当前的代码正在使用PSP,则压入PSP(进程堆栈),否则就压入MSP(主堆栈)。

一旦进入了服务例程,就一直使用主堆栈。

在自动入栈的过程中,将寄存器写入堆栈的顺序与时间顺序无关,CM3会保证正确的寄存器被保存到正确的位置。

取向量:当数据总线(系统总线)进行入栈操作时,指令总线(I-Code总线)正在从向量表中找出正确的中断向量与对应的服务程序入口地址。

更新寄存器。

注意:①如果在某个中断得到响应之前,其悬起状态被清除了,则中断被取消。

②新请求在得到响应时,由硬件自动清零其悬起标志位。

③如果中断源咬住请求信号不放,该中断就会在其上次服务例程返回后再次被置为悬起状态。

④如果某个中断在得到响应之前,其请求信号以若干的脉冲的方式呈现,则被视为只有一次中断请求⑤如果在服务例程执行时,中断请求释放了,但是在服务例程返回前又重新被置为有效,则NVIC会记住此动作,重新悬起该中断。

4.中断返回当中断完成,返回主程序时,NVIC自动完成以下两步:①出栈:先前压入栈中的寄存器在这里恢复。

内部的出栈顺序与入栈时的相对应,堆栈指针的值也改回先前的值。

②更新NVIC 寄存器:伴随着中断的返回,它的活动位也被硬件清除。

对于外部中断,倘若中断输入再次被置为有效,则悬起位也将再次置位,新一次的中断响应序列也会再次开始。

5.CM3异常和中断系统--SYSTICK定时器SysTick定时器被捆绑在NVIC中,用于产生SysTick异常(异常号15)。

它又叫滴答中断,它的作用是规定不同任务执行时间,防止一个任务一直霸占系统。

此外,还有操作系统提供的各种定时功能,都与滴答中断有关。

在STM32F107中,系统嘀嗒校准值固定为9000,当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值)时产生1ms 时间基准。

对于SysTick,库函数文件misc.c中也有一个函数可以对其时钟源进行配置,该函数的原型为:SysTick_CLKSourceConfig( ) /*source(源头);config(配置)6.中断向量当发生了异常或中断,并且要响应它时,CM3 需要定位其服务程序的入口地址。

通过入口地址找到相应的中断服务程序。

这些入口地址存储在“(异常)向量表”中。

缺省情况下,CM3 认为(异常)向量表位于零地址处,且各向量占用 4 字节。

STM32F107的异常响应系统是CM3的裁剪和细化。

在STM32F107中,这种映射关系具体体现在启动代码startup_stm32f10x_cl.s文件中。

该文件已经对这些向量表等进行了映射和配置,并指定了中断服务程序的名称,出于标准化和固件库的要求,一般不建议进行修改。

该文件由汇编写成。

【代码4- 2】 startup_stm32f10x_cl.s/*复位异常服务函数,函数名为Reset_Handler。

PROC表示:定义子程序。

与ENDP相对应。

Reset_Handler PROC/*输出一个标号,供全局使用。

[WEAK]表示如果其他文件同样定义了该标号,则不使用[WEAK]定义的本标号。

EXPORT Reset_Handler [WEAK];从其他文件读入一个标号SystemInitIMPORT SystemInit;从其他文件读入一个标号mainIMPORT __main将SystemInit标号地址赋值给R0并跳转LDR R0, =SystemInitBLX R0;将main标号地址赋值给R0并跳转LDR R0, =__mainBX R0ENDP二、外部中断/事件控制器EXTI与NVIC不同,外部中断/事件控制器EXTI是STM32F107的一个外设,不属于CM3内核的范畴,主要用于配置GPIO的外部中断线。

对于一般中断来说,还需要配合NVIC设置其优先级才能真正的正常工作。

主要特性为:EXTI由20个产生事件/中断请求的边沿检测器组成。

每个中断/事件都有独立的触发和屏蔽。

每个中断线都有专用的状态位。

支持多达20个软件的中断/ 事件请求。

检测脉冲宽度低于APB2时钟宽度的外部信号。

三、NVIC库函数配置NVIC涉及的库函数存放在misc.c文件中,并非类似stm32f10x_gpio.c的命名,这是因为NVIC属于CM3内核部件,遵从CMSIS接口协议。

就其库函数来看,NVIC主要是设置中断的优先级,以达到控制其运行先后及嵌套等功能。

下面以实例来介绍:配置EXTI3中断的抢占优先级为0x07,从优先级为0x07,并使能该中断。

void NVIC_Config (void){NVIC_InitTypeDef NVIC_InitStructure;/*配置中断通道为EXTI3,channel(通道)*/NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;/* 在NVIC_InitStructure中配置中断抢占优先级为3 ,preemption抢先占有,priority 优先权*/NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x07;/* 在NVIC_InitStructure中配置中断从优先级为1 ,sub 潜水艇,地铁,替补队员*/NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}注:抢占优先级去从优先级的选择下面以介绍如何编写EXTI函数来介绍EXTI:void EXTI_Config(void){EXTI_InitTypeDef EXTI_InitStructure;/*定义结构体RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);/*配置GPIO线上的外部中断,必须先使能AFIO时钟。

这句是rcc.h中的一句函数:RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph,FunctionalState NewState);GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3);/*配置PD3管脚作为EXTI线,这句是gpio.h中的函数,参数为(uint8_t GPIO_PortSource(端口源),uint8_t GPIO_PinSource(引脚源));EXTI_InitStructure.EXTI_Line = EXTI_Line3;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;/*中断模式:Interrupt 中断模式; Event 事件模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;/*触发方式:Falling下降沿触发;Rising 上升沿触发;Rising_Falling 边沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE;/*指定中断状态:ENABLE 使能,DISABLE 关闭EXTI_Init(&EXTI_InitStructure);下面以实际例子来介绍如何编写中断程序将PD3管脚接一个按键,作为外部中断线3的输入源,每次按下该按键产生一个中断,在中断服务函数中驱动PC9管脚控制LED4灯翻转输出状态。

①编写main函数:#Include “stm32x.h”void GPIO_Config(void);void NVIC_Config(void);void EXTI_Config(void);Int main(void){GPIO_Config();NVIC_Config();EXTI_Config();while(1);{}}②编写GPIO_Config()void GPIO_Config(void);{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);/* 配置PC9管脚作为推挽输出 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);/* 配置PD3作为浮空输入,为外部中断做准备 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_ModeG;_IN_FLOATINGPIO_Init(GPIOD, &GPIO_InitStructure);}②配置NVIC③配置EXTI④中断函数的编写:中断函数都放在stm32f10x_it.c中,每个中断函数都有固定的名称,这个固定的名称就在cl.s中。

相关文档
最新文档