STM32开发 -- 外部中断详解

发布者:cloudy德德最新更新时间:2019-09-02 来源: eefocus关键字:STM32  外部中断  中断服务函数 手机看文章 扫描二维码
随时随地手机看文章

在讲三轴加速度计的时候,提到外部中断。接下来就看看中断为什么这么配置。


一、外部中断概述

STM32的每个IO都可以作为外部中断输入。


那我们之前讲过的,参看:STM32开发 – GPIO详解


STM32F105RC 一共有4组IO口 一共16X3+3=51个IO

GPIOA0~A15

GPIOB0~B15

GPIOC0~C15

GPIOD0~D2


那么它跟中断的关系是什么呢?

在这里插入图片描述

STM32的中断控制器支持19个外部中断/事件请求:

从图上来看,GPIO 的管脚 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线 0 ~ 15。

另外四个EXTI线的连接方式如下:

● EXTI线16连接到PVD输出

● EXTI线17连接到RTC闹钟事件

● EXTI线18连接到USB唤醒事件

● EXTI线19连接到以太网唤醒事件(只适用于互联型产品)


对于每个中断线,我们可以设置相应的触发方式(上升沿触发,下降沿触发,边沿触发)以及使能。


二、设置中断相应的触发方式以及使能

void BSP_LIS3DH_Init(void)

{

EXTI_InitTypeDef   EXTI_InitStructure; 

NVIC_InitTypeDef NVIC_InitStructure; 


RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟 

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource8); //配置GPIO与中断线的映射关系

/*中断的初始化*/

EXTI_InitStructure.EXTI_Line=EXTI_Line8; 

//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);


EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; 

EXTI_InitStructure.EXTI_LineCmd = ENABLE; 

EXTI_Init(&EXTI_InitStructure);     //初始化外设EXTI寄存器 

NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                  //使能按键外部中断通道 

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;  //抢占优先级2,   

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x07;    //响应优先级2 

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //使能外部中断通道 

NVIC_Init(&NVIC_InitStructure);                                                    //中断优先级分组初始化

}



void EXTI9_5_IRQHandler (void)

{

if(EXTI_GetITStatus(EXTI_Line8)!=RESET)

{

LIS3DH_Rx_Len = LIS3DH_Fifo_Read(LIS3DHBuffer);

EXTI_ClearITPendingBit(EXTI_Line8);

}

}


程序上是这么配置的,但是这些都是什么意思呢?接下来看一下咯!!


1、中断服务函数列表:

IO口外部中断在中断向量表中只分配了7个中断向量,也就是只能使用7个中断服务函数。


EXTI0_IRQHandler           

EXTI1_IRQHandler

EXTI2_IRQHandler           

EXTI3_IRQHandler           

EXTI4_IRQHandler           

EXTI9_5_IRQHandler         

EXTI15_10_IRQHandler       


外部中断线5~9分配一个中断向量,共用一个服务函数。

外部中断线10~15分配一个中断向量,共用一个中断服务函数。

注意,是共用中断入口,实际操作需要在中断里面判断是哪一个中断。


如下代码:if(EXTI_GetITStatus(EXTI_Line8)!=RESET)

在EXTI9_5_IRQHandler 中断里,判断是否是EXTI_Line8的中断。


void EXTI9_5_IRQHandler (void)

{

if(EXTI_GetITStatus(EXTI_Line8)!=RESET)

{

LIS3DH_Rx_Len = LIS3DH_Fifo_Read(LIS3DHBuffer);

EXTI_ClearITPendingBit(EXTI_Line8);

}

}


2、外部中断常用库函数

①void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);

设置IO口与中断线的映射关系

例如, GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);


②void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

初始化中断线:触发方式等


③ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);

判断中断线中断状态,是否发生


④void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

清除中断线上的中断标志位


3、EXTI_Init函数介绍

EXTI_InitTypeDef   EXTI_InitStructure; 

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寄存器 


上面的例子设置中断线 8 上的中断为下降沿触发


4、设置 NVIC 中断优先级

NVIC_InitTypeDef NVIC_InitStructure; 

NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                  //使能按键外部中断通道 

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;  //抢占优先级2,   

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x07;    //响应优先级2 

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //使能外部中断通道 

NVIC_Init(&NVIC_InitStructure);                                                    //中断优先级分组初始化


5、中断服务函数

void EXTI9_5_IRQHandler (void)

{

if(EXTI_GetITStatus(EXTI_Line8)!=RESET)

{

LIS3DH_Rx_Len = LIS3DH_Fifo_Read(LIS3DHBuffer);

EXTI_ClearITPendingBit(EXTI_Line8);

}

}


三、外部中断的一般配置步骤

1、初始化IO口为输入。

   GPIO_Init();


2、开启IO口复用时钟。

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);


3、设置IO口与中断线的映射关系。

    void GPIO_EXTILineConfig();


4、初始化线上中断,设置触发条件等。

   EXTI_Init();


5、配置中断分组(NVIC),并使能中断。

   NVIC_Init();


6、编写中断服务函数。

  EXTIx_IRQHandler();


7、清除中断标志位

  EXTI_ClearITPendingBit();

关键字:STM32  外部中断  中断服务函数 引用地址:STM32开发 -- 外部中断详解

上一篇:STM32开发 -- UTC、UNIX时间戳、北京时间之间的转换
下一篇:STM32开发 -- IAP详解

推荐阅读最新更新时间:2024-11-17 09:22

公交车的远卡自动收费系统设计
引言 随着社会的发展,城市公共交通已变成我们生活中不可或缺的一部分。目前,公交收费主要有人工售票和刷卡投币收费两种方式。人工售票虽然具有监督性强、能有效防止偷票漏票现象的优点,但是每月需要给售票员发放工资,进而使得成本提高。刷卡和投币收费能解决成本问题,但是乘客上下车非常不便,特别是高峰期,大大减缓了上下车速度。当前国内外公交车收费采用的射频卡与收费机操作距离不超过0.1 m(下面简称这种射频卡为 近卡 ),乘客缴费需要从衣袋,包内取卡,贴近收费机刷卡,再将卡放回衣袋、包内,这些动作减缓了乘客上车速度,特别对双手携带东西的乘客,刷卡操作会很不方便。 本文研究的公交车自动收费系统使用有源标签完成公交卡的设计,在保证较长使用寿命的基础
[单片机]
公交车的远卡自动收费系统设计
STM32中断优先级谁更高 主要根据两个方面来判断
一:综述 STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级 的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。 二:优先级判断 STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作‘亚优先级’或‘副优先级’,每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在
[单片机]
Wince外部中断控制LED详解动态申请
本实例是基于S3C2440,WINCE5.0 1.中断分两大类:内部中断和外部中断。 外部中断:由外部设备所引发的中断,这些外部中断都是通过GPIO中的中断引脚产生的。S3C2440有24个外部中断,相关的寄存器如下: EXTINT0-EXTINT2:三个寄存器设定EINT0-EINT23的触发方式。 EINTFLT0-EINTFLT3:控制滤波时钟和滤波宽度。 EINTPEND:中断挂起寄存器 EINTMASK:中断屏蔽寄存器 内部中断:内部中断是有CPU内部器件产生的中断,如定时器中断,USB中断,UART中断等。相关的寄存器如下:
[单片机]
STM32_BKP备份数据
今天提供并讲解的软件工程,基于前面的软件工程“TIM延时”修改而来。若有疑问,请关注微信公众号获取更多信息。 每天提供下载的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘。 今天的软件工程下载地址(360云盘): https://yunpan.cn/cP7FTUw4XCYNw 访问密码 0ebe STM32F10x的资料可以在我360云盘下载: https://yunpan.cn/crBUdUGdYKam2 访问密码 ca90 工程概要说明:第一次上电写入BKP一个数据0xA55A,第二次及以后MCU重新上电读取BKP数据就是0xA55A(只要中间没有修改过),软件工程是在每次上电
[单片机]
STM32_BKP备份数据
STM32的精确延时
/*---------------------------------------------------------- 文件名称:systick.c 文件描述:sysTick 系统滴答时钟1us中断函数库,中断时间可自由配置 备注:程序默认使用72M时钟,无分频 -----------------------------------------------------------------*/ #include delay.h static __IO u32 TimingDelay; /*---------------------------------------------------------------------
[单片机]
stm32中按键长短按实现方法
主函数中扫描该函数即可,需要注意按键按下时程序会停留在该函数中,知道松手或时间到0.8s,大于0.8秒为长按,小于为短按,可以自己根据需要修改,初始化函数因板子而异,这里就不列出来了 u8 KEY_N; //在头文件中声明一下外部变量,用于主函数中判断哪个按键按下 u8 KEY_Scan(void) //返回值temp代表按键按下的时间(=temp*10 MS) { static u8 flag=1; u8 temp=0; if(flag==1) { if(KEY1_IN==0) //下面四个按键相似操作 { flag=0; while(KEY1_IN==0&&temp 85) { temp++;
[单片机]
STM32采用HAL库使用usart_DMA问题
在这里需要理解一个概念就是,使用hal库,首先一定要对标准库中外设的使用,有一个很好的了解,在我这里出现这个原因就是由于对标准库中外设的使用不够了解,导致转移到HAL库,出现各种问题。 本次采用的是HAL库串口2中断的接受,DMA方式发送。 具体想实现的功能是:上位机发送一帧固定的数据(15bit)前面2个字节固定的,在串口中断中,检测到了这个前面2个字节是正确的,则进行数据的处理。处理好数据以后,在采用DMA方式发送出去对应的数据。 出现的问题:每次调用函数这个函数后,下次就不能使用了 MYDMA_USART_Transmit(&UART2_Handler(u8*)USART2_TX_BUF,USART2_REC_LEN
[单片机]
STM32 HAL库 +freeRTOS+Keil 移植
STM32 HAL库 +freeRTOS+Keil 移植 官方freeRTOS移植教程很多,本文不做赘述。本文基于Keil 5提供的freeRTOS库,进行移植。 Keil 版本:Keil MDK uVision5 首先准备好一个可以用的HAL库工程,为了方便调试,选择了原子哥的开发板上提供跑马灯工程。 打开工程, 点击 ,下载freeRTOS库, 我的已经安装过了 最新的版本10.3.1 下载完成后关闭,点击 ,在这个界面下,按下图选择对应的选项 选择完成后点击OK( 如果没有先下载),可以看到工程中已经添加RTOS 点击 编译下, 有一个错误先不用管,接下来开始修改文件,先打开RTE_Com
[单片机]
<font color='red'>STM32</font> HAL库 +freeRTOS+Keil 移植
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved