STM32F429--EXTI外部中断/事件控制器

发布者:caoxians4589最新更新时间:2022-01-27 来源: eefocus关键字:STM32F429  EXTI  外部中断  事件控制器 手机看文章 扫描二维码
随时随地手机看文章

EXTI:External interrupt /event controll

具体的表现形式为


导致                 

外部的高低电平变化------------->中断/事件发生(需要配置NVIC)


外部中断/事件控制器功能框图

在这里插入图片描述

具体可以分为两部分:

1- 中断(下图的1,2,3,4,5)

2- 事件(下图的1,2,3,6,7,8)

在这里插入图片描述

由上图可知,外部中断是挂载到APB总线上的,/23表示有23根结构相同的线。

(详情看stm32f4xx的中文参考手册第十章第二小节部分,下面对应的10.x.x代表手册对应章节部分)


1处:输入线

10.2.5 SYSCFG外部中断配置寄存器,16X9=144个GPIO口

在这里插入图片描述
在这里插入图片描述

与上图类似,总共16条

SYSCFG_EXTICR2 EXTIx x(4~7)

SYSCFG_EXTICR3 EXTIx x(8~11)

SYSCFG_EXTICR4 EXTIx x(12~15)

剩余的7条

在这里插入图片描述

2处:边沿检测电路

在这里插入图片描述

3处:软件中断屏蔽寄存器

在这里插入图片描述

事件屏蔽寄存器如下

在这里插入图片描述

4处:挂起寄存器

在这里插入图片描述

5处:NVIC

具体查看官方的misc.h54行,73行(有点多就不一一列举),或者看ARM-Cortex-M4内核的官方手册说明,看名字就可以知道大概意思了,下面是部分截图。

在这里插入图片描述

实验设计

需求

1.PA0连接到EXTI用于产生中断,PA0的电平变化通过按键来控制

2.产生一次中断,LED翻转一次

编程须知:

打开开发板原理图,PA0是按键的连接引脚,默认被地拉低低电平,需要上升沿触发

编程要点:

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

2.初始化EXTI用于产生中断事件

3.初始化NVIC,用于处理中断

4.编写中断服务函数

5.main函数


1.bsp_led.c


#include "./led/bsp_led.h"   


 /**

  * @brief  初始化控制LED的IO

  */

void LED_GPIO_Config(void)

{

/*定义一个GPIO_InitTypeDef类型的结构体*/

GPIO_InitTypeDef GPIO_InitStructure;


/*开启LED相关的GPIO外设时钟*/

RCC_AHB1PeriphClockCmd ( LED1_GPIO_CLK|LED2_GPIO_CLK|LED3_GPIO_CLK|LED4_GPIO_CLK, ENABLE); 


/*选择要控制的GPIO引脚*/    

GPIO_InitStructure.GPIO_Pin = LED1_PIN;


/*设置引脚模式为输出模式*/

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;   

    

    /*设置引脚的输出类型为推挽输出*/

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

    

    /*设置引脚为上拉模式*/

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;


/*设置引脚速率为2MHz */   

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; 


/*调用库函数,使用上面配置的GPIO_InitStructure初始化GPIO*/

GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);

    

    /*选择要控制的GPIO引脚*/    

GPIO_InitStructure.GPIO_Pin = LED2_PIN;

    GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);

    

    /*选择要控制的GPIO引脚*/    

GPIO_InitStructure.GPIO_Pin = LED3_PIN;

    GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);

/*选择要控制的GPIO引脚*/    

GPIO_InitStructure.GPIO_Pin = LED4_PIN;

    GPIO_Init(LED4_GPIO_PORT, &GPIO_InitStructure);

/*关闭RGB灯*/

LED_RGBOFF;

/*指示灯默认开启*/

LED4(ON);

}


2.bsp_led.h


#ifndef __LED_H

#define __LED_H


#include "stm32f4xx.h"


//引脚定义

/*******************************************************/

//R 红色灯

#define LED1_PIN                  GPIO_Pin_10                 

#define LED1_GPIO_PORT            GPIOH                      

#define LED1_GPIO_CLK             RCC_AHB1Periph_GPIOH


//G 绿色灯

#define LED2_PIN                  GPIO_Pin_11                 

#define LED2_GPIO_PORT            GPIOH                      

#define LED2_GPIO_CLK             RCC_AHB1Periph_GPIOH


//B 蓝色灯

#define LED3_PIN                  GPIO_Pin_12                 

#define LED3_GPIO_PORT            GPIOH                       

#define LED3_GPIO_CLK             RCC_AHB1Periph_GPIOH


//小指示灯

#define LED4_PIN                  GPIO_Pin_11                 

#define LED4_GPIO_PORT            GPIOD                       

#define LED4_GPIO_CLK             RCC_AHB1Periph_GPIOD

/************************************************************/


/** 控制LED灯亮灭的宏,

* LED低电平亮,设置ON=0,OFF=1

* 若LED高电平亮,把宏设置成ON=1 ,OFF=0 即可

*/

#define ON  0

#define OFF 1


/* 带参宏,可以像内联函数一样使用 */

#define LED1(a) if (a)

GPIO_SetBits(LED1_GPIO_PORT,LED1_PIN);

else

GPIO_ResetBits(LED1_GPIO_PORT,LED1_PIN)


#define LED2(a) if (a)

GPIO_SetBits(LED2_GPIO_PORT,LED2_PIN);

else

GPIO_ResetBits(LED2_GPIO_PORT,LED2_PIN)


#define LED3(a) if (a)

GPIO_SetBits(LED3_GPIO_PORT,LED3_PIN);

else

GPIO_ResetBits(LED3_GPIO_PORT,LED3_PIN)

#define LED4(a) if (a)

GPIO_SetBits(LED4_GPIO_PORT,LED4_PIN);

else

GPIO_ResetBits(LED4_GPIO_PORT,LED4_PIN)


/* 直接操作寄存器的方法控制IO */

#define digitalHi(p,i) {p->BSRRL=i;}   //设置为高电平

#define digitalLo(p,i) {p->BSRRH=i;} //输出低电平

#define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态



/* 定义控制IO的宏 */

#define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_PIN)

#define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_PIN)

#define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_PIN)


#define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_PIN)

#define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_PIN)

#define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_PIN)


#define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_PIN)

#define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_PIN)

#define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_PIN)


#define LED4_TOGGLE digitalToggle(LED4_GPIO_PORT,LED4_PIN)

#define LED4_OFF digitalHi(LED4_GPIO_PORT,LED4_PIN)

#define LED4_ON digitalLo(LED4_GPIO_PORT,LED4_PIN)



/* 基本混色,后面高级用法使用PWM可混出全彩颜色,且效果更好 */


//红

#define LED_RED 

LED1_ON;

LED2_OFF;

LED3_OFF


//绿

#define LED_GREEN

LED1_OFF;

LED2_ON;

LED3_OFF


//蓝

#define LED_BLUE

LED1_OFF;

LED2_OFF;

LED3_ON


//黄(红+绿)

#define LED_YELLOW

LED1_ON;

LED2_ON;

LED3_OFF

//紫(红+蓝)

#define LED_PURPLE

LED1_ON;

LED2_OFF;

LED3_ON


//青(绿+蓝)

#define LED_CYAN

LED1_OFF;

LED2_ON;

LED3_ON

//白(红+绿+蓝)

#define LED_WHITE

LED1_ON;

LED2_ON;

LED3_ON

//黑(全部关闭)

#define LED_RGBOFF

LED1_OFF;

LED2_OFF;

LED3_OFF


void LED_GPIO_Config(void);


#endif /* __LED_H */


3.bsp_exti.c

#include "bsp_exti.h"

//static关键字表明该函数仅在这个文件可以使用

//misc.h54行,misc.h的73行

static void EXTI_NVIC_Config(void)//内核中断外设,都在misc.c文件中,misc.h的73行

{

NVIC_InitTypeDef NVIC_InitStruct; //定义一个NVIC初始化结构体变量

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//优先级分组

NVIC_InitStruct.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;//中断源

NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级

NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;//子优先级

NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能中断,大大门

NVIC_Init(&NVIC_InitStruct); //到此配置完毕

}


/*在stm32f4xx_exit.h文件的93行中,有EXTI初始化结构体

EXTI_InitTypeDef,然后初始化里面的成员,在80行。

值在105行*/

void EXTI_Key_Config(void)

{

/*定义一个GPIO_InitTypeDef类型的结构体*/

GPIO_InitTypeDef GPIO_InitStructure;

EXTI_InitTypeDef  EXTI_InitStruct;  //定义结构体变量


/*开启LED相关的GPIO外设时钟*/

RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_GPIOA, ENABLE);//打开AHB1总线时钟

/*选择要控制的GPIO引脚*/    

GPIO_InitStructure.GPIO_Pin =  KEY1_GPIO_PIN; //GPIOA的0脚

/*设置引脚模式为输入模式*/

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

    /*设置引脚为浮空模式*/

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//浮空,在stm32f4xx.gpio.h文件110行位置

/*调用库函数,使用上面配置的GPIO_InitStructure初始化GPIO*/

GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);//将引脚和结构体初始化完成


RCC_APB2PeriphClockCmd ( RCC_APB2Periph_SYSCFG, ENABLE);//用到了EXTI0,挂载到PLCLK2,要打开AHB2总线时钟

SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE, KEY1_INT_EXTI_PINSOURCE); //作用:把PA0连接到EXTI0.

//param1:中断源端口  GPIOA  

   //param2:中断源引脚  PA0

   

EXTI_InitStruct.EXTI_Line = KEY1_INT_EXTI_LINE; //PA0,选择EXTI0为输入线

EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//设置模式为中断模式,另一个是事件模式

        EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//设置触发方式为上升沿触发

EXTI_InitStruct.EXTI_LineCmd = ENABLE;//使能,打开大门

EXTI_Init(&EXTI_InitStruct);//在stm32f4xx_exti.h文件,把配置好的成员写到寄存器里面,到此初始化完毕。

EXTI_NVIC_Config();//调用NVIC中断控制器初始化函数。

}


3.bsp_exti.h


#ifndef __BSE_EXTI_H 

#define __BSE_EXTI_H 


#include "stm32f4xx.h"


#define KEY1_GPIO_PIN             GPIO_Pin_0                 

#define KEY1_GPIO_PORT            GPIOA                      

#define KEY1_GPIO_CLK             RCC_AHB1Periph_GPIOA

#define KEY1_INT_EXTI_LINE        EXTI_Line0


#define KEY1_INT_EXTI_PORTSOURCE  EXTI_PortSourceGPIOA

#define KEY1_INT_EXTI_PINSOURCE   EXTI_PinSource0

#define KEY1_INT_EXTI_IRQ         EXTI0_IRQn


#define KEY1_INT_EXTI_IRQHANDLER  EXTI0_IRQHandler //宏定义中断函数名称




#define KEY2_GPIO_PIN             GPIO_Pin_13                 

#define KEY2_GPIO_PORT            GPIOC                      

#define KEY2_GPIO_CLK             RCC_AHB1Periph_GPIOC



void EXTI_Key_Config(void);


#endif /* __BSE_EXTI_H */


5.stm32f4xx_it.h下面补充编写中断服务函数(一般中断服务函数放在这个地方)


#include "stm32f4xx_it.h"

#include "bsp_led.h"

#include "bsp_exti.h"


/*中断服务函数都写在stm32f4xx_it.c这个函数里面

名字怎么写?看启动文件startup_stm32f429_439xx.s,93行,

这个很重要,如果写错会一直死循环!!!!!!!!!!!

写在文件stm32f4xx_it.c中的函数如下:*/

void KEY1_INT_EXTI_IRQHANDLER(void)

{

if( ( EXTI_GetITStatus(KEY1_INT_EXTI_LINE) ) != RESET )

{

/* 干活 */

LED1_TOGGLE;

}

EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);//清除中断标志位,勿忘勿忘

}


6.stm32f4xx_it.h 写着中断服务函数的名字及声明


#ifndef __STM32F4xx_IT_H

#define __STM32F4xx_IT_H


#ifdef __cplusplus

 extern "C" {

#endif 


/* Includes ------------------------------------------------------------------*/

#include "stm32f4xx.h"

[1] [2]
关键字:STM32F429  EXTI  外部中断  事件控制器 引用地址:STM32F429--EXTI外部中断/事件控制器

上一篇:STM32Keil下编程实现蜂鸣器长鸣
下一篇:STM32的RS485通信

推荐阅读最新更新时间:2024-11-12 18:19

STM32F429定时器4生成PWM,转化为DAC
STM32F429时钟树 原文地址 定时器PWM 从STM32F4的内部时钟树可知, (1)高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是APB2总线 (2)通用定时器timer2-timer5,通用定时器timer12-timer14以及基本定时器timer6,timer7的时钟来源是APB1总线 (3)当APB1和APB2分频数为1的时候,TIM1、TIM8-TIM11的时钟为APB2的时钟,TIM2-TIM7、TIM12-TIM14的时钟为APB1的时钟; (4)而如果APB1和APB2分频数不为1,那么TIM1、TIM8-TIM11的时钟为APB2的时钟
[单片机]
单片机外部中断详解及程序
单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态。比如一个电子时钟,它会按时、分、秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来。在不需要对它进行调校的时候它不需要外部干预,自主封闭地运行。如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态。但事情往往不会如此简单,在时钟刚刚上电、或时钟需要重新校准、甚至时钟被带到了不同的时区的时候,就需要重新调校时钟,这时就要求时钟就必须具有调校功能。因此单片机系统往往又不会是一个单纯的封闭系统,它有些时候恰恰需要外部的干预,这也就是外部中断产生的根本原由。 实际上在第二个示例演示中,就已经举过有按键输入的例子
[单片机]
STM32F407ZGT6学习之外部中断
工程代码:https://pan.baidu.com/s/1Qlfg1_br0tN6yy0fcDwCjg,密码:fhh2 (一)、概述 STM32外部中断通过检测外部的触发事件(上升沿触发、下降沿触发或边沿触发),触发中断事件实现低延迟的中断处理。 1、外部中断框架图 由下图可以看出,外部中断的边沿检测器连接输入信号,当“软件中断寄存器”和“中断屏蔽寄存器”打开的时候,当有事件触发时,事件会被送到NVIC中断控制器中触发中断事件。 2、外部中断特性 2.1、中断优先级 中断包含 16 个可编程优先级(使用了 4 位中断优先级),数字越小的优先级等级越高。通过NVIC_PriorityGroupConfig
[单片机]
STM32F407ZGT6学习之<font color='red'>外部中断</font>
STM32F429 >> 2. LED_Library_Function
main.c #include stm32f4xx.h #include stm32f4xx_gpio.h int main(void) { GPIO_InitTypeDef InitStruct; RCC- AHB1ENR |= (1 7); InitStruct.GPIO_Pin = GPIO_Pin_9; InitStruct.GPIO_Mode = GPIO_Mode_OUT; InitStruct.GPIO_OType = GPIO_OType_PP; InitStruct.GPIO_PuPd = GPIO_PuPd_UP; InitStruct.GPIO_Speed = GPIO_Speed
[单片机]
PIC 外部中断INT0
外部中断INT0就是在外部条件满足的情况下,简单的讲,就是对单片机内部的一个寄存器INT0IF会制1的操作 #include __CONFIG(1,XT) ; //晶振为外部4M __CONFIG(2,WDTDIS) ; //看门狗关闭 __CONFIG(4,LVPDIS) ; //禁止低电压编程 #define uchar unsigned char #define uint unsigned int char shuma ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; char num=0; void delayms(
[单片机]
STM32F429 ADC的结构、功能及应用
12.1 AD 简单描述 在介绍ADC之前我们先说一下ADC大致应用到哪些领域。比如无线通信、软件无线电、数据采集、光通讯、仪器设备等领域用到的非常多,举个非常简单的例子,比如你要获取电池电压的用电情况这时候就需要用到ADC这个东西。当然了ADC又可以分很多种,这里就不在说了,这里可以去网上查查。看看多了解了解。 其实在自然界存在的大都是模拟量,像温湿度、时间、速度、压力、流量等都是模拟量,但是吧,兄弟们,我们在使用这些东西的时候需要把这玩意用计算机转换成数字量,这样才能更有效的进行一些控制。 因此这就需要他们之间有一个桥梁,这个桥梁就是ADC和DAC这两个。本章只介绍ADC,DAC将会在下一章介绍。 典型的数字控制系统流图如
[单片机]
<font color='red'>STM32F429</font> ADC的结构、功能及应用
基于MSP430G2553的IO外部中断配置说明
这一篇文章将说明MSP430G2553的IO中断配置,整个P1的IO都可以配置IO中断,但中断处理函数只有一个,MSP430和大多数MCU一样提供上升沿、下降沿选择。 在Launchpad上有按键S2,接在P1.3口,当按下后P1.3将接入高电平,从而触发中断。 在实例代码中,配置了P1.3和P1.6的LED灯,当按下P1.3的按键产生中断,LED灯将切换点亮 1.按键的中断配置 要配置按键中断,需要先设置P1.3口为输入,并且设置上拉电阻以保障稳定性, P1DIR &= ~BIT3;//设置P1.3为输入 P1REN |= BIT3;//启用P1.3电阻 在启用电阻后,由P1OUT来配置下拉还是上拉 P1OUT |=
[单片机]
基于MSP430G2553的IO<font color='red'>外部中断</font>配置说明
STM32F429 Cubemx配置Timer实现5ms一个中断
目的:在STM32F429实现一个5ms一个interrupt的中断,并且重复触发 我们选用TIM2,可以看到TIM2是在APB1总线上,也可以看到APB1总线的 Clock是90M 整个Cube的配置为: 其中我要来说下几个参数: 预分频器值(Prescaler value):此部分就是把clock source分频到一个你想要的频率,计数器时钟频率CK_CNT 等于fCK_PSC/ (PSC + 1) 比如我们APB1是90M,我们此部分设置90-1,得到的最终频率是90M/((90-1)+1) = 1MHz 定时器周期(Period):我们设置预分频后得到1MHz,此部分想得到5ms,就是1M Hz
[单片机]
<font color='red'>STM32F429</font> Cubemx配置Timer实现5ms一个中断

推荐帖子

【颁奖礼】学电源,晒成绩第二期名单公布!
活动链接:https://bbs.eeworld.com.cn/thread-352180-1-1.html压缩包密码:shuieeworldbei恭喜以下获得者!hanskying666获得超薄键盘Keyboardbuer1209获得移动电源(茶色)(withlaiserpointer)dzc2001获得德州仪器在线技术支持社区-U盘(4GB卡片式)xkdlwj获得全球通插座sszlj001获得四合一激光演示笔,内含4GB老阮
EEWORLD社区 模拟与混合信号
出个二手s3c44b0板子 100包邮
1、三星S3C44B0X(SamsungARM7TDMI)微处理器2、2MB16bitflash(SST39VF160)3、8MB16bitPC100/PC133兼容SDRAM4、符合usb1.1规范USB设备控制器USBN96035、2路带有RS232电平转换UART接口6、IDE接口及多功能扩展口:可挂硬盘或CompactFlash卡,以及用户自己扩展的外围器件11、电源指示LED及系统复位键 12、IDE硬盘工作指示灯13、双排针将所有处理器引脚资源引出14
fbihjp ARM技术
DSP2407的设计程序
有谁会编写关于DSP2407实现系统实际的程序。程序以及原理,详细越好DSP2407的设计程序看看附件中的文档吧谁知道你的文章好坏啊就要那么多钱!阿胶的附件的价格是最合理的,我看了,值!
不就 微控制器 MCU
常用OP放大器引脚图及特性总结
常用OP放大器引脚图及特性总结常用OP放大器引脚图及特性总结.常用OP放大器引脚图及特性总结
qwqwqw2088 模拟与混合信号
QS30-1 Nixie Module | 辉光管显示模块 介绍【硬件篇】
辉光数码管|Nixietube,上世纪60-80年代的产物,电子技术发展历史的见证之一,相信有很多朋友对其了解甚少甚至从未亲眼所见。但就是这现如今已濒临绝迹的古老器件,却让见过她的人都无法忘记那特有的显示效果,甚至开始感叹40年前的创造竟赋有如此的艺术气息…单单是看到管身上那淡淡的白色印戳,刹那间便让人肃然起敬——这些辉光管的出生竟然比我还早许多年…或许这样几十年,她等待的只是一份热情,一次点燃她内心火红热情的电击……为了让这古老的并极富艺术气息的器件发辉余热,近些年来
yanzeyuan DIY/开源硬件专区
【2024 DigiKey 创意大赛】基于Raspberry Pi 5的植物生长监管系统—5、组装
现在万事俱备,只差组装,首先拿出花盆和种子。将旧植株搅碎充当肥料。撒入种子,翻拌均匀,放在一旁备用。借助3D打印制作硬件部分的外壳。底部左侧放置电源,右侧放置水电磁阀,上面放洞洞板和继电器。打印完成。将各个部件装入盒子。然后组装浇水模块,给水阀裁剪出长短合适的水管。用电烙铁给瓶盖戳个洞,插入水管。检查气密性,看是否漏水,如果漏水需要用热熔胶或者其他手段加固。所有部件如图。在花盆内安装好土壤湿度
Wenyou DigiKey得捷技术专区
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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