stm32中断服务函数c语言,STM32 外部中断详解

发布者:760802csy最新更新时间:2021-10-11 来源: eefocus关键字:stm32  中断服务函数  c语言  外部中断 手机看文章 扫描二维码
随时随地手机看文章

本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断


1 前言

打算写一下中断,又忍不住想说一下中断的概念,去书上翻一翻,或者自己在搜索引擎上搜一下,都可以找到一大堆,包括本文写的这个外部中断也不例外。如果要写光是中断就可以单独写一篇了,所以本文直入主题,对于STM32的外部中断进行详细的剖析。


2 STM32的外部中断

下图来自《STM32参考手册》,从整个架构图可以知道,外部中断的功能可以配置六个寄存器;

中断屏蔽寄存器(EXTI_IMR)

事件屏蔽寄存器(EXTI_EMR)

上升沿触发选择寄存器(EXTI_RTSR)

下降沿触发选择寄存器(EXTI_FTSR)

软件中断事件寄存器(EXTI_SWIER)

挂起寄存器(EXTI_PR)

c039beb72989600043a03bc2f07e5ca1.png

EXTI支持配置20个中断和事件屏蔽位;

GPIO端口以下图的方式连接到16个外部中断/事件线上;EXTI_Line0 — EXTI_Line15;

EXTI_Line16 连接到PVD输出 ;

EXTI_Line17连接到RTC闹钟事件;

EXTI_Line18连接到USB唤醒事件;

EXTI_Line19连接到以太网唤醒事件(只适用于互联型产品);

GPIO的映射关系图如下所示;

8fa0bb8f4a8a845eefbe01508da1174d.png

3 中断服务函数的映射关系

GPIO

IRQn

IRQHandler

GPIO_Pin0

EXTI0_IRQn

EXTI0_IRQHandler

GPIO_Pin1

EXTI1_IRQn

EXTI1_IRQHandler

GPIO_Pin2

EXTI2_IRQn

EXTI2_IRQHandler

GPIO_Pin3

EXTI3_IRQn

EXTI3_IRQHandler

GPIO_Pin4

EXTI4_IRQn

EXTI4_IRQHandler

GPIO_Pin5 — GPIO_Pin9

EXTI9_5_IRQn

EXTI9_5_IRQHandler

GPIO_Pin10 — GPIO_Pin15

EXTI15_10_IRQn

EXTI15_10_IRQHandler

4 外部中断的配置

宏定义,抽象一下接口,方便后面修改;

#define Z_GPIO_PIN GPIO_Pin_5

#define Z_GPIO_PORT GPIOE

#define Z_PortSource GPIO_PortSourceGPIOE

#define Z_PinSource GPIO_PinSource5

#define Z_Line EXTI_Line5

#define Z_IRQ EXTI9_5_IRQn

GPIO的配置;这里GPIO的输入模式可以配置为浮空输入(GPIO_Mode_IN_FLOATING),上拉输入(GPIO_Mode_IPU)或者下拉输入(GPIO_Mode_IPD),具体如下图所示;

bcde4934450220bd5b80c03c321066bd.pngGPIO的配置代码如下;

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_StructInit(&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = Z_GPIO_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(Z_GPIO_PORT, &GPIO_InitStructure);

不要忘记外设总线时钟的配置;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |

RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF |

RCC_APB2Periph_GPIOG, ENABLE);

EXTI的配置,EXTI_Trigger这里支持三种模式;

EXTI_Trigger_Rising 上升沿触发;

EXTI_Trigger_Falling 下降沿触发;

EXTI_Trigger_Rising_Falling 上升沿和下降沿都可以触发;

GPIO_EXTILineConfig(Z_PortSource, Z_PinSource);

EXTI_InitStructure.EXTI_Line = Z_Line;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

NVIC的配置

NVIC_InitStructure.NVIC_IRQChannel = Z_IRQ;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

中断服务函数

void EXTI9_5_IRQHandler(void)

{

//中断服务函数

}


5 寄存器的操作

以下摘自**《STM32参考手册》**

产生产生中断的步骤,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在**中断屏蔽寄存器(EXTI_IMR)的相应位写1允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置1。在挂起寄存器(EXTI_PR)的对应位写1,将清除该中断请求。


产生事件的步骤:必须先配置好并使能事件线。根据需要的边沿检测通过设置2个触发寄存器,同时在中断屏蔽寄存器(EXTI_IMR)**的相应位写1允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置1。通过在软件中断/事件寄存器写1,也可以通过软件产生中断/事件请求。


中断屏蔽寄存器(EXTI_IMR)

事件屏蔽寄存器(EXTI_EMR)

上升沿触发选择寄存器(EXTI_RTSR)

下降沿触发选择寄存器(EXTI_FTSR)

软件中断事件寄存器(EXTI_SWIER)

挂起寄存器(EXTI_PR)

IMR如下图所示,其他几个类似;

3b0d9d610cc7669cd2c224119dd48a36.png

5.1 硬件中断选择

通过下面的过程来配置20个线路做为中断源:

配置20个中断线的屏蔽位(EXTI_IMR)

配置所选中断线的触发选择位(EXTI_RTSR和EXTI_FTSR);

配置对应到外部中断控制器(EXTI)的NVIC中断通道的使能和屏蔽位,使得20个中断线中的请求可以被正确地响应。


5.2 硬件事件选择

通过下面的过程,可以配置20个线路为事件源

配置20个事件线的屏蔽位(EXTI_EMR)

配置事件线的触发选择位(EXTI_RTSR和EXTI_FTSR)


5.3 软件中断/事件的选择

20个线路可以被配置成软件中断/事件线。下面是产生软件中断的过程:

配置20个中断/事件线屏蔽位(EXTI_IMR, EXTI_EMR)

设置软件中断寄存器的请求位(EXTI_SWIER)


6 总结

本文参考stm32手册对于外部中断的概念以及配置进行了介绍,

关键字:stm32  中断服务函数  c语言  外部中断 引用地址:stm32中断服务函数c语言,STM32 外部中断详解

上一篇:STM32 关于外部中断线、中断源和中断服务函数的问题
下一篇:stm32中断服务函数c语言,STM32中断使用总结——不使用固件库

推荐阅读最新更新时间:2024-10-31 10:50

STM32单片机的IIC硬件编程---查询等待方式
IIC器件是一种介于高速和低速之间的嵌入式外围设备,其实总体来说,它的速度算是比较慢的。通常情况下,速度慢的器件意味着更多的等待,这对于精益求精的嵌入式工程师来说,简直就是一个恶梦,低速器件的存取数据实在是太浪费资源。如何面对这种低速设备,而使系统运行达到最优化?我觉得应当尽可能多的使用硬件完成,这样软件的开销便会减小,系统软件不用过多的时间去等待这些数据,而专注于硬件的请求和处理。 IIC协议,在笔者看来,其实并不是一种很好的协议,它没有较好的出错恢复机制,它是基于一种状态机模式的通讯协议,在这个状态转换中出现任意一步错误,将会导致总线不可恢复,极脆弱。在400KHZ的最高带通讯速率下,很多时候也极易产生干抗,因其采用了
[单片机]
[bsp层][nrf52832][nrf52840][nrf52810][nrf52820][bsp_exti] exti/gpioe配置和使用
GPIOTE—GPIO任务和事件 GPIO任务和事件(GPIOTE)模块提供了使用任务和事件访问GPIO管脚的功能。 每个GPIOTE通道可以分配到一个引脚。 GPIOTE块使GPIOs能够在引脚状态变化上生成事件,可以用于通过PPI系统执行任务。 还可以使用ppissystem驱动GPIO更改系统事件的状态。 在系统开启或关闭时,可以对引脚状态变化进行低功耗检测 Table 31: GPIOTE properties 在每个GPIOTE通道中,最多可以使用三个任务来执行对一个引脚的写操作。 两个任务是固定的(SET和CLR),一个(OUT)是可配置的,可以执行以下操作: 设置 清除 翻转 通过以下输入条件之一,可以在
[单片机]
[bsp层][nrf52832][nrf52840][nrf52810][nrf52820][bsp_<font color='red'>exti</font>] <font color='red'>exti</font>/gpioe配置和使用
PIC单片机CCS之C语言(#USE FIXED_IO的用法)
#USE FIXED_IO 语法:#use fixed_io(port_outputs=pin.pin?) port是A~G. pin是在device.h文件中定义的脚数之一. 目的: 影响编译器如何产生输入输出代码,说明如下. 这种指令有效,直到出现下一个#use xxxx_io为止. 执行设置I/O的方法将使编译器产生代码,这种代码使I/O在每次使用的时候,要么是输入,要么是输出.根据I/O方向寄存器中的信息对引脚进行编程(I/O方向寄存器实际上被执行但不操作),这将存储一个字节到标准I/O使用的RAM中. 例子:#use fixed_io(a_outputs=PIN_A2,PIN_A3) //将PINA2和PIN_A
[单片机]
STM32之ADC库函数的介绍
ADC的基本概念希望各位网友查阅相应的手册,上面对ADC有比较详尽的介绍,包括误差的分析和消除。这里主要介绍ADC的基本库函数的定义和使用。 1.ADC_DeInit函数的功能是将外设ADCx的全部寄存器重设为默认值。 ADC_DeInit(ADC2); 2.ADC_Init函数的功能是根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器。其中ADC_InitTypeDef定义在stm32f10x_adc.h中。其结构体如下所示: typedef struct { u32 ADC_Mode;//可以设置ADC_Mode FunctionalState ADC_ScanConvMode;//规定了模数转换工作在扫描
[单片机]
关于STM32的ADC/DAC问题集锦
1、STM32的DAC转换是什么开始的呢? 问:STM32的DAC转换是什么开始的呢?如何利用DAC输出一个脉宽的控的单脉冲呢? 答:DAC是通过写入DAC输出寄存器开始的。另外,如果想要脉冲,使用TIM功能。 2、STM32的DAC输出电压 问:DAC的输出电压是如何调节的呢,输入的数字量和输出的电压怎么不成比例呢,输出电压不符合数据手册上提供的公式(DAC输出 = VREF X DOR / 4095),求高人指点,程序如下: #include stm32f10x_lib.h #define DAC_DHR8R1_Address 0x40007410 DAC_InitTypeDef DAC_InitStructure;
[单片机]
stm32上移植了ucos,现在需要使用到DS18B20采集温度
DS18B20的操作时序要使用到延时,我是用ucos的延时函数还是自己循环写一个延时? 现在有个问题:假如用ucos的延时函数,如果出现更高优先级的任务,那么会将读DS18B20这个任务挂起,会破坏DS18B20的时序操作,读不出来温度。这个延时我应该怎么处理? 分享到: 2012-08-14 08:40提问者采纳 第一 读取18B20的时候关闭任务切换,不进行任务调度 第二 通过任务通讯 互斥量 或者邮箱 让其他任务挂起 第三 关闭中断 第四 将操作18b20的任务优先级设置高点或者操作时提升其任务优先级 延时的话可以用ucos的延时函数 也可以自己写,不过还是用ucos的好 追问 谢
[单片机]
STM32 FLASH擦除、写入以及防止误擦除程序代码
编译环境:(Keil)MDK4.72.10 stm32库版本:STM32F10x_StdPeriph_Driver_3.5.0 一、本文不对FLASH的基础知识做详细的介绍,不懂得地方请查阅有关资料。   对STM32 内部FLASH进行编程操作,需要遵循以下流程:   1、FLASH解锁;   2、清除相关标志位;   3、擦除FLASH(先擦除后写入的原因是为了工业上制作方便,即物理实现方便);   4、写入FLASH;   5、锁定FLASH; 实例: #define FLASH_PAGE_SIZE ((uint16_t)0x400) //如果一页为1K大小 #define WRITE_START_ADDR ((uin
[单片机]
<font color='red'>STM32</font> FLASH擦除、写入以及防止误擦除程序代码
STM32系列是大端还是小端?
ARM的手册上有关于大小端的描述,如下: The processor can access data words in memory in little-endian format or big-endian format. It always accesses code in little-endian format. Note: Little-endian is the default memory format for ARM processors. STM32是固定配置为小端的 The bytes are coded in memory in Little Endian format. The lowest number
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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