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-11 18:20

STM32单片机中使用SPI通信的方法
  在本教程中,我们将使用 STM32F103C8 的 Blue Pill 板替换一个 Arduino 板,并将使用 SPI 总线与 Arduino 板进行通信。在这个STM32 SPI 示例中,我们将使用Arduino UNO作为 Slave,STM32F103C8 作为 Master,两个16X2 LCD 显示器分别连接在一起。两个电位器还与STM32(PA0)和Arduino(A0)相连,通过改变电位器来确定主机到从机和从机到主机的发送值(0到255)。   STM32F103C8中的SPI   比较 Arduino 和 STM32F103C8 Blue Pill 板中的 SPI 总线,STM32 有2 条 SPI 总线
[单片机]
在<font color='red'>STM32</font>单片机中使用SPI通信的方法
STM32使用J-Link仿真相关汇总
目录: 一、SWD实时仿真接线 二、仿真设置 三、仿真时问题的解决 1、仿真时添加变量或数组 2、程序下载 3、尽量不要由J-Link给线路板供电 4、仿真器与线路板连接需可靠 5、使用J-Link时,Keil软件出现无响应 ---------------------------------------- 所有的操作基于WIN XP,stm32使用J-Link(SWD模式)。 另可参见 系统、软件、数码 / Keil编译软件的使用汇总 (三、Keil5.12编译报错的处理)。 ----------------------------------------------------------------------------
[单片机]
<font color='red'>STM32</font>使用J-Link仿真相关汇总
ATMega16单片机外部中断的使用
// Crystal: 7.3728M Hz ,功能:学习外部中断0的程序 #include iom16v.h #include macros.h #define LED _COM PORTA ^= (1 PA6) // void port_init(void) { PORTA = 0x40; DDRA = 0x40; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x04; DDRD = 0x00;
[单片机]
STM32八种IO口模式区别
STM32八种IO口模式区别 (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 以下是详细讲解 (1)GPIO_Mode_AIN 模拟输入 即关闭施密特触发器,将电压信号传送到片上外设模块(不接上、下拉电阻) (2)GPIO_Mode_IN_FLOATING 浮空输入 浮空输入状态下,IO
[单片机]
绘制stm32最小系统PCB图
一.原理图封装添加 1.添加工程 2.编译工程 3.封装原理图 打开AD软件,将封装库添加进来 添加文件到【可用库】中之后,将.PcbLib文件库移到最上面 左击需要封装的元件,在弹出的Properties中选择Add 元件封装 依次对其余元件进行封装 4.导入原理图 首先点击菜单中的设计 选择第一行 在弹出窗口中先选择验证变更,之后可以根据元件进行执行变更。成功将原理图导入PCB模块 二.PCB绘制 1.PCB布局 首先选择好相关元器件 2.PCB布线 开启交叉选择模式 这样方便对照元件查询 3.PCB覆铜 首先规划出覆铜的区域,选择工具,然后就根据之前画的线框拉出一个矩形
[单片机]
绘制<font color='red'>stm32</font>最小系统PCB图
STM32项目(三)——通用LIN控制器
需求: LIN马达控制器:AFS(DHL+AFL)——弯道辅助照明系统 DHL:上极限,下极限,零位,马达老化循环; AFL:左极限,右极限,零位,马达老化循环; 所有参数可配置:上极限,下极限,零位,左极限,右极限,马达循环上极限,马达循环下极限,马达循环次数,马达循环等待时间; 保存至少30款产品的配置,配置界面需要有添加,读取,查找,删除功能。 方案:STM32 + LIN + 串口(使用NXP的串口屏,TJA系列的LIN芯片) STM32的LIN接口作为主节点,马达作为从节点。 系统设计:RTX多任务设计,串口处理任务,显示屏处理任务,LIN发送任务; (1)、串口处理任务:点击串口屏会获取到点击的坐标值,串口中断接受
[单片机]
STM32的PC13、PC14、PC15用作普通IO口设置方法
1. 引脚 注:最新文档中已经删除“在同一时间只有一个引脚能作为输出”也就是三个引脚可以同时作为输出引脚,其他条件未变 2. 代码 void gpioc_to_io(void){ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE ); PWR_BackupAccessCmd( ENABLE );/* 允许修改RTC和后备寄存器*/ RCC_LSEConfig( RCC_LSE_OFF ); /* 关闭外部低速时钟,PC14+PC15可以用作普通IO*/ BKP_TamperPinCmd(DISABLE); /* 关
[单片机]
X-CUBE-STL:支持更多STM32, 揭开功能安全的神秘面纱
X-CUBE-STL 目前支持 STM32MP1、STM32U5、STM32L5、STM32H5和 STM32WL。实际上,这个最大的通用微控制器产品家族还在不断扩大,将会有更多的产品支持SIL2和SIL3系统。客户的开发团队可以在ST最新的产品上开发满足 IEC 61508、ISO 13849 和 IEC 61800 等要求 的应用。此外,在ST网站的功能安全网页上,开发者很容易找到各种资源,轻松快速通过工业或家电安全认证。网页上还列出了ST 授权合作伙伴以及他们提供的实时操作系统、开发工具、工程服务和培训课程,确保客户团队能够完成从概念验证到商品的市场转化。 o观看ST的功能安全网络研讨会 国际电工委员会对安全的定
[单片机]
X-CUBE-STL:支持更多<font color='red'>STM32</font>, 揭开功能安全的神秘面纱
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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