1、Embedded System DevelopmentEmbedded System Development嵌入式系统与应用嵌入式系统与应用 第第8 8章章 STM32F10 xSTM32F10 x的主要模块设计的主要模块设计3 3外部中断外部中断F8.3 8.3 外部中断外部中断F8.3.1 GPIO8.3.1 GPIO键盘设计实验键盘设计实验F8.3.2 8.3.2 外部中断外部中断EXTIEXTI设计设计8.3.1 GPIO 8.3.1 GPIO 键盘设计实验键盘设计实验FGPIOGPIO端口如何进行键盘设计?端口如何进行键盘设计?F下面两种办法效果一样。下面两种办法效果一样。F一是采用
2、上拉输入模式,按键在一是采用上拉输入模式,按键在没按下的时候,默认为高电平。没按下的时候,默认为高电平。PE5 key1PE5 key1PE6 key2 PE6 key2 F二是直接采用浮空输入模式,在二是直接采用浮空输入模式,在芯片外部接上拉电阻。芯片外部接上拉电阻。F按键实现LEDLED灯灯反转。按键原理图按键原理图1、按键实现LEDLED灯灯反转main()main()int main(void) int main(void) / /* * config the led config the led * */ / LED_GPIO_Config(); LED_GPIO_Config();
3、 LED1( ON ); LED1( ON ); / /* *config keyconfig key* */ / Key_GPIO_Config(); Key_GPIO_Config(); while(1) while(1) if(Key_Scan(GPIOE,GPIO_Pin_5)= KEY_ON ) if(Key_Scan(GPIOE,GPIO_Pin_5)= KEY_ON ) / /* *LED1LED1灯反转灯反转* */ / GPIO_WriteBit(GPIOC, GPIO_Pin_3, GPIO_WriteBit(GPIOC, GPIO_Pin_3, BitAction(1-G
4、PIO_ReadOutputDataBit(GPIOC, BitAction(1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_3); GPIO_Pin_3); 读取PC3的当前输出电平当前状态反相后写入到PC3按键实现LEDLED灯灯反转F把前面写的把前面写的LedLed灯灯led.cled.c和和led.hled.h复制到本工程文件夹,编复制到本工程文件夹,编写写mainmain函数:函数:F1 1、先调用了、先调用了led.cled.c中的中的LED_GPIO_Config()LED_GPIO_Config(),配置,配置LEDLED用到用到的的I/OI/
5、O。F2 2、调用、调用LED1(ON)LED1(ON),把,把LEDLED灯灯1 1点亮。点亮。F3 3、调用、调用Key_GPIO_Config(),Key_GPIO_Config(),配置按键用到的配置按键用到的I/OI/O口。口。F4 4、调用、调用Key_Scan()Key_Scan()按键检测函数,监测到按键时,调用按键检测函数,监测到按键时,调用GPIO_WriteBit()GPIO_WriteBit()函数实现灯反转。函数实现灯反转。FBitActionBitAction枚举定义在枚举定义在stm32f10 x_gpio.hstm32f10 x_gpio.h第第104104行:
6、行:typedef enumtypedef enum Bit_RESET = 0, Bit_RESET = 0, Bit_SET Bit_SETBitAction;BitAction;2 2、bsp_key.hbsp_key.h按键函数头文件F主要声明主要声明Key_GPIO_ConfigKey_GPIO_Config()()、Key_ScanKey_Scan()()两个函数:两个函数:# #ifndefifndef _KEY_H / _KEY_H /条件编译条件编译 #define _KEY_H #define _KEY_H#include stm32f10 x.h#include stm3
7、2f10 x.h#define KEY_ON#define KEY_ON 0 /0 /按键按下标志按键按下标志#define KEY_OFF#define KEY_OFF1 /1 /无按键标志无按键标志void void Key_GPIO_ConfigKey_GPIO_Config(void); (void); uint8_t uint8_t Key_ScanKey_Scan( (GPIO_TypeDefGPIO_TypeDef* * GPIOx,u16 GPIOx,u16 GPIO_PinGPIO_Pin););# #endifendifF在在bsp_key.Cbsp_key.C文件中实现上
8、两个函数。文件中实现上两个函数。3 3、Key_GPIO_Config()Key_GPIO_Config()函数函数F与与LEDLED的的GPIOGPIO初始化函数初始化函数LED_GPIO_ConfigLED_GPIO_Config()()类似。类似。 # #include include bsp_key.hbsp_key.h void void Key_GPIO_ConfigKey_GPIO_Config(void) (void) GPIO_InitTypeDefGPIO_InitTypeDef GPIO_InitStructureGPIO_InitStructure; ; / /* *开
9、启按键开启按键端口端口GPIOEGPIOE(PE5PE5)的时钟)的时钟* */ / RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); ); GPIO_InitStructure.GPIO_PinGPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; = GPIO_Pin_5; GPIO_InitStructure.GPIO_ModeGPIO_InitStructure.GPIO_Mode = = GPIO_M
10、ode_IPUGPIO_Mode_IPU; ; GPIO_InitGPIO_Init(GPIOE(GPIOE, &, &GPIO_InitStructureGPIO_InitStructure); ); F可用符号可用符号| |同时同时配置多配置多个:个:GPIO_Pin_5|GPIO_Pin_6;GPIO_Pin_5|GPIO_Pin_6;4 4、Key_Scan()Key_Scan()按键检测函数按键检测函数F/ /* *输入输入 :GPIOxGPIOx、 GPIO_PinGPIO_Pin:待读取的端口、引脚,:待读取的端口、引脚, * * *输出输出 :KEY_OFF(KEY_OFF(没
11、按下按键没按下按键) )、KEY_ONKEY_ON(按下按键)(按下按键)* */ / u8 u8 Key_ScanKey_Scan( (GPIO_TypeDefGPIO_TypeDef* * GPIOx,u16 GPIOx,u16 GPIO_PinGPIO_Pin) ) / /* *检测是否有按键按下检测是否有按键按下 * */ / if( if(GPIO_ReadInputDataBitGPIO_ReadInputDataBit( (GPIOx,GPIO_PinGPIOx,GPIO_Pin)=KEY_ON )=KEY_ON ) Delay(10000); / Delay(10000); /
12、延时消抖延时消抖 if(if(GPIO_ReadInputDataBitGPIO_ReadInputDataBit( (GPIOx,GPIO_PinGPIOx,GPIO_Pin)=KEY_ON)=KEY_ON) while while( (GPIO_ReadInputDataBitGPIO_ReadInputDataBit( (GPIOx,GPIO_PinGPIOx,GPIO_Pin)=KEY_ON);)=KEY_ON); return KEY_ON; / return KEY_ON; /等待按键释放等待按键释放 else else return KEY_OFF; return KEY_OFF
13、; else else return KEY_OFF; return KEY_OFF; Key_Scan()Key_Scan()按键检测函数按键检测函数F库函数库函数GPIO_ReadInputDataBit(GPIO_ReadInputDataBit(端口号,引脚号端口号,引脚号) );F返回引脚的数据,返回引脚的数据,0 0为低电平即为低电平即KEY_ONKEY_ON,可能有按键按下,可能有按键按下,调用延时函数消抖;否则返回,调用延时函数消抖;否则返回1 1为高电平即为高电平即KEY_OFFKEY_OFF,表,表示按键没有被按下。示按键没有被按下。 F延时之后再次读取该引脚数据,若依然为
14、低电平,表明确延时之后再次读取该引脚数据,若依然为低电平,表明确实有按键被按下了;否则返回实有按键被按下了;否则返回KEY_OFFKEY_OFF,表示没按键。,表示没按键。Fwhilewhile循环调用循环调用GPIO_ReadInputDataBit()GPIO_ReadInputDataBit(),等待按键释放,等待按键释放,条件变为假退出循环,返回表示按键被按下的标志,条件变为假退出循环,返回表示按键被按下的标志KEY_ONKEY_ON。 F同理,通过输入不同的实参,来检测其它按键的引脚。这同理,通过输入不同的实参,来检测其它按键的引脚。这就是库的魅力!就是库的魅力!作业作业F1 1、进
15、一步熟悉、进一步熟悉GPIOGPIO,掌握,掌握GPIOGPIO设计。设计。F2 2、掌握、掌握GPIOGPIO键盘实验,实验报告。键盘实验,实验报告。8.3.2 8.3.2 STM32中断向量表F上个实验中上个实验中while(1) while(1) 程序中始终轮询检测是否有程序中始终轮询检测是否有按键按下,浪费按键按下,浪费CPUCPU时间、能耗。可采用中断处理方式,时间、能耗。可采用中断处理方式,当按键按下时触发中断再检测按键。当按键按下时触发中断再检测按键。FSTM32STM32的所有的所有GPIOGPIO都可以用作外部中断源,可把按键轮询都可以用作外部中断源,可把按键轮询检测改为由中
16、断来处理,大大提高软件执行的效率。检测改为由中断来处理,大大提高软件执行的效率。F向量中断控制器向量中断控制器NVICNVIC属于属于CortexCortex内核的器件,编号为内核的器件,编号为1 11515的对应系统异常,大于等于的对应系统异常,大于等于1616的则全是外部中断。的则全是外部中断。FSTM32STM32中断向量表,优先级从中断向量表,优先级从-3-3至至6 6(即编号(即编号1 11515)为系)为系统异常,优先级为负的不能设置优先级,如复位统异常,优先级为负的不能设置优先级,如复位ResetReset、不可屏蔽中断不可屏蔽中断NMINMI、硬错误、硬错误HardfaultH
17、ardfault。F从优先级从优先级7 7开始(即类型编号开始(即类型编号1616开始)的为外部中断,优开始)的为外部中断,优先级自行设置。先级自行设置。STM32中断向量表STM32中断向量表8.3.3 8.3.3 STM32外部中断控制器EXTIEXTIF向量中断控制器向量中断控制器NVICNVIC能配置能配置1616种外部中断种外部中断EXTIx(015) EXTIx(015) ,超过超过1616个中断事件时,必然有个中断事件时,必然有2 2个以上的中断事件使用相同个以上的中断事件使用相同的中断种类。注意:相同种类的中断不能嵌套。的中断种类。注意:相同种类的中断不能嵌套。F外部中断控制器
18、外部中断控制器EXTIEXTI配置管理外配置管理外部事件输入部事件输入GPIOGPIO引脚与引脚与EXTIxEXTIx的的连接方式:连接方式:FPAxPGxPAxPGx端口引脚的事件连接同端口引脚的事件连接同一个一个EXTIxEXTIx,分时复用。,分时复用。FGPIOGPIO事件可配置为下降沿、上升事件可配置为下降沿、上升沿或边沿三种模式触发中断。沿或边沿三种模式触发中断。FEXTIEXTI一个应用:上个实验的按键一个应用:上个实验的按键再添加下降沿触发中断,用中断再添加下降沿触发中断,用中断处理来检测按键。处理来检测按键。 EXTI15STM32外部中断控制器EXTIEXTIF对于互联型芯
19、片,外部中断控制器由对于互联型芯片,外部中断控制器由2020个产生事件中断请个产生事件中断请求的边沿检测器组成,其他芯片求的边沿检测器组成,其他芯片1919个。个。STM32外部中断控制器EXTIEXTIF每个输入线都可配置输入类型每个输入线都可配置输入类型( (脉冲或挂起脉冲或挂起) )和对应的触发和对应的触发方式方式( (上升沿或下降沿或者双边沿都触发上升沿或下降沿或者双边沿都触发) )。每个输入线都。每个输入线都可被屏蔽。挂起寄存器保持着状态线的中断请求。可被屏蔽。挂起寄存器保持着状态线的中断请求。F另外四个另外四个EXTIEXTI线的连接方式如下:线的连接方式如下:FEXTIEXTI线
20、线1616连接到连接到PVDPVD输出输出FEXTIEXTI线线1717连接到连接到RTCRTC闹钟事件闹钟事件FEXTIEXTI线线1818连接到连接到USBUSB唤醒事件唤醒事件FEXTIEXTI线线1919连接到以太网唤醒事件连接到以太网唤醒事件( (只适用于互联型产品只适用于互联型产品) )GPIO的x引脚配置为EXTIx8.3.4 EXTI8.3.4 EXTI寄存器寄存器库中定义库中定义Fstm32f10 x.hstm32f10 x.h库库892892行中行中EXTIEXTI寄存器结构定义:寄存器结构定义:typedeftypedef structstruct vu32 IMR; /
21、 vu32 IMR; /中断屏蔽寄存器,配置中断屏蔽寄存器,配置2020个中断线的屏蔽位个中断线的屏蔽位 vu32 EMR; / vu32 EMR; /事件屏蔽寄存器事件屏蔽寄存器 vu32 RTSR; / vu32 RTSR; /上升沿触发选择寄存器上升沿触发选择寄存器 vu32 FTSR; / vu32 FTSR; /下降沿触发选择寄存器下降沿触发选择寄存器 vu32 SWIER; / vu32 SWIER; /设置软件中断寄存器的请求位设置软件中断寄存器的请求位 vu32 PR; / vu32 PR; /挂起寄存器挂起寄存器 EXTI_TypeDefEXTI_TypeDef; ; EXT
22、IEXTI寄存器寄存器库中定义库中定义F#define PERIPH_BASE (uint32_t)0 x4000 0000) #define PERIPH_BASE (uint32_t)0 x4000 0000) F#define APB2PERIPH_BASE (PERIPH_BASE + 0 x1 0000)#define APB2PERIPH_BASE (PERIPH_BASE + 0 x1 0000)F#define EXTI_BASE (APB2PERIPH_BASE + 0 x0400)#define EXTI_BASE (APB2PERIPH_BASE + 0 x0400)F#
23、define EXTI (EXTI_TypeDef #define EXTI (EXTI_TypeDef * *) EXTI_BASE) EXTI_BASE)FEXTIEXTI为为EXTI_TypeDefEXTI_TypeDef结构体型指针地址:结构体型指针地址:0 x4001 04000 x4001 0400FEXITEXIT寄存器配置数据位宏定义在寄存器配置数据位宏定义在32693269行开始:。行开始:。F/ /* *Bit definition for Bit definition for EXTI_IMREXTI_IMR register register * * */ /F#def
24、ine E#define EXTI_IMR_MR0XTI_IMR_MR0 (uint32_t)0 x00000001) (uint32_t)0 x00000001) / /* *! Interrupt Mask on line 0 ! Interrupt Mask on line 0 * */ /F#define #define EXTI_IMR_MR1 EXTI_IMR_MR1 (uint32_t)0 x00000002) (uint32_t)0 x00000002)F 8.3.5 EXTI8.3.5 EXTI库函数 stm32f10 x_exti.cstm32f10 x_exti.cFEX
25、TIEXTI库函数在文件stm32f10 x_exti.cstm32f10 x_exti.c中定义中定义8.3.6 8.3.6 外部中断与NVIC的关系F外部中断外部中断0 0与与NVICNVIC的对应的对应NVICNVIC寄存器NVICNVIC库函数NVIC配置Fmiscmisc库中库中NVIC_Init() NVIC_Init() 函数对函数对NVICNVIC初始化,用到初始化,用到NVIC_InitTypeDef NVIC_InitTypeDef 结构体,其中四个成员:结构体,其中四个成员:NVIC_IRQChannelNVIC_IRQChannel参数来选择将要配置的中断向量;参数来选
26、择将要配置的中断向量;NVIC_IRQChannelCmdNVIC_IRQChannelCmd参数来进行使能参数来进行使能(ENABLE)(ENABLE)或关闭或关闭(DISABLEDISABLE)该中断;)该中断;NVIC_IRQChannelPreemptionPriorityNVIC_IRQChannelPreemptionPriority成员要配置中断成员要配置中断向量的抢占优先级;向量的抢占优先级;NVIC_IRQChannelSubPriorityNVIC_IRQChannelSubPriority需要配置中断向量的响需要配置中断向量的响应优先级。应优先级。FNVICNVIC只可配
27、置只可配置1616种中断向量的优先级:编号越小,优先级种中断向量的优先级:编号越小,优先级别越高;别越高;F抢占优先级:是指打断其它中断,会出现嵌套中断;抢占优先级:是指打断其它中断,会出现嵌套中断;F响应优先级:先处理响应优先级高的中断;响应优先级:先处理响应优先级高的中断;中断检测按键实验F硬件连接:硬件连接:PE5 key1PE5 key1、 PE6 key2 PE6 key2 ,key1key1按下时,按下时,进入线中断处理函数,进入线中断处理函数, LED1LED1状态取反。状态取反。 F配置工程环境:配置工程环境:除使用除使用GPIOGPIO和和RCCRCC片上外设;片上外设;还要
28、使用还要使用extiexti片上外设,片上外设,stm32f10 x_exti.cstm32f10 x_exti.c包含了支包含了支持持extiexti配置和操作的函数;配置和操作的函数;misc.cmisc.c文件则包含了文件则包含了NVICNVIC的配置函数;的配置函数;F本实验中还会在本实验中还会在stm32f10 x_it.cstm32f10 x_it.c中编写中断服务函数。中编写中断服务函数。 Main函数F配置好配置好LEDLED用到的用到的I/OI/O后,调用后,调用LED1()LED1()点亮一盏点亮一盏LEDLED灯;配灯;配置中断,等待中断发生。置中断,等待中断发生。int
29、int main(void) main(void) / /* * configconfig the led the led * */ / LED_GPIO_ConfigLED_GPIO_Config(); (); LED1( ON ); LED1( ON ); / /* * extiexti line line configconfig * */ / EXTI_PE5_Config(); EXTI_PE5_Config(); / /* * wait interrupt wait interrupt * */ / while(1) while(1) 配置外部中断配置外部中断exti.cexti.
30、cFEXTI_PE5_Config()EXTI_PE5_Config()函数,函数,配置配置 PE5 PE5 为线中断口,并设置为线中断口,并设置中断优先级。中断优先级。F主要步骤:主要步骤:1. 1. 使能使能EXTIxEXTIx线的时钟和第二功能线的时钟和第二功能AFIOAFIO时钟时钟 2. 2. 配置配置EXTIxEXTIx线的中断优先级线的中断优先级 3. 3. 配置配置EXTI EXTI 中断线中断线I/O I/O 4. 4. 选定要配置为选定要配置为EXTIEXTI的的I/OI/O口线和口线和I/OI/O口的工作模式口的工作模式 5. EXTI 5. EXTI 中断线工作模式配置
31、中断线工作模式配置 EXTI_PE5_Config()EXTI_PE5_Config()函数函数8. void EXTI_PE5_Config(void) 8. void EXTI_PE5_Config(void) 9. 9. 10. GPIO_InitTypeDef GPIO_InitStructure; 10. GPIO_InitTypeDef GPIO_InitStructure; 11. EXTI_InitTypeDef EXTI_InitStructure; 11. EXTI_InitTypeDef EXTI_InitStructure; 13.13. / /* * config t
32、he extiline(PE5) clock and AFIO clock config the extiline(PE5) clock and AFIO clock * */ / 14. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | 14. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO,ENABLE); RCC_APB2Periph_AFIO,ENABLE); 16. /16. /* * config the NVIC(PE5) config the NVIC(
33、PE5) * */ / 17. NVIC_Configuration(); 17. NVIC_Configuration(); /NVIC/NVIC初始化配置初始化配置19. 19. / /* * EXTI line gpio config(PE5) EXTI line gpio config(PE5) * */ / 20. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; 20. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; 21. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD
34、; 21. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; /上拉输入上拉输入 EXTI_PE5_Config()EXTI_PE5_Config()函数函数_ _续续22. 22. GPIO_InitGPIO_Init(GPIOE, &(GPIOE, &GPIO_InitStructureGPIO_InitStructure); ); 24. 24. / /* * EXTI line(PE5) mode config EXTI line(PE5) mode config * */ / 25. 25. GPIO_EXTILineConfigGPIO_E
35、XTILineConfig( (GPIO_PortSourceGPIOEGPIO_PortSourceGPIOE, , GPIO_PinSource5); GPIO_PinSource5); / PE5/ PE5设置为设置为EXTIEXTI输入线输入线26. 26. EXTI_InitStructure.EXTI_LineEXTI_InitStructure.EXTI_Line = EXTI_Line5; = EXTI_Line5; 27. 27. EXTI_InitStructure.EXTI_ModeEXTI_InitStructure.EXTI_Mode = = EXTI_Mode_In
36、terruptEXTI_Mode_Interrupt; ; 28. 28. EXTI_InitStructure.EXTI_TriggerEXTI_InitStructure.EXTI_Trigger = = EXTI_Trigger_FallingEXTI_Trigger_Falling; ; /下降沿触发中断下降沿触发中断 29. 29. EXTI_InitStructure.EXTI_LineCmdEXTI_InitStructure.EXTI_LineCmd = ENABLE; = ENABLE; 30. 30. EXTI_InitEXTI_Init(&(&EXTI_InitStruc
37、tureEXTI_InitStructure); ); 31. 31. GPIO端口的复用功能AFIOFAFIO (alternate-function I/O)AFIO (alternate-function I/O),GPIOGPIO除了用作普通的除了用作普通的输入输出输入输出( (主功能主功能) ),还可以作为片上外设的复用输入输出,还可以作为片上外设的复用输入输出,如串口,如串口,ADCADC,这些就是复用功能。,这些就是复用功能。FGPIOGPIO还有重映射功能:重映射功能是指把原来属于还有重映射功能:重映射功能是指把原来属于A A引脚引脚的默认复用功能,转移到了的默认复用功能,转移
38、到了B B引脚进行使用(当然引脚进行使用(当然B B引脚具引脚具有这个重映射功能)。有这个重映射功能)。F当把当把GPIOGPIO用作用作EXTIEXTI外部中断外部中断 或使用重映射功能的时候,或使用重映射功能的时候,必须开启必须开启AFIOAFIO时钟。时钟。F代码的第代码的第1414行,开启了行,开启了AFIOAFIO的时钟。的时钟。NVIC初始化配置FEXTI_PE5_Config()EXTI_PE5_Config()调用调用了了NVIC_ConfigurationNVIC_Configuration()()函数来函数来配置配置NVICNVIC控制器。控制器。8. static voi
39、d 8. static void NVIC_ConfigurationNVIC_Configuration(void) (void) 9. 9. 10. 10. NVIC_InitTypeDefNVIC_InitTypeDef NVIC_InitStructureNVIC_InitStructure; ; 1212. /. /* * Configure one bit for preemption priority Configure one bit for preemption priority * */ / 13. 13. NVIC_PriorityGroupConfigNVIC_Prio
40、rityGroupConfig(NVIC_PriorityGroup_1); (NVIC_PriorityGroup_1); 1515. /. /* * 配置配置PA|B|C|D|E5PA|B|C|D|E5为中断源为中断源 * */ / 16. 16. NVIC_InitStructure.NVIC_IRQChannelNVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; = EXTI9_5_IRQn; 17. 17. NVIC_InitStructure.NVIC_NVIC_InitStructure.NVIC_IRQChannelPreemp
41、tionPriorityIRQChannelPreemptionPriority =0=0; ; 18. 18. NVIC_InitStructure.NVIC_IRQChannelSubPriorityNVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; = 0; 19. 19. NVIC_InitStructure.NVIC_IRQChannelCmdNVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; = ENABLE; 20. 20. NVIC_InitNVIC_Init(&(&NVIC_Init
42、StructureNVIC_InitStructure); ); /向寄存器写入参数21. 21. 把NVIC中断优先级分组设置为第1组要配置的为EXTI第59线的中断向量抢占优先级和响应优先级,设为最高编写中断服务函数 FPE5PE5连接到内部的连接到内部的EXTI5EXTI5,GPIOGPIO配置为上拉输入,工作在下配置为上拉输入,工作在下降沿中断。在外围电路上我们将降沿中断。在外围电路上我们将PE5PE5接到了接到了key1key1上上。FPE5PE5始终为高,当按键按下始终为高,当按键按下时时, ,下降下降沿跳沿跳变变,EXTI5,EXTI5会捕捉到会捕捉到这一跳变,并产生相应的中断,
43、中断服务程序在这一跳变,并产生相应的中断,中断服务程序在stm32f10 x_it.cstm32f10 x_it.c中中实现,专门实现,专门用来存放中断服务用来存放中断服务函数。函数。F中断中断服务函数的名字必须要跟启动文件服务函数的名字必须要跟启动文件startup_stm32f10 x_hd.sstartup_stm32f10 x_hd.s中的中断向量表定义中的中断向量表定义一致:一致:DCD EXTI9_5_IRQHandler DCD EXTI9_5_IRQHandler ; EXTI Line 9.5 ; EXTI Line 9.5 EXTI9EXTI5EXTI9EXTI5中断向量的
44、服务函数中断向量的服务函数名名F在在stm32f10 x_it.cstm32f10 x_it.c中加入中加入EXTI9_5_IRQHandler()EXTI9_5_IRQHandler()函数;函数;EXTI9_5_IRQHandler()EXTI9_5_IRQHandler()函数函数/ /* * I/O I/O线中断,中断线为线中断,中断线为PE5 PE5 * */ / void EXTI9_5_IRQHandler(void) void EXTI9_5_IRQHandler(void) if(EXTI_GetITStatus(EXTI_Line5) != RESET) if(EXTI_G
45、etITStatus(EXTI_Line5) != RESET) /确保是否产生了确保是否产生了EXTI LineEXTI Line中断中断 / LED1 / LED1 取反取反 GPIO_WriteBit(GPIOC, GPIO_Pin_3, GPIO_WriteBit(GPIOC, GPIO_Pin_3, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOC, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_3); GPIO_Pin_3); / /清除中断标志位清除中断标志位 EXTI_ClearIT
46、PendingBit(EXTI_Line5); EXTI_ClearITPendingBit(EXTI_Line5); 实验现象F将野火将野火STM32STM32开发板供电开发板供电(DC5V)(DC5V),插上,插上JLINKJLINK,将编译好的,将编译好的程序下载到开发板,程序下载到开发板,LED1LED1亮,按下按键时亮,按下按键时LED1LED1灭,再按下灭,再按下按键时按键时LED1LED1亮,如此循环。亮,如此循环。8.2 8.2 课下任务课下任务F阅读阅读P161-172P161-172F阅读阅读Cortex-M3 Cortex-M3 权威指南,第权威指南,第7 7、8 8、9 9章章F阅读野火资料:阅读野火资料:P124-141P124-141F1 1、NVICNVIC嵌套向量中断控制器嵌套向量中断控制器F2 2、中断向量表、中断向量表F3 3、EXTIEXTI外部中断外部中断