STM32学习笔记之EXTI(外部中断)

发布者:MindfulBeing最新更新时间:2018-09-11 来源: eefocus关键字:STM32  EXTI  外部中断。 手机看文章 扫描二维码
随时随地手机看文章

一:EXTI(外部中断)说明

 

=========================================分割线=========================================

 

       外部中断/事件控制器由19个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配置

输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以被独

立的屏蔽。挂起寄存器保持着状态线的中断要求。

=========================================分割线=========================================

19个中断如下:

未命名

17——EXTI线16连接到PVD输出

18——EXTI线17连接到RTC闹钟事件

19——EXTI线18连接到USB唤醒事件

 

注:有上图可知EXTI0连接的引脚为PA0、PB0、PC0、PD0、PE0、PF0、PG0,其他外部中断EXTI1——

EXTI15类似。所以在使用时尽量将需要的外部中断配置在不同的EXTIx上。

      例如需要3个外部中断,我们可以配置到PA0、PB4、PG3上,此时每个中断都有自己的中断处理程

     序段。如果配置到PA0、PB0、PC1,则PA0和PB0将公用一个中断程序段。当然如果特殊需要,也

     可以这样设计。

=========================================分割线=========================================


配置使用方法:


初始化相应的GPIO管脚

配置外部中断源并进行中断源和GPIO的连接

编写相应中断源的中断处理程序

=========================================分割线=========================================


程序代码


初始化相应的GPIO管脚

GPIO_InitTypeDef GPIO_InitStructure;

 

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);           

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

 

 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   

GPIO_Init(GPIOE, &GPIO_InitStructure);

 

 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   

GPIO_Init(GPIOB, &GPIO_InitStructure);

 

注:GPIO的复用功能必须打开,如红字部分

 


配置外部中断源并进行中断源和GPIO的连接

 


GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource1);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);

 

 

EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line1|EXTI_Line8|EXTI_Line9;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

 


编写相应中断源的中断处理程序

 


void EXTI0_IRQHandler(void)

{

  if(Sys_Status > MIN_STATUS)

  {

    Sys_Status --;

  }

  EXTI_ClearITPendingBit(EXTI_Line0);

}

 

 

void EXTI1_IRQHandler(void)

{

  PEout(2) = ~PEout(2);

  EXTI_ClearITPendingBit(EXTI_Line1);

}

 

 

#define Exti_From_Pin8 0x00000100

#define Exti_From_Pin9 0x00000200

 

void EXTI9_5_IRQHandler(void)

{

 

  u32 Temp = 0x00; 

 

  PEout(2) = ~PEout(2);

  Temp = EXTI->PR;       //取读是那个引脚的中断

  switch(Temp)

  {

    case Exti_From_Pin8:

      EXTI_ClearITPendingBit(EXTI_Line8);

      break;

    case Exti_From_Pin9:

      if(Sys_Status < MAX_STATUS)

      {

        Sys_Status ++;

      }

      EXTI_ClearITPendingBit(EXTI_Line9);

      break;

    default:break;

  }

}

=========================================分割线=========================================


中断处理程序说明,由于外部中断EXTI5——EXTI9公用了一个中断(EXTI10——EXTI15类似)所以要


区分不同的中断源需要进行相应的判断。如上EXTI9_5_IRQHandler中,通过取读EXTI->PR寄存器来判


断中断的来源。



硬件情况:采用PA11管脚


需要明确的是,PxN管脚共用外部中断线EXTIN和外部中断向量EXTIN_IRQn和中断服务程序入口EXTIN_IRQHandler,但是需要注意的是[9...5]共用EXTI9_5_IRQn和EXTI9_5_IRQHandler、[15...10]共用EXTI15_10_IRQn和EXTI15_10_IRQHandler


 


二:Stm32 外部中断EXTI使用


基本过程:


1、设置时钟



RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);  

注意需要打开AFIO时钟


2、配置GPIO


 


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;  

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

GPIO_Init(GPIOA, &GPIO_InitStructure);  

采用浮空输入方式


3、将GPIO管脚与外部中断线连接




GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource11);  

相当重要


4、配置EXTI



EXTI_InitStructure.EXTI_Line = EXTI_Line11;  

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  

EXTI_InitStructure.EXTI_LineCmd = ENABLE;  

EXTI_Init(&EXTI_InitStructure);  

包括触发方式等等


6、配置NVIC




NVIC_InitTypeDef NVIC_InitStructure;      

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  

   

NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //PPP外部中断线  

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  

NVIC_Init(&NVIC_InitStructure);  

7、写中断服务程序




void EXTI15_10_IRQHandler(void)  

{  

    if (EXTI_GetITStatus(EXTI_Line11) != RESET)  

    {  

        EXTI_ClearITPendingBit(EXTI_Line11);//清除标志  

        ...  

    }  

}

 


关键字:STM32  EXTI  外部中断。 引用地址:STM32学习笔记之EXTI(外部中断)

上一篇:STM32中EXTI和NVIC的关系
下一篇:STM32中I2C总线上数据的读、写。

推荐阅读最新更新时间:2024-03-16 16:13

stm32中断服务函数的机制
简述:当中断触发时,会保存当前运行状态,然后跳转到中断向量处执行(可嵌套),中断完成后再返回保存的运行状态执行。 中断服务函数并非用户(写程序的人)调用,而是预先写入中断向量(相应中断执行首地址),中断发生后自动执行,所以源码中只需定义实现自己的中断服务函数而不需要考虑在mian中调用的时。 那么问题的关键便是一个普通的c函数是如何实现写入中断向量。mcu的地址最低区是用作中断向量表的,即中断触发后,将执行相应中断向量(字)处的指令(一般为跳转指令)然后跳转到相应的中断服务函数执行,那么中断向量是如何跳转到中断服务函数的地址的呢。 首先我们要看中断服务函数的声明,库文件中唯一的中断服务函数标示符只存在startup.s
[单片机]
STM32库函数USART_SendData的缺陷和解决方法
2.1 问题及现象 使用USART_SendData()函数非连续发送单个字符是没有问题的;当连续发送字符时(两个字符间没有延时),就会发现发送缓冲区有溢出现象。若发送的数据量很小时,此时串口发送的只是最后一个字符,当发送数据量大时,就会导致发送的数据莫名其妙的丢失。 如: for(TxCounter = 0;TxCounter RxCounter; TxCounter++) USART_SendData(USART1, RxBuffer ); 2. 原因 此API函数不完善,函数体内部没有一个判断一个字符是否发送完毕的语句,而是把数据直接放入发送缓冲区,当连续发送数据时,由于发送移位寄存器的速度限制(与通信波特率有关),导
[单片机]
STM32接口中FSMC/FMC难点问题理解
一,FSMC简 FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和 16 位 PC 存储器卡连接, STM32 的 FSMC 接口支持包括 SRAM、NAND FLASH、NOR FLASH 和 PSRAM 等存储器。 二,FSMC存储块 STM32F767的FMC将外部存储器划分为6个固定大小的256M的存储区域,如下图 如图: FSMC分为4块,每块256M字节又被划分为4*64,即四个片选 NOR / PSRAM使用块1,共256M NAND闪存使用块2,3,共512M PC卡使用块4,共256M 三,存储块1(Bank1)寄存器 STM32 的 FSMC 存储块 1(Bank1)被
[单片机]
<font color='red'>STM32</font>接口中FSMC/FMC难点问题理解
STM32的3种低功耗模式
睡眠模式:内核停止,外设如NVIC,系统时钟Systick仍运行。 停止模式:所有时钟都已停止;1.8V内核电源工作;PLL,HIS和HSERC振荡器功能禁止;寄存器和SRAM内容保留。 待机模式:1.8V内核电源关闭;只有备份寄存器和待机电路维持供电;寄存器和SRAM内容全部丢失;实现最低功耗。 STM32的3种低功耗唤醒方式: STM32待机模式: 在待机模式下,所有的I/O引脚均处于高阻态,除了复位引脚、被使能的唤醒引脚和TAMPER引脚。待机模式下只有2uA的电流,停机模式下20uA的电流。 库函数进入待机模式: 1. 使能电源时钟。 2. 设置WK_UP引脚作为唤醒源。 3. 设置SLEEPDEEP位
[单片机]
第9章 初识STM32固件库—零死角玩转STM32-F429系列
本章参考资料:《STM32F4xx参考手册》、《STM32F4xx规格书》、《Cortex-M3权威指南》, STM32标准库帮助文档:《stm32f4xx_dsp_stdperiph_lib_um.chm》。 在上一章中,我们构建了几个控制GPIO外设的函数,算是实现了函数库的雏形,但GPIO还有很多功能函数我们没有实现,而且STM32芯片不仅仅只有GPIO这一个外设。如果我们想要亲自完成这个函数库,工作量是非常巨大的。ST公司提供的标准软件库,包含了STM32芯片所有寄存器的控制操作,我们直接学习如何使用ST标准库,会极大地方便控制STM32芯片。 9.1 CMSIS标准及库层次关系 因为基于Cortex系列芯片采用的
[单片机]
第9章 初识<font color='red'>STM32</font>固件库—零死角玩转STM32-F429系列
STM32 ADC 多通道16路电压采集
下面介绍一种利用STM32单片机制作的16路多通道ADC采集电路图和源程序。采用USB接口与电脑连接,实则USB转串口方式,所以上位机可以用串口作为接口。电路图中利用LM324作为电压跟随器,起到保护单片机引脚的作用。直接在电脑USB取点,省去外接电源麻烦,实测耗电电流不到20ma. 1.主控电路图: 2. USB转串口电路图 3.LM324电压跟随器电路图 4.滤波电路图 5.16路接口电路图 6.电源电路图 7.16路ADC初始化程序: void Adc_Init(void) { //先初始化IO口 RCC- APB2ENR|=0X7 2; //使能PORTA\PORAB\PORTC口
[单片机]
<font color='red'>STM32</font> ADC 多通道16路电压采集
STM32学习记录——printf函数重定位
功能: 重定位printf函数,使printf作为串口打印输出函数。代替usart_send_string()函数 步骤: usart.c中包含USART初始化函数 1、USART初始化(使能时钟、使能GPIO、GPIO和USART初始化) 2、打开USART 3、在usart.c中加入如下代码 #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker- Libraries- Small printf set to 'Yes') calls __io_putchar() */ #define PUT
[单片机]
基于STM32的PWM音乐播放器应用设计
    在科研项目开发中,有时会遇到需要播放电话铃声、音乐等情况。简单的做法是购买专用音乐芯片,但该方法的缺点是播放的内容不可变,不能很好地满足项目需求。一般地,可采用89C51等单片机实现音乐播放,其播放内容及歌曲数量都可以随时修改,使用上相对方便。随着STM32系列微处理器的出现,其基于ARM Cortex—M内核的32位闪存微控制器,高达72 MHz的主频,高集成度、实时性、数字信号处理、低功耗、低电压操作等众多特点,使得其应用越来越广泛。本文基于STM32处理器,根据乐曲简谱制作供程序识别的乐谱,并利用内部定时器产生PWM输出信号,驱动蜂鸣器完成自定义乐谱的播放。经测试,播放效果良好。 1 乐谱简析 1.1 音阶    
[单片机]
基于<font color='red'>STM32</font>的PWM音乐播放器应用设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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