STM32外部中断

合集下载

stm32外部中断回传参数

stm32外部中断回传参数

stm32外部中断回传参数【最新版】目录1.STM32 外部中断的基本概念2.STM32 外部中断的触发方式3.STM32 外部中断的回传参数4.STM32 外部中断的应用实例5.总结正文一、STM32 外部中断的基本概念STM32 外部中断,也被称为 IO 中断或事件控制器(EXTI)外部中断,是一种在中断系统中产生的中断。

它主要用于检测外部硬件设备的事件,如按键、传感器等。

外部中断可以由上升沿、下降沿或双边沿触发,并且可以单独配置和屏蔽。

在 STM32F103RCT6 芯片中,外部中断通道共有 19 个,每个通道可以独立配置触发事件和屏蔽。

二、STM32 外部中断的触发方式STM32 外部中断的触发方式主要有以下几种:1.上升沿触发:当外部信号从低电平跃升至高电平时,触发外部中断。

2.下降沿触发:当外部信号从高电平跌落至低电平时,触发外部中断。

3.双边沿触发:当外部信号从低电平跃升至高电平,然后再跌落至低电平时,触发外部中断。

三、STM32 外部中断的回传参数当外部中断被触发时,STM32 芯片会将一些相关信息回传给程序,这些信息包括:1.中断类型:用于区分不同类型的外部中断,如按键、传感器等。

2.中断通道:用于指示触发中断的外部中断通道。

3.中断优先级:用于表示当前中断在所有中断中的优先级,便于程序处理。

四、STM32 外部中断的应用实例以下是一个简单的 STM32 外部中断应用实例:假设我们有一个按键,当按键被按下时,触发外部中断。

我们可以通过以下步骤配置 STM32 外部中断:1.配置 GPIO 口:将按键连接到 STM32 的 GPIO 口,并将 GPIO 口设置为外部中断输入模式。

2.配置外部中断:设置触发方式为下降沿触发,并将中断优先级设置为最高。

3.编写中断处理程序:当按键被按下时,执行中断处理程序,实现相应的功能。

五、总结STM32 外部中断是一种灵活的中断方式,可以方便地检测外部硬件设备的事件。

stm32g030外部中断回调函数

stm32g030外部中断回调函数

一、STM32G030外部中断简介1.1 STM32G030外部中断的定义1.2 STM32G030外部中断的原理1.3 STM32G030外部中断的应用场景二、外部中断回调函数的概念和作用2.1 外部中断回调函数的定义2.2 外部中断回调函数的原理2.3 外部中断回调函数的作用三、STM32G030外部中断回调函数的编写步骤3.1 配置外部中断引脚3.2 初始化外部中断3.3 编写回调函数3.4 注册回调函数3.5 案例演示四、外部中断回调函数的注意事项和常见问题4.1 中断优先级设置4.2 中断清除标志位4.3 嵌套中断处理4.4 延时处理问题五、总结和展望5.1 对STM32G030外部中断回调函数的总结5.2 未来发展趋势和技术应用文章正文:一、STM32G030外部中断简介1.1 STM32G030外部中断的定义STM32G030外部中断是指通过外部引脚(通常为GPIO引脚)来触发微控制器的中断请求,从而实现对外部事件的实时响应。

1.2 STM32G030外部中断的原理STM32G030外部中断的原理是通过设置外部中断触发条件和相应的中断优先级,在外部事件触发时,将中断请求发送给中断控制器,由中断控制器将控制权交给中断服务程序,从而实现对外部事件的处理。

1.3 STM32G030外部中断的应用场景STM32G030外部中断广泛应用于各种外部事件的处理,例如按钮按下、传感器检测等实时事件的响应和处理。

二、外部中断回调函数的概念和作用2.1 外部中断回调函数的定义外部中断回调函数是指在外部中断事件触发时自动执行的函数,通常由用户在程序中编写并注册,用于处理外部中断事件。

2.2 外部中断回调函数的原理外部中断回调函数的原理是通过在中断服务程序中调用注册的回调函数来处理外部中断事件,从而实现针对性的事件响应和处理。

2.3 外部中断回调函数的作用外部中断回调函数的作用是实现对外部中断事件的定制化处理,提高系统的灵活性和可维护性。

stm32 外部中断计算脉冲占空比

stm32 外部中断计算脉冲占空比

stm32 外部中断计算脉冲占空比
在STM32微控制器中,我们可以使用外部中断来计算脉冲的占空比。

脉冲的占空比是指脉冲高电平与总脉冲周期的比例。

首先,我们需要配置外部中断的引脚作为输入信号。

我们可以使
用GPIO口的中断功能,通过配置寄存器来使引脚能够触发外部中断。

例如,我们可以使用EXTI寄存器来配置外部中断,具体步骤如下:
1. 配置引脚为输入模式,并使能输入缓冲区。

2. 配置EXTI寄存器的模式和触发方式。

我们可以选择边沿触发方式,例如上升沿触发或下降沿触发。

3. 配置NVIC寄存器使能对应的外部中断通道。

4. 编写中断服务函数,当外部中断被触发时,该函数会被执行。

5. 在中断服务函数中,我们可以通过计算两个连续的外部中断触发时
间来计算脉冲的占空比。

我们可以使用定时器计数器的值来获取时间
信息。

在中断服务函数中,我们可以使用定时器的计数器来获取当前时
间和上次触发时间。

通过计算这两个时间之间的差值,我们可以得到
脉冲的周期。

然后,我们可以计算脉冲的高电平时间,即脉冲的占空比。

具体的计算方法取决于定时器的配置。

总之,通过配置外部中断和定时器,我们可以计算脉冲的占空比。

这使得我们可以实现各种应用,例如测量脉冲周期、频率等。

请注意,以上只是一个简单的示例,实际的实现可能需要根据具
体的要求进行修改和扩展。

stm32外部中断实验报告-STM32实例外部中断实验

stm32外部中断实验报告-STM32实例外部中断实验

stm32外部中断实验报告_STM32实例外部中断实验上⼀篇⽂章我们介绍了 STM32F10x 的中断,这次我们就来学习下外部中断。

本⽂中要实现的功能与按键实验⼀样,即通过按键控制LED,只不过这⾥采⽤外部中断⽅式进⾏控制。

学习时可以参考《STM32F10x 中⽂参考⼿册》-9 中断和事件章节。

外部中断介绍EXTI 简介STM32F10x 外部中断/事件控制器(EXTI)包含多达 20 个⽤于产⽣事件/中断请求的边沿检测器。

EXTI 的每根输⼊线都可单独进⾏配置,以选择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或边沿触发),还可独⽴地被屏蔽。

EXTI 结构框图EXTI 框图包含了 EXTI 最核⼼内容,掌握了此框图,对 EXTI 就有⼀个全局的把握,在编程的时候思路就⾮常清晰。

从图中可以看到,有很多信号线上都有标号 9 样的“20”字样,这个表⽰在控制器内部类似的信号线路有 20 个,这与 STM32F10x 的 EXTI 总共有20 个中断/事件线是吻合的。

因此我们只需要理解其中⼀个的原理,其他的 19个线路原理都是⼀样的。

EXTI 分为两⼤部分功能,⼀个产⽣中断,另⼀个产⽣事件,这两个功能从硬件上就有所差别,这个在框图中也有体现。

从图中标号 3 的位置处就分出了两条线路,⼀条是 3-4-5 ⽤于产⽣中断,另⼀条是 3-6-7-8⽤于产⽣事件。

下⾯我们就来介绍下这两条线路:(1)⾸先看下产⽣中断的这条线路(1-2-3-4-5)1.标号 1 为输⼊线,EXTI 控制器有 20 个中断/事件输⼊线,这些输⼊线可以通过寄存器设置为任意⼀个 GPIO,也可以是⼀些外设的事件,这部分内容我们会在后⾯专门讲解。

输⼊线⼀般是存在电平变化的信号。

2.边沿检测电路,EXTI 可以对触发⽅式进⾏选择,通过上升沿触发选择寄存器和下降沿触发选择寄存器对应位的设置来控制信号触发。

边沿检测电路以输⼊线作为信号输⼊端,如果检测到有边沿跳变就输出有效信号 1 给红⾊框 3 电路,否则输出⽆效信号 0。

使用HAL库开发STM32GPIO口基础使用与外部中断

使用HAL库开发STM32GPIO口基础使用与外部中断

使用HAL库开发STM32GPIO口基础使用与外部中断GPIO(General Purpose Input/Output)是STM32系列微控制器上常见的功能模块之一,它用于与外部设备进行数据交互。

本文主要介绍如何使用HAL库来配置和使用STM32的GPIO口,并实现外部中断功能。

在使用GPIO口之前,我们首先需要了解STM32芯片上的GPIO引脚的命名方式。

以STM32F103C8T6为例,它具有32个GPIO引脚,从PA0到PA15和PB0到PB15、其中,GPIO口的命名方式为"A"加上引脚的编号。

例如,PA0表示GPIOA的第0个引脚,PB10表示GPIOB的第10个引脚。

1.引入头文件和宏定义首先,在代码文件的顶部引入"stm32f1xx_hal.h"头文件。

然后,在需要使用GPIO功能的地方,定义一个GPIO_InitTypeDef结构体变量,并通过它来配置GPIO的参数。

2.配置GPIO模式和速度在设置GPIO口之前,需要配置GPIO的模式和速度。

通过设置GPIO_InitStruct结构体变量的对应成员变量来实现。

例如,要将PA5配置为推挽输出模式,可以使用如下语句:```GPIO_InitStruct.Pin = GPIO_PIN_5;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);```这里,GPIO_PIN_5表示PA5引脚,GPIO_MODE_OUTPUT_PP表示推挽输出模式,GPIO_SPEED_FREQ_HIGH表示高速模式。

3.配置GPIO引脚在配置好GPIO模式和速度后,可以通过HAL_GPIO_Init函数来配置GPIO引脚,并进行初始化。

STM32外部中断处理流程

STM32外部中断处理流程

STM32外部中断处理流程外部中断是指引发中断的事件来自于MCU外部的输入引脚或外设,需要通过配置寄存器和中断服务程序来处理外部中断。

在STM32系列MCU中,外部中断处理可分为以下几个步骤。

1.配置中断引脚要使用外部中断功能,首先需要配置中断引脚。

对于STM32,外部中断引脚由GPIO口提供,需要通过GPIO配置寄存器设置相关引脚的工作模式、上下拉和中断触发方式等。

具体配置方法可以参考芯片手册。

2.配置中断控制器外部中断的中断源需要连接到中断控制器(NVIC),通过配置NVIC的相关寄存器来使能外部中断。

NVIC是位于ARM Cortex-M内核内部的外设,用于管理和分配中断优先级。

3.编写中断服务程序(ISR)中断服务程序(Interrupt Service Routine, ISR)是用于处理中断事件的函数,当外部中断引发时,MCU会跳转到相应的ISR进行处理。

在编写ISR时,需要注意以下几点:-确定中断源:可以通过读取中断状态寄存器来判断是哪个外部中断引起的中断。

-处理中断事件:根据中断源的不同,进行相应的处理。

例如,可以读取输入引脚状态、处理外设状态等。

-清除中断标志位:要在ISR内部清除中断标志位,以允许MCU再次响应该外部中断。

具体方法是通过读取相应的寄存器或调用相关函数清除中断标志位。

4.配置中断优先级中断优先级用于确定ISR的响应顺序,优先级较高的中断先被处理。

在STM32中,中断优先级可以通过配置中断控制器的相关寄存器进行设置。

5.启用中断在完成上述步骤后,需要启用相应的中断引脚和中断控制器。

具体方法是通过设置GPIO寄存器来使能中断引脚,并通过设置NVIC寄存器来使能相关中断。

6.处理中断请求一旦发生外部中断事件,MCU就会跳转到相应的ISR进行中断处理。

在ISR中,可以根据需要调用其他的函数或执行其他的操作。

处理完成后,可以通过清除中断标志位和退出中断函数来结束中断处理。

stm32外部中断的使用(含实例)

stm32外部中断的使用(含实例)

stm32外部中断的使⽤(含实例)中断对于开发嵌⼊式系统来讲的地位绝对是⽏庸置疑的,在C51单⽚机时代,⼀共只有5个中断,其中2个外部中断,2个定时/计数器中断和⼀个串⼝中断,但是在STM32中,中断数量⼤⼤增加,⽽且中断的设置也更加复杂。

今天就将来探讨⼀下关于STM32中的中断系统。

1 基本概念ARM Coetex-M3内核共⽀持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。

STM32⽬前⽀持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使⽤中断优先级设置8bit中的⾼4位。

STM32可⽀持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备⾃⼰的中断优先级控制字节PRI_n(8位,但是STM32中只使⽤4位,⾼4位有效),每4个通道的8位中断优先级控制字构成⼀个32位的优先级寄存器。

68个通道的优先级控制字⾄少构成17个32位的优先级寄存器。

4bit的中断优先级可以分成2组,从⾼位看,前⾯定义的是抢占式优先级,后⾯是响应优先级。

按照这种分组,4bit⼀共可以分成5组第0组:所有4bit⽤于指定响应优先级;第1组:最⾼1位⽤于指定抢占式优先级,后⾯3位⽤于指定响应优先级;第2组:最⾼2位⽤于指定抢占式优先级,后⾯2位⽤于指定响应优先级;第3组:最⾼3位⽤于指定抢占式优先级,后⾯1位⽤于指定响应优先级;第4组:所有4位⽤于指定抢占式优先级。

所谓抢占式优先级和响应优先级,他们之间的关系是:具有⾼抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。

当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当⼀个中断到来后,如果正在处理另⼀个中断,这个后到来的中断就要等到前⼀个中断处理完之后才能被处理。

如果这两个中断同时到达,则中断控制器根据他们的响应优先级⾼低来决定先处理哪⼀个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪⼀个。

STM32外部中断以及中断优先级

STM32外部中断以及中断优先级

外部中断(zhōngduàn)的初始化过程:1.初始化IO为输入(shūrù)(可以设置上拉,下拉,浮空)2.开启(kāiqǐ)IO复用(fù yònɡ)时钟3.开启(kāiqǐ)与该IO相对的线上(详解下)4.配置NVIC,使能中断5.编写中断服务函数外部中断:Stm32中总共有19个外部中断包括:线0-15:IO输入中断(每条线上最多有7个IO,如GPIOA~GPIOG,但是每一条线每次只允许同时连接到一个IO)线16:PVD线17:RTC线18:USB关于(guānyú)优先级:CM3中内核(nèi hé)支持256个中断(zhōngduàn)(16个内核(nèi hé)+240外部(wàibù))和可编程256级中断优先级的设置Stm32目前(mùqián)支持84个中断(zhōngduàn)(16个内核(nèi hé)+68个外部(wàibù),注:不是(bù shi)指68个外部中断),16级可编程优先级(优先级设置寄存器中使用了4位)注意:其中(qízhōng)外部中断5-9和中断(zhōngduàn)10-15向量存放(cúnfàng)在一起优先级:数值(shùzí)低的优先级要高于数值高的!!!!!!上电复位后,系统默认(mòrèn)使用的是组0;一个系统只能使用一组优先级组,不可使用多个,优先级的设置不能超过组的范围,否则会产生不可预计的错误1.高抢先级的中断可以打断低优先级的中断响应,构成中断嵌套2.相同抢先级的中断不可以构成嵌套,系统会优先响应子优先级高的3.当2(n)个相同抢先优先级和相同子优先级的中断(zhōngduàn)出现,STM32首先响应中断通道所对应的中断向量地址(dìzhǐ)低的那个中断4.0号抢先优先级的中断,可以(kěyǐ)打断任何中断抢先优先级为非0号的中断(zhōngduàn);1号抢先优先级的中断(zhōngduàn),可以打断任何中断抢先优先级为2、3、4号的中断;……;构成中断嵌套。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

GPIO_Pin_9, 5, GPIO_Pin_10, 6, GPIO_Pin_11, 6, GPIO_Pin_12, 6, GPIO_Pin_13, 6, GPIO_Pin_14, 6, GPIO_Pin_15, 6, };
GPIO_PinSource9, GPIO_PinSource10, GPIO_PinSource11, GPIO_PinSource12, GPIO_PinSource13, GPIO_PinSource14, GPIO_PinSource15,
RCC_APB2PeriphClockCmd(c_s_EXTI_PORT[EXTI_PORTx].Periph, ENABLE);
GPIO_InitStructure.GPIO_Pin = c_s_EXTI_PIN[EXTI_Pin_x].Pin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(c_s_EXTI_PORT[EXTI_PORTx].Port, &GPIO_InitStructure);
EXTI_PIN_ENUM EXTI_Pin_x,
EXTITrigger_TypeDef Trigger,
void(*pBackCallFun)(void)
Output
: None
Return Value : void
History
:
1.Date
: 2015/4/21
Author
: Hui.Liu
Modification : Created function
LED_Init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); sys_extiInit(EXTI_PORTB, EXTI_PIN_9, EXTI_Trigger_Rising, LED1);//设定外部中断引脚为 GPIOB_9,上升沿触发,进入中断后调用函数 void LED1(void); sys_extiInit(EXTI_PORTA, EXTI_PIN_1, EXTI_Trigger_Falling, LED2); while(1) { } return 0; }
void (*ExtiBackCallFun[NUM_OF_EXTI_PIN])(void) = {
(void *)0, (void *)0, (void *)0, (void *)0, (void *)0, (void *)0, (void *)0, (void *)0, (void *)0, (void *)0, (void *)0, (void *)0, (void *)0, (void *)0, (void *)0, (void *)0,
/******************************************************************************
Copyright (C), 2001-2011, DCN Co., Ltd.
******************************************************************************
EXTI_InitStructure.EXTI_Trigger
=
//@设置触发类型
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
void EXTI_Handler(EXTI_PIN_ENUM index) {
Author
: Hui.Liu
Modification: Created file
******************************************************************************/ #include "stm32f10x.h" #include "sys_exti.h"
};
/*****************************************************************************
Prototype : sys_extiInit
Description :
Input
: EXTI_PORT_ENUM EXTI_PORTx,
EXTI0_SubPriority, EXTI1_SubPriority, EXTI2_SubPriority, EXTI3_SubPriority, EXTI4_SubPriority, EXTI9_5_SubPriority, EXTI15_10_SubPriority,
typedef struct
STM32 外部中断驱动,方便使用 使用方法:先创建回调函数,然后调用 sys_extiInit 函数初始化外部中断即可。 示例: #include "stm32f10x.h"
void LED1(void) {
LED_1 = !LED1; } void LED2(void) {
LED_2 = !LED2; } int main(void) {
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
ExtiBackCallFun[EXTI_Pin_x] = pBackCallFun;
=
c_s_EXTI_PRIO[c_s_EXTI_PIN[EXTI_Pin_x].Index].SubPriority;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
GPIO_EXTILineConfig(c_s_EXTI_PORT[EXTI_PORTx].PortSource, c_s_EXTI_PIN[EXTI_Pin_x].Source); //@绑定外部中断端口
{
uint16_t Pin;
uint8_t Index;
uint8_t Source;
uint32_t Line;
} EXTI_PIN_STRUCT;
const EXTI_PIN_STRUCT c_s_EXTI_PIN[NUM_OF_EXTI_PIN] =
{
GPIO_Pin_0, 0,
GPIO_PinSource0, EXTI_Line0,
const EXTI_PRIO_STRUCT c_s_EXTI_PRIO[7] = {
EXTI0_IRQn, EXTI0_PreemptionPriority, EXTI1_IRQn, EXTI1_PreemptionPriority, EXTI2_IRQn, EXTI2_PreemptionPriority, EXTI3_IRQn, EXTI3_PreemptionPriority, EXTI4_IRQn, EXTI4_PreemptionPriority, EXTI9_5_IRQn, EXTI9_5_PreemptionPriority, EXTI15_10_IRQn, EXTI15_10_PreemptionPriority, };
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority
=
c_s_EXTI_PRIO[c_s_EXTI_PIN[EXTI_Pin_x].Index].PreemptionPriority;
NVIC_InitStructure.NVIC_IRQChannelSubPriority
GPIO_Pin_5, 5,
GPIO_PinSource5, EXTI_Line5,
GPIO_Pin_6, 5,
GPIO_PinSource6, EXTI_Line6,
GPIO_Pin_7, 5,
GPIO_PinSource7, EXTI_Line7,
GPIO_Pin_8, 5,
GPIO_PinSource8, EXTI_Line8,
EXTI_Line9, EXTI_Line10, EXTI_Line11, EXTI_Line12, EXTI_Line13, EXTI_Line14, EXTI_Line15,
typedef struct {
GPIO_TypeDef *Port; uint32_t Periph; uint8_t PortSource; } EXTI_PORT_STRUCT; const EXTI_PORT_STRUCT c_s_EXTI_PORT[NUM_OF_EXTI_PORT] = { GPIOA, RCC_APB2Periph_GPIOA, GPIO_PortSourceGPIOA, GPIOB, RCC_APB2Periph_GPIOB, GPIO_PortSourceGPIOB, GPIOC, RCC_APB2Periph_GPIOC, GPIO_PortSourceGPIOC, GPIOD, RCC_APB2Periph_GPIOD, GPIO_PortSourceGPIOD, GPIOE, RCC_APB2Periph_GPIOE, GPIO_PortSourceGPIOE, GPIOF, RCC_APB2Periph_GPIOF, GPIO_PortSourceGPIOF, GPIOG, RCC_APB2Periph_GPIOG, GPIO_PortSourceGPIOG, };
GPIO_Pin_1, 1,
相关文档
最新文档