

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 STM32外部中断原理与配置STM32-外部中断原理与配置IO外部中断原理概述STM32控制器持的外部中断 /事件请求中断线M3 M4 M7 EXTI线015:对应外部IO的输中断。EXTI线16:连接到PVD输出。EXTI线17:连接到RTC闹钟事件。EXTI线18:连接到USB OTG FS唤醒事件。EXTI线19:连接到以太唤醒事件。 EXTI线20:连接到USB OTG HS(在FS中配置)唤醒事件EXTI线21:连接到RTC侵和时间戳事件。EXTI线22:连接到RTC唤醒事件。EXSTI线23:连接到LPTIM1异步事件IO外部中断STM32的每个IO都可以作为外部中断输。每个外部
2、中断线可以独的配置触发式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专的状态位。STM32供IO使的中断线只有16个,但是STM32F系列的IO多达上百个,STM32F103ZGT6(112),那么中断线怎么跟io对应呢?GPIO和中断线映射关系GPIOx.0映射到EXTI0GPIOx.1映射到EXTI1GPIOx.14映射到EXTI14GPIOx.15映射到EXTI15对于M4/M7,配置寄存器为SYSCFG_EXTIRx对于M3,配置寄存器为AFIO_EXTICRx如下图所,EXTI03:0有4个位,可以配置16个,所以可以从PA0选择到PI0。也就是说16个中断线,最多可以处理16*1
3、6个外部引脚的中断。可以在册中找到SYSCFG 外部中断配置寄存器:16个中断线就分配16个中断服务函数?IO外部中断在中断向量表中只分配了7个中断向量,也就是只能使7个中断服务函数。从表中可以看出,外部中断线5 9分配个中断向量,共个服务函数外部中断线1015分配个中断向量,共个中断服务函数。中断服务函数列表:EXTI0_IRQHandlerEXTI1_IRQHandlerEXTI2_IRQHandler EXTI3_IRQHandlerEXTI4_IRQHandlerEXTI9_5_IRQHandlerEXTI15_10_IRQHandlerIO外部中断 HAL库配置法外部中断操作使到的函
4、数分布件stm32fxxx_hal_gpio.hstm32fxxx_hal_gpio.c外部中断配置:外部中断的中断线映射配置和触发式都是在GPIO初始化函数中完成:GPIO_InitTypeDef GPIO_Initure;GPIO_Initure.Pin=GPIO_PIN_0; /PA0GPIO_Initure.Mode=GPIO_MODE_IT_RISING; /上/ 升沿触发GPIO_Initure.Pull=GPIO_PULLDOWN;HAL_GPIO_Init(GPIOA,&GPIO_Initure);void HAL_GPIO_Init(GPIO_TypeDef *GPIOx,
5、GPIO_InitTypeDef *GPIO_Init)uint32_t position;uint32_t ioposition = 0 x00;uint32_t iocurrent = 0 x00;uint32_t temp = 0 x00;/* Check the parameters */assert_param(IS_GPIO_ALL_INSTANCE(GPIOx);assert_param(IS_GPIO_PIN(GPIO_Init-Pin);assert_param(IS_GPIO_MODE(GPIO_Init-Mode);assert_param(IS_GPIO_PULL(GP
6、IO_Init-Pull);/* Configure the port pins */for(position = 0; position GPIO_NUMBER; position+)/* Get the IO position */ioposition = (uint32_t)0 x01) Pin) & ioposition;if(iocurrent = ioposition)/*- GPIO Mode Configuration -*/* In case of Alternate function mode selection */if(GPIO_Init-Mode = GPIO_MOD
7、E_AF_PP) | (GPIO_Init-Mode = GPIO_MODE_AF_OD)/* Check the Alternate function parameter */assert_param(IS_GPIO_AF(GPIO_Init-Alternate);/* Configure Alternate function mapped with the current IO */temp = GPIOx-AFRposition 3;temp &= (uint32_t)0 xF Alternate) AFRposition 3 = temp;/* Configure IO Directi
8、on mode (Input, Output, Alternate or Analog) */temp = GPIOx-MODER;temp &= (GPIO_MODER_MODER0 Mode & GPIO_MODE) MODER = temp;/* In case of Output or Alternate function mode selection */if(GPIO_Init-Mode = GPIO_MODE_OUTPUT_PP) | (GPIO_Init-Mode = GPIO_MODE_AF_PP) |(GPIO_Init-Mode = GPIO_MODE_OUTPUT_OD
9、) | (GPIO_Init-Mode = GPIO_MODE_AF_OD)/* Check the Speed parameter */assert_param(IS_GPIO_SPEED(GPIO_Init-Speed);/* Configure the IO Speed */temp = GPIOx-OSPEEDR;temp &= (GPIO_OSPEEDER_OSPEEDR0 Speed OSPEEDR = temp;/* Configure the IO Output Type */temp = GPIOx-OTYPER;temp &= (GPIO_OTYPER_OT_0 Mode
10、& GPIO_OUTPUT_TYPE) 4) OTYPER = temp;/* Activate the Pull-up or Pull down resistor for the current IO */temp = GPIOx-PUPDR;temp &= (GPIO_PUPDR_PUPDR0 Pull) PUPDR = temp;/*- EXTI Mode Configuration -*/* Configure the External Interrupt or event for the current IO */if(GPIO_Init-Mode & EXTI_MODE) = EX
11、TI_MODE)/* Enable SYSCFG Clock */_HAL_RCC_SYSCFG_CLK_ENABLE();temp = SYSCFG-EXTICRposition 2;temp &= (uint32_t)0 x0F) (4 * (position & 0 x03);temp |= (uint32_t)(GPIO_GET_INDEX(GPIOx) EXTICRposition 2 = temp;/* Clear EXTI line configuration */temp = EXTI-IMR;temp &= (uint32_t)iocurrent);if(GPIO_Init-
12、Mode & GPIO_MODE_IT) = GPIO_MODE_IT)temp |= iocurrent;EXTI-IMR = temp;temp = EXTI-EMR;temp &= (uint32_t)iocurrent);if(GPIO_Init-Mode & GPIO_MODE_EVT) = GPIO_MODE_EVT)temp |= iocurrent;EXTI-EMR = temp;/* Clear Rising Falling edge configuration */temp = EXTI-RTSR;temp &= (uint32_t)iocurrent);if(GPIO_I
13、nit-Mode & RISING_EDGE) = RISING_EDGE)temp |= iocurrent;EXTI-RTSR = temp;temp = EXTI-FTSR;temp &= (uint32_t)iocurrent);if(GPIO_Init-Mode & FALLING_EDGE) = FALLING_EDGE)temp |= iocurrent;EXTI-FTSR = temp;和串中断样,HAL库同样提供了外部中断通处理函数HAL_GPIO_EXTI_IRQHandler,我们在外部中断服务函数中会调该函数处理中断。/中断服务函数void EXTI0_IRQHandl
14、er(void)HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);/调中断处理公函数void EXTI2_IRQHandler(void)HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);/调中断处理公函数HAL_GPIO_EXTI_IRQHandler函数内部通过判断中断来源引脚,最终调外部中断回调函数HAL_GPIO_EXTI_Callback来处理中断。void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) /* EXTI line interrupt detected */if(_HAL_GPIO
15、_EXTI_GET_IT(GPIO_Pin) != RESET)_HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);HAL_GPIO_EXTI_Callback(GPIO_Pin);然后找到定义,可以看到HAL_GPIO_EXTI_Callback是个弱函数_weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)/* Prevent unused argument(s) compilation warning */_IO uint32_t tmpreg = 0 x00;UNUSED(tmpreg);/* NOTE: This fu
16、nction Should not be modified, when the callback is needed,the HAL_GPIO_EXTI_Callback could be implemented in the user file*/户最终编写中断处理回调函数来编写中断处理逻辑void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)switch(GPIO_Pin)case GPIO_PIN_0:/ 控制逻辑break;case GPIO_PIN_2:/ 控制逻辑break;外部中断的般配置步骤: 使能IO时钟。 初始化IO,设置触发式:HAL
17、_GPIO_Init(); 设置中断优先级,并使能中断通道。 编写中断服务函数:函数中调外部中断通处理函数HAL_GPIO_EXTI_IRQHandler。 编写外部中断回调函数:HAL_GPIO_EXTI_Callback;按键硬件连接key0按下低电平,松开应该是电平,所以key0设置为上拉输,松开的时候,按下低,所以按下的时候是下降沿,因此就下降沿触发。KEY0-PH3 上拉输,下降沿触发KEY1-PH2 上拉输,下降沿触发KEY2-PC13 上拉输,下降沿触发WK_UP-PA0 下拉输,上升沿触发IO外部中断实验按键KEY0按下: 同时控制LED0和LED1翻转。按键KEY1按下: L
18、ED1状态翻转。按键KEY2按下: LED0翻转。按键WK_UP按下:控制LED0和LED1互斥点亮。根据外部中断的配置的五个步骤,可以写出代码: 使能IO时钟。 初始化IO,设置触发式:HAL_GPIO_Init(); 设置中断优先级,并使能中断通道。 编写中断服务函数:函数中调外部中断通处理函数HAL_GPIO_EXTI_IRQHandler。 编写外部中断回调函数:HAL_GPIO_EXTI_Callback;先编写exti.h件:#ifndef _EXTI_H#define _EXTI_H#include sys.hvoid EXTI_Init(void);#endif然后编写exti
19、.c件写出要到的函数#include exti.hvoid EXTI_Init(void)void EXTI0_IRQHandler(void)void EXTI2_IRQHandler(void)void EXTI3_IRQHandler(void)void EXTI15_10_IRQHandler(void)void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)然后进函数编写,先是 使能IO时钟、初始化IO,设置触发式,然后是设置中断优先级,并使能中断通道void EXTI_Init(void)/ 使能IO时钟、初始化IO,设置触发式GPIO_Init
20、TypeDef GPIO_Initure;_HAL_RCC_GPIOA_CLK_ENABLE();_HAL_RCC_GPIOC_CLK_ENABLE();_HAL_RCC_GPIOH_CLK_ENABLE();GPIO_Initure.Pin=GPIO_PIN_0;/ 开启GPIOA时钟/ 开启GPIOC时钟/ 开启GPIOH时钟/PA0GPIO_Initure.Mode=GPIO_MODE_IT_RISING;GPIO_Initure.Pull=GPIO_PULLDOWN; / 下拉/IT 是外部中断 RISING上升沿触发GPIO_Initure.Speed=GPIO_SPEED_HIGH
21、; / 速HAL_GPIO_Init(GPIOA,&GPIO_Initure);GPIO_Initure.Pin=GPIO_PIN_13;GPIO_Initure.Mode=GPIO_MODE_IT_FALLING;GPIO_Initure.Pull=GPIO_PULLUP; / 上拉/PC13/ 下降沿触发GPIO_Initure.Speed=GPIO_SPEED_HIGH; / 速HAL_GPIO_Init(GPIOC,&GPIO_Initure);GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3; /PH2,3HAL_GPIO_Init(GPIOH,&GPIO
22、_Initure);/ 设置中断优先级,并使能中断通道HAL_NVIC_EnableIRQ(EXTI0_IRQn);HAL_NVIC_SetPriority(EXTI0_IRQn,2,0);HAL_NVIC_EnableIRQ(EXTI2_IRQn);HAL_NVIC_SetPriority(EXTI2_IRQn,2,1);HAL_NVIC_EnableIRQ(EXTI3_IRQn); HAL_NVIC_SetPriority(EXTI3_IRQn,2,2);HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);HAL_NVIC_SetPriority(EXTI15_10_IRQn,2,3);然后在后编写中断服务函数:函数中调外部中断通处理函数HAL_GPIO_EXTI_IRQHandler。和 编写外部中断回调函数:HAL_GPIO_EXTI_Callback;void EXTI0_IRQHandler(void)HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);void EXTI2_IRQHandler(void)HAL_GPIO_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论