STM32入门学习之EXTI外部中断(STM32F030F4P6基于CooCox IDE)

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

下面的代码,是把PA0当做一个按键口,芯片内部上拉,按键闭合时,IO口被拉低,触发中断。


#include "stm32_lib/inc/stm32f0xx_rcc.h"

#include "stm32_lib/inc/stm32f0xx_exti.h"

#include "stm32_lib/inc/stm32f0xx_gpio.h"

#include "stm32_lib/inc/stm32f0xx_syscfg.h"

#include "stm32_lib/inc/stm32f0xx_misc.h"

 

int main(void)

{

//时钟使能

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

 

//外部按键GPIO初始华,PA0

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;

GPIO_Init(GPIOA,&GPIO_InitStructure);

 

//将EXTI0指向PA0

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);

//EXTI0中断线配置

EXTI_InitTypeDef EXTI_InitStructure;

EXTI_InitStructure.EXTI_Line=EXTI_Line0;

EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd=ENABLE;

EXTI_Init(&EXTI_InitStructure);

 

//EXTI0中断向量配置

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel=EXTI0_1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPriority=0x01;

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructure);

 

while(1){

 

}

}

 

void EXTI0_1_IRQHandler(void){

if(EXTI_GetITStatus(EXTI_Line0)!=RESET)

{

//中断处理

}

//退出中断时注意清除标志位

EXTI_ClearFlag(EXTI_Line0);

}

先补充概念1,同GPIO、USART、NVIC等一样,我们再使用EXTI是首先要定义一个EXTI_InitTypeDef

我们可通过EXTI的头文件查看,库是怎么定义EXTI_InitTypeDef



typedef struct

{

  uint32_t EXTI_Line; //线               

  EXTIMode_TypeDef EXTI_Mode;       //模式

  EXTITrigger_TypeDef EXTI_Trigger; //触发类型

  FunctionalState EXTI_LineCmd;     //使能

}EXTI_InitTypeDef;


关于EXTI_Line,继续看头文件

#define EXTI_Line0       ((uint32_t)0x00000001)  /*!< External interrupt line 0  */

#define EXTI_Line1       ((uint32_t)0x00000002)  /*!< External interrupt line 1  */

#define EXTI_Line2       ((uint32_t)0x00000004)  /*!< External interrupt line 2  */

#define EXTI_Line3       ((uint32_t)0x00000008)  /*!< External interrupt line 3  */

#define EXTI_Line4       ((uint32_t)0x00000010)  /*!< External interrupt line 4  */

#define EXTI_Line5       ((uint32_t)0x00000020)  /*!< External interrupt line 5  */

#define EXTI_Line6       ((uint32_t)0x00000040)  /*!< External interrupt line 6  */

#define EXTI_Line7       ((uint32_t)0x00000080)  /*!< External interrupt line 7  */

#define EXTI_Line8       ((uint32_t)0x00000100)  /*!< External interrupt line 8  */

#define EXTI_Line9       ((uint32_t)0x00000200)  /*!< External interrupt line 9  */

#define EXTI_Line10      ((uint32_t)0x00000400)  /*!< External interrupt line 10 */

#define EXTI_Line11      ((uint32_t)0x00000800)  /*!< External interrupt line 11 */

#define EXTI_Line12      ((uint32_t)0x00001000)  /*!< External interrupt line 12 */

#define EXTI_Line13      ((uint32_t)0x00002000)  /*!< External interrupt line 13 */

#define EXTI_Line14      ((uint32_t)0x00004000)  /*!< External interrupt line 14 */

#define EXTI_Line15      ((uint32_t)0x00008000)  /*!< External interrupt line 15 */

#define EXTI_Line16      ((uint32_t)0x00010000)  /*!< External interrupt line 16 

                                                      Connected to the PVD Output */

#define EXTI_Line17      ((uint32_t)0x00020000)  /*!< Internal interrupt line 17 

                                                      Connected to the RTC Alarm 

                                                      event */

#define EXTI_Line19      ((uint32_t)0x00080000)  /*!< Internal interrupt line 19

                                                      Connected to the RTC Tamper

                                                      and Time Stamp events */

#define EXTI_Line21      ((uint32_t)0x00200000)  /*!< Internal interrupt line 21

                                                      Connected to the Comparator 1

                                                      event */

#define EXTI_Line22      ((uint32_t)0x00400000)  /*!< Internal interrupt line 22

                                                      Connected to the Comparator 2

                                                      event */

#define EXTI_Line23      ((uint32_t)0x00800000)  /*!< Internal interrupt line 23

                                                      Connected to the I2C1 wakeup

                                                      event */

#define EXTI_Line25      ((uint32_t)0x02000000)  /*!< Internal interrupt line 25

                                                      Connected to the USART1 wakeup

                                                      event */

#define EXTI_Line27      ((uint32_t)0x08000000)  /*!< Internal interrupt line 27

                                                      Connected to the CEC wakeup

                                                      event */


这里定义了N多EXTI_Line,其中Line0-Line15表示GPIOX_Pin_N的中断。如何区分GPIOX呢?这也就是概念2要补充的了。这里通过SYSCFG_EXTILineConfig函数来配置。

//将EXTI0指向PA0

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);


继续看头文件,了解EXTI的MODE





typedef enum

{

  EXTI_Mode_Interrupt = 0x00,

  EXTI_Mode_Event = 0x04

}EXTIMode_TypeDef;


一个是Interrupt中断,一个是Event事件。

中断,系统最多只能给其配置个中断向量入口,然后执行相应的软件程序。

而事件,系统中存在硬件电路,可配置其连接至需要触发硬件电路中,如触发AD转换,或者引起DMA操作等。


关于EXTITrigger_TypeDef,经常使用示波器的朋友们想必已经很清楚了,上升沿触发、下降沿触发、上升下降兼触发。

typedef enum
{
  EXTI_Trigger_Rising = 0x08,
  EXTI_Trigger_Falling = 0x0C,
  EXTI_Trigger_Rising_Falling = 0x10
}EXTITrigger_TypeDef;


NVIC中的IRQChannel为什么是EXTI0_1_IRQN呢?

这个可以再stm32f0xx.h头文件找到
EXTI0_1_IRQn对应线0和1的中断

EXTI2_3_IRQn对应线2和3的中断

EXTI4_15_IRQn对应线4-15的中断


#if defined (STM32F0XX_MD) || defined (STM32F030X8)
/******  STM32F0XX_MD and STM32F030X8 specific Interrupt Numbers *************************************/
  WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                               */
  PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detect Interrupt                  */
  RTC_IRQn                    = 2,      /*!< RTC through EXTI Line Interrupt                         */
  FLASH_IRQn                  = 3,      /*!< FLASH Interrupt                                         */
  RCC_IRQn                    = 4,      /*!< RCC Interrupt                                           */
  EXTI0_1_IRQn                = 5,      /*!< EXTI Line 0 and 1 Interrupts                            */
  EXTI2_3_IRQn                = 6,      /*!< EXTI Line 2 and 3 Interrupts                            */
  EXTI4_15_IRQn               = 7,      /*!< EXTI Line 4 to 15 Interrupts  

好了,问题来了,居然EXTI0_1_IRQn包含两个中断,那怎么区分呢?
if(EXTI_GetITStatus(EXTI_Line0)!=RESET)

这下应该知道中断函数里为什么加这句的原因了吧。


关键字:STM32  EXTI外部中断  STM32F030F4P6  CooCox  IDE 引用地址:STM32入门学习之EXTI外部中断(STM32F030F4P6基于CooCox IDE)

上一篇:STM32入门学习之GPIO(STM32F030F4P6基于CooCox IDE)(一)
下一篇:stm32f030-GPIO配置

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

STM32单片机的八种IO口模式解析
STM32八种IO口模式区别 (1)GPIO_Mode_AIN模拟输入 (2)GPIO_Mode_IN_FLOATING浮空输入 (3)GPIO_Mode_IPD下拉输入 (4)GPIO_Mode_IPU上拉输入 (5)GPIO_Mode_Out_OD开漏输出 (6)GPIO_Mode_Out_PP推挽输出 (7)GPIO_Mode_AF_OD复用开漏输出 (8)GPIO_Mode_AF_PP复用推挽输出 以下是详细讲解 (1)GPIO_Mode_AIN模拟输入 即关闭施密特触发器,将电压信号传送到片上外设模块(不接上、下拉电阻) (2)GPIO_Mode_IN_FLOATING浮空输入 浮空输入状态下,IO的电平状态是不确定
[单片机]
AVR的外部中断INT示例程
使用AVR的外部中断INT1检测PD3Key,如果有按键按下,则唤醒休眠的MCU,并使它的PB口的LED做加1指示。 #include iom16v.h #include D:ICC_HCmmICC.H #define DISP_DDR DDRB #define DISP_PORT PORTB #define IN_PD3 cbi(DDRD,3) //PD3 #define SET_PD3 sbi(PORTD,3) #define GET_PD3 gbi(PIND,3) /*---------------------------------------------------
[单片机]
STM32中断挂起和RTOS任务挂起的区别
中断挂起 可以理解为:将中断设置为就绪状态,一旦符合条件,立即执行中断并进入中断函数;比如A和B的抢占优先级相同,A的响应优先级高于B,那么当产生A和B中断的事件发生时,先执行A,并同时将B挂起,一旦A执行完毕,立即执行B。 RTOS的任务挂起 以FreeROTS为例,因为某些原因不能立即执行的任务,可以将其挂起,这个挂起使得任务暂时无法参与任务调度。只有将任务唤醒之后才能继续参与;
[单片机]
STM32学习笔记(七)---SysTick
一、SysTick简介 SysTick属于CM4内核中的一个外设,内嵌在NVIC中,有关寄存器的定义和部分库函数都在core_cm4.h头文件中实现。 SysTick(系统滴答定时器)是一个24bit的向下递减的计数器,计数器每计数一次的时间为1/SYSCLK。 当重装载初值寄存器的值减到0的时候,系统定时器就产生一次中断,一次循环往复。 系统定时器一般用于操作系统,用于产生时基,维持操作系统心跳。 二、SysTick功能框图 三、SysTick寄存器 SysTick控制和状态寄存器 SysTick重装载值寄存器 SysTick当前值寄存器 四、SYSTICK使用 1.中断方式使用 可以直接通过
[单片机]
<font color='red'>STM32</font>学习笔记(七)---SysTick
STM32学习——EXTI外部中断
EXTI简介 EXTI可以实现对外部输入信号的上升沿检测和下降沿的检测。EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。 可以看到EXTI一共有20条信号线,即可同时检测来自20路的中断请求。 代码实现 (1)首先配置GPIO初始化结构体 GPIO要配置为浮空输入 void Key_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE); GPIO_I
[单片机]
<font color='red'>STM32</font>学习——<font color='red'>EXTI</font><font color='red'>外部中断</font>
STM32-自学笔记(7.用GPIO点亮LED,程序用到的库函数介绍)
1.RCC_DeInit 函数原型:void RCC_DeInit (void) 功能:将外设RCC寄存器重设为默认值。 参数:无 例子:RCC_DeInit (); //将外设RCC寄存器重设为默认值 2.RCC_HSEConfig 函数原型:void RCC_HSEConfig (u32 RCC_HSE) 功能:设置外部高速晶振(HSE)。 参数:RCC_HSE_HSE的新状态 参数:RCC_HSE 描述: RCC_HSE_OFF:HSE晶振失能 RCC_HSE_ON:HSE晶振使能 RCC_HSE_Bypass:HSE晶振被外部时钟旁路 例子:RCC_HSEConfig(RCC_HSE_ON); //使
[单片机]
STM32 spi与FPGA的通信
最近在研究SPI总线,至于协议和硬件描述就不多说了 四线包括时钟、片选、接收、发送 初始化SP SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //全双工 SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主模式 SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; //16bit宽度 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure
[单片机]
STM32的硬件I2C设计有BUG
坊间一直流传着一个传说~STM32的硬件I2C设计有BUG,最好不要用,用软件I2C比较靠谱。长久以来,为了不必要的麻烦,我也一直没有用过硬件I2C,主要是软件I2C也比较方便,基本上任意端口都可以用。 最近画了块板子,正好用到了I2C,就顺便来测试一下硬件I2C是不是真的像有些人说的不好用。 测试硬件:STM32F407VET6+AT24C64测试软件:STM32CubeMX v6.1.1HAL库:STM32CubeF4 Firmware Package V1.25.2 STM32CubeMX配置 使用STM32CubeMX配置很方便,时钟等基础配置不再详细介绍,直接看I2C配置如下: 这里的速度模式选择为标准模式,
[单片机]
<font color='red'>STM32</font>的硬件I2C设计有BUG
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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