ch10实验9-外部中断_第1页
ch10实验9-外部中断_第2页
ch10实验9-外部中断_第3页
ch10实验9-外部中断_第4页
ch10实验9-外部中断_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验9——外部中断卓越工程师培养系列本书获深圳大学教材出版资助STM32F1开发标准教程01实验内容实验内容以及AFIO的相关寄存器和固件库函数,基于EXTI通过STM32核心板上的KEY1、KEY2和KEY3,控制LED1和LED2的亮灭,KEY1用于控制LED1的状态翻转KEY2用于控制LED2的状态翻转,KEY3用于控制LED1和LED2的状态同时翻转。通过学习EXTI功能框图、EXTI的相关寄存器和固件库函数02实验原理1.EXTI功能框图EXTI管理了20个中断/事件线,每个中断/事件线都对应一个边沿检测电路,可以对输入线的上升沿、下降沿或上升/下降沿进行检测,每个中断/事件线可以通过寄存器进行单独的配置,既可以产生中断触发,也可以产生事件触发。如图10-1所示是EXTT的功能框图,下面依次介绍EXTI输入线、边沿检测电路、软件中断、中断请求挂起、中断输出与事件输出。1.EXTI功能框图STM32的EXTI输入线有20个即EXTIO~EXTI19,图10-1中很多信号线上都打了一个斜杠并标注了20字样表10-1是EXTI所有输入线的输入源列表其中EXTIO~EXTI15用于GPIO,每个GPIO都可以作为EXTI的输入源,EXTI16与PVD输出相连接,EXTI17与RTC闹钟事件相连接,EXTI18与USB唤醒事件相连接,EXTI19与以太网唤醒事件相接。EXTI19只适用于互联型产品,该输入线与以太网唤醒事件相连接,而STM32核心板上的STM32F103RCT6芯片属于大容量产品,因此EXTI输入线只有19个即EXTIO~EXTI18。1.EXTI输入线1.EXTI功能框图通过配置上升沿触发选择寄存器(EXTI_RTSR)和下降沿触发选择寄存器(EXTI_FTSR)可以实现输入信号的上升沿检测、下降沿检测或上升/下降沿同时检测。EXTI_RTSR的低20位分别对应一个EXTI输入线比如TRO对应EXTIO输入线当TRO配置为1时允许EXTIO输入线的上升沿触发。同样,EXTI_FTSR的低20位也分别对应一个EXTI输入线,比如TR1对应EXTI1输入线,当TR1配置为1时,允许EXTI1输入线的下降沿触发。2.边沿检测电路1.EXTI功能框图软件中断事件寄存器(EXTI_SWIER)的输出和边沿检测电路的输出通过或运算输出到下一级,因此,无论EXTI_SWIER输出高电平,还是边沿检测电路输出高电平,下一级都会输出高电平。可能大家会有疑惑,明明是通过EXTI输入线产生触发源,为什么又要使用软件中断触发?实际上这种设计方法让STM32应用变得更加灵活,比如,默认情况下,通过PC4的上升沿脉冲触发A/D转换,但是,在某种特定场合,又需要人为触发A/D转换,这时就可以借助EXTI_SWIER,只需要向该寄存器的SWIER4写入1即可触发A/D转换。3.软件中断1.EXTI功能框图当某EXTI输入线上检测到已经配置好的边沿事件时,请求挂起寄存器(EXTI_PR)的对应位将被置为1。向该位写1可以清除它,也可以通过改变边沿检测的极性进行清除。EXTI的最后一个环节是输出,可以中断输出,也可以事件输出。先简单解释一下中断和事件,中断和事件的产生源可以相同,两者的目的都是为了执行某一具体任务,比如启动A/D转换或触发DMA数据传输。中断需要CPU参与,当产生中断时,会执行对应的中断服务函数,具体的任务在中断服务函数中执行;事件是靠脉冲发生器产生一个脉冲,该脉冲直接通过硬件执行具体的任务,不需要CPU参与。4.中断请求挂起5.中断输出1.EXTI功能框图因为事件触发提供了一个完全由硬件自动完成而不需要CPU参与的方式,所以使用事件触发诸如A/D转换或DMA数据传输任务,不需要软件参与,降低了CPU的负荷,节省了中断资源,提高了响应速度。但是,中断正是因为有CPU参与,才可以对某一具体任务进行调整,比如A/D采样通道需要从第1通道切换到第7通道,就必须在中断服务函数中切换。请求挂起寄存器(EXTI_PR)的输出与中断屏存器(EXTI_IMR的输出经过与运算输出到NVIC中断控制器。因此,如果需要屏蔽某EXTI输入线上的中断,可以向EXTI_IMR的对应位写入0;如果需要开放某EXTI输入线上的中断,可以向EXTI_IMR的对应位写入1。5.中断输出1.EXTI功能框图软件中断事件寄存器(EXTI_SWIER)的输出和边沿检测电路的输出经过或运算的输出,与事件屏蔽寄存器(EXTI_EMR)的输出再经过与运算的输出,进一步触发脉冲发生器,输出脉冲信号作为事件输出。因此,如果需要屏蔽某EXTI输入线上的事件,可以向EXTI_EMR的对应位写入0;如果需要开放某EXTI输入线上的事件,可以向EXTI_EMR的对应位写入1。6.事件输出2.EXTI部分寄存器EXTI_IMR的结构、偏移地址和复位值如图10-2所示,对部分位的解释说明如表10-2所示。1.中断屏蔽寄存器(EXTI_IMR)2.EXTI部分寄存器EXTI_EMR的结构、偏移地址和复位值如图10-3所示,对部分位的解释说明如表10-3所示。2.事件屏蔽寄存器(EXTI_EMR)2.EXTI部分寄存器EXTI_RTSR的结构、偏移地址和复位值如图10-4所示,对部分位的解释说明如表10-4所示。3.上升沿触发选择寄存器(EXTI_RTSR)2.EXTI部分寄存器EXTI_FTSR的结构、偏移地址和复位值如图10-5所示,对部分位的解释说明如表10-5所示。4.下降沿触发选择寄存器(EXTI_FTSR)2.EXTI部分寄存器EXTI_SWIER的结构偏移地址和复位值如图10-6所示对部分位的解释说明如表10-6所示。5.软件中断事件寄存器(EXTI_SWIER)2.EXTI部分寄存器EXTI_PR的结构、偏移地址和复位值如图10-7所示对部分位的解释说明如表10-7所示。6.请求挂起寄存器(EXTI_PR)3.EXTI部分固件库函数EXTI_Init函数的功能是根据EXTI_ItStruct中指定的参数初始化EXTI相关寄存器通过向EXTI→IMR、EXTI→EMR、EXTI→RTSR、BXTI→FTSR写入参数来实现。具体描述如表10-8所示。1.EXTI_Init3.EXTI部分固件库函数EXTI_IitTypeDef结构体定义在stm32f10x_extih文件中,内容如下:1.EXTI_Init3.EXTI部分固件库函数参数EXTI_Lie用于选择待使能或除能的外部线路,可取值如表10-9所示。1.EXTI_Init3.EXTI部分固件库函数参数EXTI_Mode用于设置被使能线路的模式,可取值如表10-10所示。参数EXTI_Trigger用于设置被使能线路的触发边沿,可取值如表10-11所示。参数EXTI_LineCmd用于定义选中线路的新状态,可取值为ENABLE或DISABLE。1.EXTI_Init3.EXTI部分固件库函数EXTI_GetITStatus函数的功能是检查指定的EXTI线路触发请求发生与否,通过读取并判断EXTI→IMR、EXTI→PR来实现。具体描述如表10-12所示。2.EXTI_GetITStatus3.EXTI部分固件库函数EXTI_ClearITPendingBit函数的功能是清除EXTI线路挂起位通过向EXTI→PR写入参数来实现。具体描述如表10-13所示。3.EXTI_ClearlTPendingBit4.AFIO部分寄存器AFIO_MAPR的结构偏移地址和复位值如图10-8所示对部分位的解释说明如表10-14所示。1.复用重映射和调试I/O配置寄存器(AFIO_MAPR)4.AFIO部分寄存器AFIO_EXTICR1的结构、偏移地址和复位值如图10-9所示,对部分位的解释说明如表10-15所示。2.外部中断配置寄存器1(AFIO_EXTICR1)4.AFIO部分寄存器AFIO_EXTICR2的结构偏移地址和复位值如图10-10所示对部分位的解释说明如表10-16所示。3.外部中断配置寄存器2(AFIO_EXTICR2)4.AFIO部分寄存器AFIO_EXTICR3的结构、偏移地址和复位值如图10-11所示对部分位的解释说明如表10-17所示。4.外部中断配置寄存器3(AFIO_EXTICR3)4.AFIO部分寄存器AFIO_EXTICR4的结构偏移地址和复位值如图10-12所示,对部分位的解释说明如表10-18所示。5.外部中断配置寄存器4(AFIO_EXTICR4)5.AFO部分固件库函数本实验涉及的AFIO固件库函数只有GPIO_EXTILieCong。该函数在stm32f10x_gpio.h文件中声明,在stm32f10x_gpio.c文件中实现。GPIO_EXTILineConfig函数的功能是根据GPIO_PortSource和GPIO_PmSource的值,配置AFIO→EXTICR[x](x=1,...,4),从而选择GPIO某一引脚用作外部中断线路。具体描述如表10-19所示。5.AFO部分固件库函数参数GPIO_PortSource用于选择用作事件输出的GPIO端口,可取值如表10-20所示。5.AFO部分固件库函数参数GPIO_PinSource用于选择用作事件输出的GPIO端口引脚,可取值如表10-21所示。03实验步骤步骤1:首先,将“D:STM32KeilTestlMaterial09外部中断实验”文件夹复制到“D:STM32KeilTestProduct”文件夹中。然后,双击运行“D:STM32KeilTestProducti09.外部中断实验Project”文件夹中的STM32KeilPrjuvprojx,单击工具栏中的西按钮当BuildOutput栏出现FromELFcreatinghexfile..时表示已经成功生成hex文件,出现0Error(s)0Waring(s)表示编译成功最后,将axf文件下载到STM32的内部Flash,观察STM32核心板上的两个LED是否交闪烁。如果两个LED交替闪烁,串口正常输出字符串,表示原始工程是正确的,接着就可以进入下一步操作。复制并编译原始工程步骤2:首先,将“D:STM32KeilTestProductl09外部中断实验HWEXTI”文件夹中的EXTLc添加到HW分组,具体操作可参见2.3节步骤8。然后,将“D:STM32KeilTestProduct09.外部中断实验HWEXTI”路径添加到IncludePaths栏,具体操作可参见2.3节步骤11。添加EXTI文件对步骤3:单击

按钮进行编译编译结束后,在Project面板中双击EXTLc下的EXTLh在EXTL文件的“包含头文件”区,添加代码#include"DataType.h"。在EXTLh文件的“API函数声明”区,添加如程序清单10-1所示的API函数声明代码ImitEXTI函数主要是初始化EXTI模块。完善EXTl.h文件步骤4:在EXTL.c文件的“包含头文件”区的最后,添加代码#include"stm32f10x_confh”。在EXTL.c文件的“内部函数声明”区,添加ConfgEXTIGPIO和ConfgEXTI函数的声明代码,如程序清单10-2所示。ConfigEXTIGPIO函数用于配置按键的GPIO,CongEXTI函数用于配置EXTI。完善EXTl.c文件步骤4:在EXTLc文件的“内部函数实现”区,添加ConfigEXTIGPIO函数的实现代码,如程序清单10-3所示。下面按照顺序对ConfigEXTIGPIO函数中的语句进行解释说明。(1)本实验是基于PC1(KEY1)、PC2(KEY2)和PAO(KEY3)的,因此,需要通过RCC_APB2PeriphClockCmd函数使能GPIOA和GPIOC时钟。(2)通过GPIOImit函数将PC1、PC2和PAO配置为上拉输入模式。完善EXTl.c文件步骤4:在EXTLc文件的“内部函数实现”区,在ConfgEXTIGPIO函数实现区的后面添加ConfigEXTI函数的实现代码,如程序清单10-4所示。下面按照顺序对ConfgEXTI函数中的语句进行解释说明。(1)EXTI与AFIO有关的寄存器包括AFIO_EXTICR1、AFIO_EXTICR2、AFIO_EXTICR3和AFIO_EXTICR4,这些寄存器用于选择EXTIx外部中断的输入源,因此,需要通过RCC_APB2PeriphClockCmd函数使能AFI时钟。该函数涉及RCC_APB2ENR的AFIOEN,AFIOEN为1时使能AFIO时钟AFIOEN为0时除能AFIO时钟可参见图4-13和表4-14。(2)PC1、PC2和PA0类似,这里以PC1为例进行解释。GPIO_EXTILineConfig函数用于将PC1设置为EXTI1的输入源。该函数涉及AFIO_EXTICR1的EXTIO[3:0],可参见图10-9和表10-15。完善EXTl.c文件步骤4:(3)EXTI_Init函数用于初始化中断线参数。该函数涉及EXTI_IMR的MRx、EXTI_EMR的MRx,以及EXTI_RTSR的TRx和EXTI_FTSR的TRx。EXTI_IMR的MRx为0屏蔽来自EXTIx的中断请求为1开放来自EXTIx的中断请求;EXTIEMR的MRx为0屏来自EXTIx的事件请求,为1开放来自EXTIx的事件请求;EXTI_RTSR的TRx为0禁止EXTI上的上升沿触发,为1允许EXTIx上的上升沿触发:EXTI_FTSR的TRx为0禁止EXTIx上的下降沿触发,为1允许EXTIx上的下降沿触发,可参见图10-2~图10-5、表10-2表10-5。本实验中,均开放来自EXTI0、EXTI和EXTI2的中断请求,并允许上升沿触发。(4)通过NVIC_Imit函数使能EXTIOEXTI1和EXTI2的中断,同时设置这3个中断的抢占优先级为2,子优先级为2。完善EXTl.c文件步骤4:完善EXTl.c文件步骤4:在EXTLc文件的“部函数实现”区,在ConfgEXT函数实现区的后面添加EXTIO_IRQHandler、EXTI1_IQHandler和EXT2_IRQHandler中断服务函数的实现代码,如程序清单10-5所示。由于这3个中断服务函数的功能类似,下面仅对EXTI0_IROHandler函数中的语句按照顺序进行解释说明。(1)通过EXTI_GetITStatus函数获取中断标志,该函数涉及EXTI_IMR的MRx和EXTI_PR的PRx,可参见图10-2、图10-7、表10-2和表10-7。本实验中,EXTI_IMR的MRx为1,表示开放来自EXTI的事件请求,当EXTI发生了选择的边沿事件时,PRx由硬件置为1,并产生中断,执行EXTIx_IRQHandler函数。因此,在EXTIx_IRQHandler函数中还需要通过EXTI_ClearITPendingBit函数清除中断标志位,即向PRx写入1清除PRx。完善EXTl.c文件步骤4:(2)在EXTI0_IRQHandler函数中,通过GPO_WriteBit函数对LED1(PC4)和LED2(PC5)同时执行取反操作;在EXTI1_IROHandler函数中通过GPI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论