STM32外部中断配置例程
STM32外部输入中断配置流程图

外部输入中断配置步骤 输入IO 初始化 ●设置外部中断输入的IO 口状态
开启AFIO 时钟 ●开启IO 口复用时钟
中断服务子程序 ●编写中断服务函数
配置NVIC ●配置中断分组(NVIC ),优先级,并使能中断。
配置EXTI 各寄存器 ●触发方式、中断开关等
IO 与EXTI 线连接 ●配置外部中断配置寄存器AFIO_EXTICR
可以设置为上拉/下拉输入,浮空输入;推荐设置上拉/
下拉输入。
STM32的IO 口与中断线的对应关系需要配置外部中断配置寄存器EXTICR
中断屏蔽寄存器(EXTI_IMR) 事件屏蔽寄存器(EXTI_EMR)
上升沿触发选择寄存器(EXTI_RTSR) 下降沿触发选择寄存器(EXTI_FTSR) 软件中断事件寄存器(EXTI_SWIER) 挂起寄存器(EXTI_PR) 寄存器SCB->AIRCR :设置中断分组
寄存器组IPR[15]:设置主优先级,从优先级。
stm32外部中断回传参数

stm32外部中断回传参数摘要:1.STM32外部中断基本概念2.STM32外部中断配置方法3.外部中断触发方式及应用场景4.实例:STM32外部中断回传参数正文:一、STM32外部中断基本概念STM32外部中断,又称IO中断或事件控制器(EXTI),是STM32微控制器提供的一种中断机制。
它允许外部信号(如GPIO引脚状态变化)触发中断请求,进而实现程序的跳转和执行。
STM32外部中断具有较高的灵活性和可靠性,广泛应用于各种智能硬件和嵌入式系统中。
二、STM32外部中断配置方法1.选择合适的外部中断线:STM32外部中断共支持19个边沿检测器,可根据实际需求选择相应的外部中断线。
2.配置触发事件:每个外部中断线都可以独立地配置其触发事件,包括上升沿、下降沿或双边沿。
3.屏蔽中断请求:可通过挂起寄存器单独地屏蔽或启用外部中断请求。
4.配置中断优先级:根据需要调整中断优先级,确保关键任务能够及时响应。
三、外部中断触发方式及应用场景1.上升沿触发:当GPIO引脚电平从低电平变为高电平时,触发中断。
2.下降沿触发:当GPIO引脚电平从高电平变为低电平时,触发中断。
3.双边沿触发:当GPIO引脚电平发生上升或下降沿时,均触发中断。
4.应用场景:外部中断广泛应用于传感器数据采集、通信接收、按键触发等领域。
四、实例:STM32外部中断回传参数以下是一个简单的STM32外部中断回传参数的实例:1.配置GPIO引脚为输入模式,并连接到外部中断线。
2.配置外部中断触发方式(如上升沿触发)。
3.编写中断处理函数,并在其中读取GPIO引脚状态。
4.在主循环中,检查外部中断触发次数,并根据需要执行相应操作。
5.为了确保实时性,可以使用中断优先级和嵌套中断机制。
通过以上步骤,您可以充分利用STM32外部中断实现各种智能控制和监测功能。
奋斗STM32V3版按键中断_EXTI_例程

按键中断(EXTI)例程实验
实验平台:奋斗版STM32开发板V2、V2.1、V3 实验内容:板子加电后,按动板子上K1-K3按键,可控制对应的LED1-LED3的亮 灭,该实验学习了外部中断(EXTI)程序的编制及控制流程。
4.2 硬件电路设计
在开发板上V6、V7、V8分别与MCU的PB5、PD6、PD3相连,如下图所示
淘宝店铺:
11
奋斗版 STM32 开发板例程详解———按键中断实验
键盘部分如下图所示: 例程所用到的列扫描线:PC5,PC2,PC3。 例程所用到的行扫描线(EXTI中断线):PE2。
上升沿触发选择寄存器(EXTI_RTSR) 偏移地址:08H 复位值:0000 0000h
注意: 外部唤醒线是边沿触发的,这些线上不能出现毛刺信号。 在写EXTI_RTSR 寄存器时在外部中断线上的上升沿信号不能被识别,挂起位不会被置 位。在同一中断线上,可以同时设置上升沿和下降沿触发。即任一边沿都可触发中断。
1.2 外部中断配置寄存器2(AFIO_EXTICR2)
地址偏移:0Ch 复位值:0000h
淘宝店铺:
1
奋斗版 STM32 开发板例程详解———按键中断实验
1.3 外部中断配置寄存器3(AFIO_EXTICR3)
地址偏移:10h 复位值:0000h
1.4 外部中断配置寄存器4(AFIO_EXTICR4)
地址偏移:14h 复位值:0000h
淘宝店铺:
2
奋斗版 STM32 开发板例程详解———按键中断实验
2.1 嵌套向量中断控制器(NVIC)
淘宝店铺:
7
stm32adc中断函数例程

stm32adc中断函数例程STM32是意法半导体(STMicroelectronics)推出的一系列32位微控制器系列。
STM32微控制器提供了丰富的外设支持,其中之一是ADC(模数转换器)。
ADC是一种将模拟信号转换为数字信号的设备。
在嵌入式系统中,ADC通常用来将传感器检测到的模拟信号转换为数字信号,以便处理和分析。
在STM32中,ADC外设具有完善的功能和配置选项。
为了实现ADC 的连续转换,并能够在转换完成时触发一个中断,我们需要配置ADC 中的一些寄存器,并编写相应的中断处理函数。
以下是一个在STM32中使用ADC中断的例程。
首先,我们需要确保已正确配置ADC外设和相应的GPIO引脚,以使其能够读取模拟信号。
这些配置通常在启动文件中完成,此处不再赘述。
接下来,我们需要定义一些全局变量和函数,用于处理ADC中断事件。
假设我们要使用ADC1外设,我们将设置全局变量以保存ADC转换结果,并在中断处理函数中更新该变量。
```cuint16_t adcValue;void ADC_IRQHandler(void){if(ADC1->SR & ADC_SR_EOC){adcValue = ADC1->DR;}}```在上述代码中,我们定义了一个名为`adcValue`的全局变量,用于存储ADC转换结果。
`ADC_IRQHandler`是我们编写的中断处理函数,我们将在接下来的步骤中将其配置为与ADC1外设的中断线相连。
我们还要在代码的某处初始化ADC,并配置相关的中断使能。
以下是一个示例:```cvoid ADC_Init(void){RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; //启用ADC1时钟ADC1->CR2 |= ADC_CR2_CONT; //连续转换模式ADC1->CR2 |= ADC_CR2_DMA; //使用DMA传输ADC1->CR2 |= ADC_CR2_ADON; //启动ADCADC1->SMPR1 |= ADC_SMPR1_SMP16; //设置采样时间ADC1->SQR3 |= 16; //设置转换通道ADC1->CR1 |= ADC_CR1_EOCIE; //使能转换完成中断NVIC_EnableIRQ(ADC_IRQn); //使能对应中断向量的中断}void ADC_Start(void){ADC1->CR2 |= ADC_CR2_SWSTART; //启动转换}```在上述代码中,我们首先使能了ADC1的时钟,并配置了一些转换参数。
stm32 外部中断计算脉冲占空比

stm32 外部中断计算脉冲占空比
在STM32微控制器中,我们可以使用外部中断来计算脉冲的占空比。
脉冲的占空比是指脉冲高电平与总脉冲周期的比例。
首先,我们需要配置外部中断的引脚作为输入信号。
我们可以使
用GPIO口的中断功能,通过配置寄存器来使引脚能够触发外部中断。
例如,我们可以使用EXTI寄存器来配置外部中断,具体步骤如下:
1. 配置引脚为输入模式,并使能输入缓冲区。
2. 配置EXTI寄存器的模式和触发方式。
我们可以选择边沿触发方式,例如上升沿触发或下降沿触发。
3. 配置NVIC寄存器使能对应的外部中断通道。
4. 编写中断服务函数,当外部中断被触发时,该函数会被执行。
5. 在中断服务函数中,我们可以通过计算两个连续的外部中断触发时
间来计算脉冲的占空比。
我们可以使用定时器计数器的值来获取时间
信息。
在中断服务函数中,我们可以使用定时器的计数器来获取当前时
间和上次触发时间。
通过计算这两个时间之间的差值,我们可以得到
脉冲的周期。
然后,我们可以计算脉冲的高电平时间,即脉冲的占空比。
具体的计算方法取决于定时器的配置。
总之,通过配置外部中断和定时器,我们可以计算脉冲的占空比。
这使得我们可以实现各种应用,例如测量脉冲周期、频率等。
请注意,以上只是一个简单的示例,实际的实现可能需要根据具
体的要求进行修改和扩展。
stm32外部中断实验报告-STM32实例外部中断实验

stm32外部中断实验报告_STM32实例外部中断实验上⼀篇⽂章我们介绍了 STM32F10x 的中断,这次我们就来学习下外部中断。
本⽂中要实现的功能与按键实验⼀样,即通过按键控制LED,只不过这⾥采⽤外部中断⽅式进⾏控制。
学习时可以参考《STM32F10x 中⽂参考⼿册》-9 中断和事件章节。
外部中断介绍EXTI 简介STM32F10x 外部中断/事件控制器(EXTI)包含多达 20 个⽤于产⽣事件/中断请求的边沿检测器。
EXTI 的每根输⼊线都可单独进⾏配置,以选择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或边沿触发),还可独⽴地被屏蔽。
EXTI 结构框图EXTI 框图包含了 EXTI 最核⼼内容,掌握了此框图,对 EXTI 就有⼀个全局的把握,在编程的时候思路就⾮常清晰。
从图中可以看到,有很多信号线上都有标号 9 样的“20”字样,这个表⽰在控制器内部类似的信号线路有 20 个,这与 STM32F10x 的 EXTI 总共有20 个中断/事件线是吻合的。
因此我们只需要理解其中⼀个的原理,其他的 19个线路原理都是⼀样的。
EXTI 分为两⼤部分功能,⼀个产⽣中断,另⼀个产⽣事件,这两个功能从硬件上就有所差别,这个在框图中也有体现。
从图中标号 3 的位置处就分出了两条线路,⼀条是 3-4-5 ⽤于产⽣中断,另⼀条是 3-6-7-8⽤于产⽣事件。
下⾯我们就来介绍下这两条线路:(1)⾸先看下产⽣中断的这条线路(1-2-3-4-5)1.标号 1 为输⼊线,EXTI 控制器有 20 个中断/事件输⼊线,这些输⼊线可以通过寄存器设置为任意⼀个 GPIO,也可以是⼀些外设的事件,这部分内容我们会在后⾯专门讲解。
输⼊线⼀般是存在电平变化的信号。
2.边沿检测电路,EXTI 可以对触发⽅式进⾏选择,通过上升沿触发选择寄存器和下降沿触发选择寄存器对应位的设置来控制信号触发。
边沿检测电路以输⼊线作为信号输⼊端,如果检测到有边沿跳变就输出有效信号 1 给红⾊框 3 电路,否则输出⽆效信号 0。
使用HAL库开发STM32GPIO口基础使用与外部中断

使用HAL库开发STM32GPIO口基础使用与外部中断GPIO(General Purpose Input/Output)是STM32系列微控制器上常见的功能模块之一,它用于与外部设备进行数据交互。
本文主要介绍如何使用HAL库来配置和使用STM32的GPIO口,并实现外部中断功能。
在使用GPIO口之前,我们首先需要了解STM32芯片上的GPIO引脚的命名方式。
以STM32F103C8T6为例,它具有32个GPIO引脚,从PA0到PA15和PB0到PB15、其中,GPIO口的命名方式为"A"加上引脚的编号。
例如,PA0表示GPIOA的第0个引脚,PB10表示GPIOB的第10个引脚。
1.引入头文件和宏定义首先,在代码文件的顶部引入"stm32f1xx_hal.h"头文件。
然后,在需要使用GPIO功能的地方,定义一个GPIO_InitTypeDef结构体变量,并通过它来配置GPIO的参数。
2.配置GPIO模式和速度在设置GPIO口之前,需要配置GPIO的模式和速度。
通过设置GPIO_InitStruct结构体变量的对应成员变量来实现。
例如,要将PA5配置为推挽输出模式,可以使用如下语句:```GPIO_InitStruct.Pin = GPIO_PIN_5;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);```这里,GPIO_PIN_5表示PA5引脚,GPIO_MODE_OUTPUT_PP表示推挽输出模式,GPIO_SPEED_FREQ_HIGH表示高速模式。
3.配置GPIO引脚在配置好GPIO模式和速度后,可以通过HAL_GPIO_Init函数来配置GPIO引脚,并进行初始化。
学习笔记:STM32外部中断

学习笔记:STM32的外部中断(库函数)在为某引脚配置中断前,同样要先初始化该引脚的配置,用GPIO_Init()函数初始化,不同的是,由于是外部中断,所以输入模式要设置上拉输入。
假设外部中断引脚为PE.2,则该引脚初始化配置的程序为:IOIO口作为外部中断输入是复用功能,因此在此基础上还需要对另一个时钟信号进行初始化。
这是IO口作为复用功能时需要进行初始化的时钟,另外,要注意的是,做一般功能使用的IO口只需要调用第一个函数即可,而作为复用功能的IO口,两个函数都要调用,两者缺一不可,否则不能正常使用。
STM32的每个IO都可以作为外部中断的中断输入口,这点也是STM32的强大之处。
STM32F103的中断控制器支持19个外部中断/事件请求。
每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。
STM32F103的19个外部中断为:线0~15:对应外部IO口的输入中断。
线16:连接到PVD输出。
线17:连接到RTC闹钟事件。
线18:连接到USB唤醒事件。
从上面可以看出,STM32供IO口使用的中断线只有16个,但是STM32的IO口却远远不止16个,那么STM32是怎么把16个中断线和IO口一一对应起来的呢?于是STM32就这样设计,GPIO的管脚GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线0~15。
这样每个中断线对应了最多7个IO口,以线0为例:它对应了GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。
而中断线每次只能连接到1个IO口上,这样就需要通过配置来决定对应的中断线配置到哪个GPIO上了。
下面我们看看GPIO跟中断线的映射关系图:在库函数中,配置GPIO与中断线的映射关系是通过函数GPIO_EXTILineConfig()来实现的:void GPIO_EXTILineConfig(uint8_t GPIO_PortSource,uint8_t GPIO_PinSource)该函数将端口与中断线映射起来,使用示例是:GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);将中断线2与GPIOE映射起来,那么很显然是GPIOE.2与EXTI2中断线连接了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32 外部中断配NVIC_Configuration 函数实现配置嵌套向量中断中断优先级并使能中断。
其中的NVIC_PriorityGroupConfig 函数配置中断优先级的组织方式,STM32 的嵌套向量中断控制器可以配置16 个可编程的优先等级,使用了4 位表示中断优先级(2 的4 此方就是16),16 个可编程的优先等级又可以分为主优先级和次优先级,例如参数NVIC_PriorityGroup_1表示1bit 主优先级(pre-emption priority)3 bits 次优先级(subpriority )。
一、配置中断1、分配中断向量表:/* Set the Vector Table base location at 0x20000000 */NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);2、设置中断优先级:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //设置中断优先级3、初始化外部中断:/*允许EXTI4中断*/NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQChannel; //中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= PreemptionPriorityValue; //占先优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应(次级)优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道中断使能NVIC_Init(&NVIC_InitStructure); //初始化中断注意:如果我们配置的外部针脚为PA4,或PB4,或PC4,PD4等,那么采用的外部中断也必须是EXTI4,同样,如果外部中断针脚是PA1,PB1,PC1,PD1 那么中断就要用EXTI1,其他类推。
二、配置GPIO针脚作为外部中断的触发事件1、选择IO针脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;注意,如果的针脚是端口的4号针脚,配置的中断一定是EXTI42、配置针脚为输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;3、初始化针脚GPIO_Init(GPIOD,&GPIO_InitStructure);3配置EXTI线,使中断线和IO针脚线连接上1、将EXTI线连接到IO端口上将EXTI线4连接到端口GPIOD的第4个针脚上GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource4);注意:如果配置的针脚是4号,那么参数必须是GPIO_PinSource4如果配置的针脚是3号,那么参数必须是GPIO_PinSource32、配置中断边沿/*配置EXTI线4上出现下降沿,则产生中断*/EXTI_InitStructure.EXTI_Line = EXTI_Line4;注意:如果配置的4号针脚,那么EXTI_Line4是必须的EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE; //中断线使能EXTI_Init(&EXTI_InitStructure); //初始化中断EXTI_GenerateSWInterrupt(EXTI_Line4); //EXTI_Line4中断允许到此中断配置完成,可以写中断处理函数。
举例:配置函数/************************************************************* ************* 函数名NVIC_Configration* 描述配置各个中断寄存器************************************************************** **************/void NVIC_Configration(void){NVIC_InitTypeDef NVIC_InitStructure;//#ifdef VECT_TAB_RAM/* Set the Vector Table base location at 0x20000000 */NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);//#else /* VECT_TAB_FLASH *//* Set the Vector Table base location at 0x08000000 *///NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);//#endifNVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //设置中断优先级/*允许EXTI4中断*/NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriorityValue;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/*允许EXTI9中断*/NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/*配置SysTick处理优先级:优先级以及子优先级*/}/************************************************************* ************ 函数名GPIO_Configuration(void)* 描述配置TIM2针脚************************************************************** **********/void GPIO_Configuration(void){/* GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);/*配置GPIOD的第一个管角为浮动输入*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOD,&GPIO_InitStructure);/*配置GPIOB的第9个管脚为浮动输入*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB,&GPIO_InitStructure);}/************************************************************* ** 函数SysTick_Configuration* 描述设置SysTick************************************************************** */void SysTick_Configuration(void){/*配置HCLK 时钟做为SysTick 时钟源*/SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //系统时钟8分频72MHzNVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 8,2);/*SysTick Interrupt each 1000Hz with HCLK equal to 72MHz*/SysTick_SetReload(9000);//中断周期1ms/*Enable the SysTick Interrupt */SysTick_ITConfig(ENABLE);//打开中断SysTick_CounterCmd(SysTick_Counter_Enable);SysTick_CounterCmd(SysTick_Counter_Clear);}/************************************************************* ****************** 函数名EXTI_Configuration* 描述配置EXTI线************************************************************** ****************/void EXTI_Configuration(void){/*将EXTI线4连接到PD4*/GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource4);/*配置EXTI线4上出现下降沿,则产生中断*/EXTI_InitStructure.EXTI_Line = EXTI_Line4;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);EXTI_GenerateSWInterrupt(EXTI_Line4);/*将EXTI线9连接到PB9上*/GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource9);/*将EXTI线9上出现下降沿产生中断*/EXTI_InitStructure.EXTI_Line = EXTI_Line9;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);EXTI_GenerateSWInterrupt(EXTI_Line9);}中断函数:void EXTI4_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line4)!= RESET){if(Ledflag == 0){Ledflag = 1;GPIOC->ODR |= 0X00000080;}else{Ledflag = 0;GPIOC->ODR &= 0XFFFFFF7F;}}EXTI_ClearITPendingBit(EXTI_Line4); //清除EXTI0线路挂起位}注:时钟设置的时候最好加上这句:RCCRCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 使能AFIO时钟================================================ /************************************************************* ************************************************************** 例程名称:外部中断实验实验硬件:DP-miniSTM32硬件连接:指示灯连接PA1按钮连接PA3功能描述:本例程实现外部中断的输入试验,按下按钮,指示灯闪烁一下************************************************************** ******/#include <stm32f10x_lib.h> // STM32F10x Library Definitions#include "STM32_Init.h" // STM32 Initialization/************************************************************* ********** 名称:Delay()*************************************************************/ void Delay(vu16 cnt) {uint16 i,j;for (i=0;i<cnt;i++){ for (j=0;j<1000;j++){ }}}/************************************************************* ********** 名称:RCC_Configuration()*************************************************************/ void RCC_Configuration(void){ErrorStatus HSEStartUpStatus;//使能外部晶振RCC_HSEConfig(RCC_HSE_ON);//等待外部晶振稳定HSEStartUpStatus = RCC_WaitForHSEStartUp();//如果外部晶振启动成功,则进行下一步操作if(HSEStartUpStatus==SUCCESS){//设置HCLK(AHB时钟)=SYSCLKRCC_HCLKConfig(RCC_SYSCLK_Div1);//PCLK1(APB1) = HCLK/2RCC_PCLK1Config(RCC_HCLK_Div2);//PCLK2(APB2) = HCLKRCC_PCLK2Config(RCC_HCLK_Div1);RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);//启动PLLRCC_PLLCmd(ENABLE);//等待PLL稳定while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//系统时钟SYSCLK来自PLL输出RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//切换时钟后等待系统时钟稳定while(RCC_GetSYSCLKSource()!=0x08);}/* RCC system reset(for debug purpose) */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFI O , ENABLE); //给GPIOA和重映射提供时钟,注意:一定要设置RCC_APB2Periph_AFIO}/************************************************************* ********** 名称:GPIO_Configuration()*************************************************************/ void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;/*设置PA3为输入*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);/*设置PA1为输出*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);}/************************************************************* ********** 名称:EXTI_Configuration()************************************************************** *********/void EXTI_Configuration(void){EXTI_InitTypeDef EXTI_InitStructure;/* Configure EXTI Line3 to generate an interrupt on falling edge */EXTI_InitStructure.EXTI_Line = EXTI_Line3; //外部中断通道3 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能EXTI_Init(&EXTI_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3); //将PA3连接到外部中断通道3}/************************************************************* ********** 名称:NVIC_Configuration()*************************************************************/ void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;#ifdef VECT_TAB_RAM/* Set the Vector Table base location at 0x20000000 */NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);#else/* VECT_TAB_FLASH *//* Set the Vector Table base location at 0x08000000 */NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);#endifNVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //抢占式优先级别设置为无抢占优先级NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel; //指定中断源NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //指定响应优先级别1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道3NVIC_Init(&NVIC_InitStructure);}int main (void){RCC_Configuration(); //配置时钟GPIO_Configuration(); //配置IO口NVIC_Configuration(); //中断配置EXTI_Configuration(); //外部中断配置while(1){}}/************************************************************ *********** 说明:将LED灯的连接到PA1*************************************************************/ void EXTI3_IRQHandler (void){if(EXTI_GetITStatus(EXTI_Line3) != RESET){//添加中断处理程序GPIO_WriteBit(GPIOA, GPIO_Pin_1,(BitAction)0);Delay(1000);GPIO_WriteBit(GPIOA, GPIO_Pin_1,(BitAction)1);Delay(1000);EXTI_ClearFlag(EXTI_Line3); //清除中断标志(必须)EXTI_ClearITPendingBit(EXTI_Line3);// 以上两条语句作用相同}}================================================在使用EXTI的时候,因为没有开启时钟没有开启RCC_APB2Periph_AFIO时钟,让我调试吃了不少苦头,看来还要好好看看stm32的时钟啊现在给出我的exti8的配置首先一定要记得配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 使能AFIO时钟//GPIOB8作为中断脚,配置为浮空输入void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;/* Configure PB8 as input floating */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB,&GPIO_InitStructure);}继续配置NVICvoid NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/* Configure the NVIC Preemption Priority Bits*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);/* Set the Vector Table base location at 0x08000000 */NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);}然后配置EXTI ,把PB8连接到EXTIvoid EXTI_Configuration(void){EXTI_InitTypeDef EXTI_InitStructure;/*connect PB8 to EXTI*/GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource8);/*Config EXTI8*/EXTI_InitStructure.EXTI_Line = EXTI_Line8;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);//EXTI_GenerateSWInterrupt(EXTI_Line8);}这样就可以中断了,在中断函数里面记得清除标志位void EXTI9_5_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line8)!= RESET){EXTI_ClearITPendingBit(EXTI_Line8);}}。