STM32F407中断学习笔记

发布者:tau29最新更新时间:2022-08-01 来源: csdn关键字:STM32F407  中断  触发 手机看文章 扫描二维码
随时随地手机看文章

中断与事件的区别

相同点:中断和事件都是触发的一种,都是可以设置触发的;

异同点:

中断触发后必须有中断处理子程序IRQ handle,例如比如按键中断触发,实现一个LED的闪烁,可以在按键按下后,在中断处理程序中实现某个LED的电平反转

但在事件中,事件是没有中断处理子程序的,事件发生后,会直接发出一个脉冲信号给与之联动的操作,也可以同样实现LED电平的反转,只要有事件发生,就会有一个脉冲信号,这样的好处是,不需要CPU干预了,可以节省CPU的处理资源,相比中断处理,速度还更快,因为硬件的速度总是比软件处理快。


EXTI 功能框图

在这里插入图片描述

EXTI 可分为两大部分功能,一个是产生中断,另一个是产生事件,这两个功能从硬件上就有所 不同。


红色虚线指示的电路流程。它是一个产生中断的线路,最终信号流入到NVIC 控制器内。

(1)编号 1 是输入线,EXTI 控制器有 23 个中断/事件输入线,这些输入线可以通过寄存器设置为任意一个 GPIO,也可以是一些外设的事件,这部分内容我们将在后面专门讲解。输入线一般是存在电平变化的信号。

(2) 编号 2 是一个边沿检测电路,它会根据上升沿触发选择寄存器(EXTI_RTSR) 和下降沿触发选择寄存器 (EXTI_FTSR) 对应位的设置来控制信号触发。边沿检测电路以输入线作为信号输入端,如果检测到有边沿跳变就输出有效信号 1 给编号 3 电路,否则输出无效信号 0。而 EXTI_RTSR 和EXTIFTSR 两个寄存器可以控制器需要检测哪些类型的电平跳变过程,可以是只有上升沿触发、只有下降沿触发或者上升沿和下降沿都触发。

(3)编号3电路实际就是一个或门电路,它一个输入来自编号2电路,另外一输入来自软件中断事件寄存器 (EXTI_SWIER)。EXTI_SWIER 允许我们通过程序控制就可以启动中断/事件线,这在某些地方非常有用。我们知道或门的作用就是有”就为 1,所以这两个输入随便一个有有效信号 1 就可以输出 1 给编号 4 和编号 6 电路。

(4)编号 4 电路是一个与门电路,它一个输入编号 3 电路,另外一个输入来自中断屏蔽寄存器(EXTI_IMR)。与门电路要求输入都为 1 才输出 1,导致的结果EXTI_IMR 设置为 0 时,那不管编号 3 电路的输出信号是 1 还是 0,最终编号 4 电路输出的信号都为 0;如果 EXTI_IMR设置为 1 时,最终编号 4 电路输出的信号才由编号 3 电路的输出信号决定,这样我们可以简单的控制 EXTI_IMR 来实现是否产生中断的目的。编号 4 电路输出的信号会被保存到挂起寄存器(EXTI_PR) 内,如果确定编号 4 电路输出为 1 就会把 EXTI_PR 对应位置1。

(5)编号 5 是将 EXTI_PR 寄存器内容输出到 NVIC 内,从而实现系统中断事件控制


接下来我们来看看绿色虚线指示的电路流程。它是一个产生事件的线路,最终输出一个脉冲信号。


产生事件线路是在编号 3 电路之后与中断线路有所不同,之前电路都是共用的。编号 6 电路是一个与门,它一个输入编号 3 电路,另外一个输入来自事件屏蔽寄存器 (EXTI_EMR)。如果EXTI_EMR 设置为 0 时,那不管编号 3 电路的输出信号是 1 还是 0,最终编号 6 电路输出的信号都为 0;如果 EXTI_EMR 设置为 1 时,最终编号 6 电路输出的信号才由编号 3 电路的输出信号决定,这样我们可以简单的控制 EXTI_EMR 来实现是否产生事件的目的。


(1)编号 7 是一个脉冲发生器电路,当它的输入端,即编号 6 电路的输出端,是一个有效信号 1 时就会产生一个脉冲;如果输入端是无效信号就不会输出脉冲。

(2)编号 8 是一个脉冲信号,就是产生事件的线路最终的产物,这个脉冲信号可以给其他外设电路使用,比如定时器 TIM、模拟数字转换器 ADC 等等


中断程序的编写步骤

1.初始化需要连接到的EXTI的GPIO

2.初始化EXTI

3.配置NVIC中断优先级

4.编写中断服务函数


案例如下:


/*KEY1    宏定义*/

#define   KEY1_INIT_GPIO_CLK         RCC_AHB1Periph_GPIOA

#define   KEY1_INIT_GPIO_PORT         GPIOA

#define   KEY1_INIT_GPIO_PIN GPIO_Pin_0

#define   KEY1_INIT_GPIO_PORTSOURCE      EXTI_PortSourceGPIOA

#define   KEY1_INIT_GPIO_PINSOURCE       EXTI_PinSource0

#define   KEY1_INT_EXTI_LINE EXTI_Line0

#define   KEY1_INT_EXTI_IRQ            EXTI0_IRQn

#define   KEY1_IRQHandler EXTI0_IRQHandler


/*KEY2    宏定义*/

#define   KEY2_INIT_GPIO_CLK         RCC_AHB1Periph_GPIOC

#define   KEY2_INIT_GPIO_PORT         GPIOC

#define   KEY2_INIT_GPIO_PIN GPIO_Pin_13

#define   KEY2_INIT_GPIO_PORTSOURCE      EXTI_PortSourceGPIOC

#define   KEY2_INIT_GPIO_PINSOURCE       EXTI_PinSource13

#define   KEY2_INT_EXTI_LINE EXTI_Line13

#define   KEY2_INT_EXTI_IRQ            EXTI15_10_IRQn

#define   KEY2_IRQHandler EXTI15_10_IRQHandler


第一步:初始化需要连接到的EXTI的GPIO


void EXIT_KEY_Config(void){

/*第一步:初始化需要连接到EXIT线的GPIO*/

/*初始化GPIO时钟*/

RCC_AHB1PeriphClockCmd(KEY1_INIT_GPIO_CLK|KEY2_INIT_GPIO_CLK,ENABLE);//打开key1,key2的GPIO时钟

/*定义GPIO初始化结构体*/

GPIO_InitTypeDef  GPIO_InitStructure;

/*配置KEY1_GPIO初始化结构体成员*/

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;//输入模式

/*EXIT_KEY_Typedef.GPIO_OType=GPIO_OType_PP;    输入模式中用不到*/

GPIO_InitStructure.GPIO_Pin=KEY1_INIT_GPIO_PIN; //定义引脚

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//无上下拉

GPIO_InitStructure.GPIO_Speed=GPIO_Low_Speed;//速度:LOW

/*调用GPIO初始化函数,把配置好的KEY1_GPIO初始化成员写入寄存器*/

GPIO_Init(KEY1_INIT_GPIO_PORT, &GPIO_InitStructure);

/*配置KEY2_GPIO初始化结构体成员,与KEY1_GPIO相一致,只需配置引脚*/

GPIO_InitStructure.GPIO_Pin=KEY2_INIT_GPIO_PIN; //定义引脚


/*调用GPIO初始化函数,把配置好的KEY2_GPIO初始化成员写入寄存器*/

GPIO_Init(KEY2_INIT_GPIO_PORT, &GPIO_InitStructure);

/*第二步:初始化EXIT*/

EXTI_Config();


/*第三步:配置NVIC中断优先级*/

NVIC_Config();

/*第四步:编写中断服务函数*/

//在stm32f4xx_it.c文件中编写了

}


第二步:初始化EXTI


void EXTI_Config(void){

/*使能 SYSCFG 时钟,使用GPIO外部中断时必须使能 SYSCFG 时钟*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);

/*连接 EXIT 中断源到 key1 引脚*/

SYSCFG_EXTILineConfig(KEY1_INIT_GPIO_PORTSOURCE,KEY1_INIT_GPIO_PINSOURCE);

/*连接 EXIT 中断源到 key2 引脚*/

SYSCFG_EXTILineConfig(KEY2_INIT_GPIO_PORTSOURCE,KEY2_INIT_GPIO_PINSOURCE);

/*定义中断初始化结构体*/

EXTI_InitTypeDef EXTI_InitStructure;

/*配置EXTI初始化结构体成员*/

//KEY1中断

EXTI_InitStructure.EXTI_Line=KEY1_INT_EXTI_LINE; //选择EXTI中断源

EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//中断模式

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;//上升沿触发

/*使能中断/事件线*/

EXTI_InitStructure.EXTI_LineCmd=ENABLE;

EXTI_Init(&EXTI_InitStructure);

//KEY2中断,相同部分不许要配置

EXTI_InitStructure.EXTI_Line=KEY2_INT_EXTI_LINE; //选择EXTI中断源

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿触发

/*使能中断/事件线*/

EXTI_InitStructure.EXTI_LineCmd=ENABLE;

EXTI_Init(&EXTI_InitStructure);


第三步:配置NVIC中断优先级


/*配置NVIC优先级*/

void NVIC_Config(void){

/*定义NVIC初始化结构体*/

NVIC_InitTypeDef NVIC_InitStructure;

/*配置NVIC优先级组1*/

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

/*配置中断源:KEY1*/

NVIC_InitStructure.NVIC_IRQChannel=KEY1_INT_EXTI_IRQ;

/*配置抢占优先级*/

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

/*配置子优先级*/

NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;

/*中断使能通道*/

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

  NVIC_Init(&NVIC_InitStructure);

/*配置中断源:KEY2*/

NVIC_InitStructure.NVIC_IRQChannel=KEY2_INT_EXTI_IRQ;

/*中断使能通道*/

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

  NVIC_Init(&NVIC_InitStructure);

}


第四步:编写中断服务函数


void KEY1_IRQHandeler(void){

/*确保是否产生了EXTI Line中断*/

if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE)==SET)

{

/*灯翻转一次*/

}

/*清除中断标志位*/

EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);

}


void KEY2_IRQHandeler(void){

/*确保是否产生了EXTI Line中断*/

if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE)==SET)

{

/*灯翻转一次*/

}

/*清除中断标志位*/

EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);

}

关键字:STM32F407  中断  触发 引用地址:STM32F407中断学习笔记

上一篇:STM32F429 Cubemx配置Timer实现5ms一个中断
下一篇:stm32系统时钟学习笔记

推荐阅读最新更新时间:2024-11-17 00:31

stm32f407之DMA(操作寄存器)
八、DMA 直接内存访问(DMA)是用来以提供外设和内存、内存和内存之间的高速数据传输的。数据可以在没有任何CPU干预下通过的DMA进行传输。这使得CPU资源更倾重与其他操作。 DMA控制器基于一个复杂的总线矩阵架构,结合了功能强大的双AHB主总线架构与独立的FIFO,以优化系统带宽。 两个DMA控制器共有16个数据流(stream),每个数据流可以编程与规定的通道中的一个搭配。 DMA的工作模式 1. 单次传输 2. 多次传输(burst):把数据分成多次传输 DMA的工作模式 1. 循环模式:循环模式是可用来处理循环缓冲区和连续的数据流(如ADC扫描模式)。启此功能可以设置DMA_SxC
[单片机]
ATmega128 中断向量
本节说明ATmega128 的中断处理。更一般的AVR 中断处理请参见 P 12“ 复位和中断处理” 。 Notes: 1. 当熔丝位BOOTRST被编程时,复位后程序跳转到Boot Loader。请参见 P 255“ 支持引导装入程序 – 在写的同时可以读(RWW, Read-While-Write) 的自我编程能力” 。 2. 当寄存器MCUCR的IVSEL置位时,中断向量转移到Boot区的起始地址。此时各个中断向量的实际地址为表中地址与Boot 区起始地址之和。 3. 地址为$0030 - $0044 的中断在ATmega103 兼容模式中不存在。 Table 24给出了不同的BOOTRST/IVSEL设置下的复位和中
[单片机]
ATmega128 <font color='red'>中断</font>向量
8051单片机定时器溢出中断与CPU响应中断的时间误差分析
1 前言 单片机内部一般有若干个定时器。如8051单片机内部有定时器0和定时器1。在定时器计数溢出时,便向CPU发出中断请求。当CPU正在执行某指令或某中断服务程序时,它响应定时器溢出中断往往延迟一段时间。这种延时虽对单片机低频控制系统影响甚微,但对单片机高频控制系统的实时控制精度却有较大的影响,有时还可能造成控制事故。为扩大单片机的应用范围,本文介绍它的定时器溢出中断与CPU响应中断的时间误差、补偿误差的方法和实例。 2 误差原因、大小及特点 产生单片机定时器溢出中断与CPU响应中断的时间误差有两个原因。一是定时器溢出中断信号时,CPU正在执行某指令;二是定时器溢出中断信号时,CPU正在执行某中断服务程序。 2.1. C
[单片机]
示波器UART协议触发
  ZDS2022示波器百场技术交流会依然在如火如荼进行中,近期某客户跟我司FAE交流,他想稳定触发UART数据帧的第一个位,依次进行了“边沿触发”--“上升沿触发”设置,然后进行【Simple】单次触发,经测试多次,屏幕上偶尔出现“不在第一个上升沿触发,在后面的上升沿触发”,这到底是怎么回事呢?   首先,边沿触发并不会挑“边沿”或是只认第一个边沿,所以每一个符合触发条件的边沿,都是有可能触发的。实际上客户是想实现稳定触发UART数据帧的第一个位的功能,ZDS2022示波器本身就包含21种协议触发功能,不必使用边沿触发。   图1 屏幕上出现不在第一个边沿触发的情况   如何操作呢?我们按下【Trigger】键,将触发方
[测试测量]
示波器UART协议<font color='red'>触发</font>
51单片机基础之外部中断(一)
代码: #include reg51.h typedef unsigned char u8; typedef unsigned int u16; sbit LED=P2^0; sbit KEY=P3^2; void delay(u16 i) { while(i--); } void EXIT0_Init(void) //外部中断初始化 { IT0=1;//跳变沿触发方式(下降沿),低电平触发 EX0=1;//打开INT0的中断允许,打开外部中断0允许 EA=1;//打开总中断 } void main(void) { EXIT0_Init(); while
[单片机]
STM32 MCU通过STM32CubeMx配置NVIC怎么没有中断子优先级选项
1、使用CubeMx配置NVIC时为何不见子优先级选项? 有些STM32用户,尤其是那些用过基于ARM Cortx-M3/M4/M7内核的STM32 MCU的用户,在使用基于M0/M0+内核的STM32系列并通过STM32CubeMx进行NVIC配置时,不难发现一个问题,那就是怎么没有中断子优先级【或称响应优先级、副优先级等】的配置?!【当然,很多时候我们或许没有关注子优先级】如下图所示,只看到抢占优先级的配置,看不到子优先级的配置项。 上图是我基于STM32L0系列芯片的配置,该系列芯片是基于ARM Cortex-M0+内核的。我们再看看下图的NVIC配置页面,显然可以看到抢占优先级【PreemptionPriority】和
[单片机]
STM32 MCU通过STM32CubeMx配置NVIC怎么没有<font color='red'>中断</font>子优先级选项
51单片机中断学习
一、中断的概念 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 二、中断源 在51单片机中有5个中断源 中断号 优先级 中断源 中断入口地址 0 1(最高) 外部中断0 0003H 1
[单片机]
51单片机<font color='red'>中断</font>学习
PIC单片机中断模块介绍
  PIC单片机中断模块介绍:    PIC 16F87X系列单片机可以接收多达14个中断源。中断控制器寄存器INTCON标记着各个中断源的请求,对各个中断设置屏蔽位,对全部中断设置全局屏蔽位。   PIC16F87X系列的中断包含:TMR0溢出中断(TOIF)、外部中断(INTF)、端口B变化中断(RBIF)、并行从动端口中断(PSPIF)、A/D变换中断、USART异步接收中断(RCIF)和异步发送中断(TXIF)、同步串行端口中断(SSPIF)、CCP1中断(CCPIIF)、TMR2中断(TMR2IF)、TMR1中断、CCP1中断(CCP2)、E2PROM写中断(EEIF)、总线碰撞中断(BCLIF)。   各个中断采
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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