stm32F407的EXTI外部中断

发布者:WhisperingWind最新更新时间:2016-08-05 来源: eefocus关键字:stm32F407  EXTI  外部中断 手机看文章 扫描二维码
随时随地手机看文章
要点:外部中断必须配置好EXTI和NVIC,因为要用的IO口做中断源,故IO的复用功能必须使能,F4的与其他的有些不同,它的外部中断复用功能是由SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOx,GPIO_PinSourcex);  进行配置的,当然,也要打开SYSCFG的时钟。

最让初学者头疼的就是中断服务函数的入口问题,一般的中断函数都会在stm32f4xx_it.h中声明,但是stm32f4xx_it.h只声明了一部分,自己需要的函数却没有定义,自己找了好久也没有找到,其实所有的中断函数入口都定义在了启动文件startup_stm32f4xx.s中。

/************************************************************
Copyright (C), 2012-2022, yin.
FileName: main.c
Author: ycw Version :  1.0 Date: 2012.04.12
Description:           EXIT0 NVIC  
Version:               V1.0                 
Function List:         EXIT0 NVIC
History:                      

#include

static __IO uint32_t TimingDelay;
int8_t LED_Flag = 1;                                 //LED灯翻转标志位
void GPIO_Config(void);
void EXIT_Config(void);
void NVIC_Config(void);
void Delay(__IO uint32_t nTime);

main ()
{
/*在主函数main之前通过调用启动代码运行了SystemInit函数,而
这个函数位于system_stm32f4xx.c”。程序运行起始于启动文件的第
175行(LDR R0, =SystemInit)。sys时钟为HSE频率/PLL_M*PLL_N/PLL_P,
定义HSE为25M,则sys时钟频率为168M */

GPIO_Config();
EXIT_Config();
NVIC_Config();
//LED_Flag = 1;
//EXTI_GenerateSWInterrupt(EXTI_Line0);                                       //产生软件中断
/*SystemCoreClock / 1000时基为1ms*/
if (SysTick_Config(SystemCoreClock / 1000))
 { 
 /* Capture error */ 
 while (1);
 }
while (1)
 {
 if (LED_Flag!=1)
  {
  GPIO_SetBits(GPIOG, GPIO_Pin_6);       //setbits使能IO,当前下指输出 (此时为灭)
  }       
 else
  {
  GPIO_ResetBits(GPIOG, GPIO_Pin_6);}       //Resetbits屏蔽IO,当前下指不输出(此时为亮)
  }
}

/*************************************************
Function:    void GPIO_Config(void)       
Description: GPIO配置函数              
Input: 无                              
Output:无                              
Return:无                              
*************************************************/ 
void GPIO_Config(void)
{
/*定义了一个GPIO_InitStructure的结构体,方便一下使用 */
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能GPIOG时钟(时钟结构参见“stm32图解.pdf”)*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOA, ENABLE);
/*仅设置结构体中的部分成员:这种情况下,用户应当首先调用函数PPP_SturcInit(..)
来初始化变量PPP_InitStructure,然后再修改其中需要修改的成员。这样可以保证其他
成员的值(多为缺省值)被正确填入。*/
GPIO_StructInit(&GPIO_InitStructure);
/* 初始化GPIOG的Pin_6为推挽输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;     //指定第六引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;    //模式为输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //频率为快速
GPIO_Init(GPIOG, &GPIO_InitStructure);      //调用IO初始化函数

/*配置GPIOA_Pin_0,作为外部中断*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;     //指定第六引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;    //模式为输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //频率为快速
//GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;    //网上说要上拉,稳定,我的没有上拉也可以
GPIO_Init(GPIOA, &GPIO_InitStructure);      //调用IO初始化函数
}

/*************************************************
Function:    void EXIT_Config(void);  
Description: 外部中断配置函数       
Input:       无
Output:      无                            
*************************************************/
void EXIT_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
/*使能外部中断复用时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
/*映射GPIOA的Pin0至EXTILine0*/
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,GPIO_PinSource0);  
EXTI_ClearITPendingBit(EXTI_Line0);        //清外部线路0中断
EXTI_InitStructure.EXTI_Line = EXTI_Line0;      //线路0
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;    //触发模式为中断
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;   //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;      //开外部中断
EXTI_Init(&EXTI_InitStructure);
}

/*************************************************
Function:    void NVIC_Config(void)  
Description: 嵌套中断断配置函数       
Input:       无
Output:      无                            
*************************************************/
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);        //嵌套分组为组0
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;       //中断通道为通道0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢断优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    //响应优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;     //开中断
NVIC_Init(&NVIC_InitStructure);
}

/*************************************************
Function:    void Delay(__IO uint32_t nTime)  
Description: 精确延时函数,时基根据前面设定,当前
             为1ms       
Input: 需要延时的时间,单位ms                      
Output:无                            
*************************************************/
void Delay(__IO uint32_t nTime)

  TimingDelay = nTime;

  while (TimingDelay != 0);
}

/*************************************************
Function:    void TimingDelay_Decrement(void)  
Description: SysTick中断服务函数,加在_it.h中的
             void SysTick_Handler(void)函数内        
Input: 无                      
Output:无                            
*************************************************/
void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  { 
    TimingDelay--;
  }
}

关键字:stm32F407  EXTI  外部中断 引用地址:stm32F407的EXTI外部中断

上一篇:Cortex-M3的中断优先级的分组方式
下一篇:STM32学习笔记--EXTI

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

stm32 外部中断 按键的误触发
最近在调试按键作为外部中断exti进行触发动作,发现每次按键按下和按键抬起都会多次进入中断函数,造成程序不稳定,经过反复调试和查阅资料,最后终于已经把这个问题解决,现在总结一下: 1、EXTI重复配置两次导致误触发中断的问题 如果重复两次配置EXTI的话,由于第一次已经打开中断,当进行第二次配置中断的时候,会把中断引脚首先配置成默认引脚,然后在配置成目的引脚,这样由于默认引脚是低电平,所以在切换的过程中就会进入一次中断!!具体请参见:http://bbs.elecfans.com/jishu_942011_1_1.html 2、STM32F401 外部中断误触发问题 现象:调试STM32F411低功耗的时候,使用的
[单片机]
关于51单片机外部中断响应
外部中断方式最好设为下降沿方式,特别是中断引脚接按键的情况。 外部下降沿中断:SETB IT0。每个机器周期都由硬件对引脚自动采样,若连续在2个周期采样到电平从高到低,则认定有中断请求,IE0=1。IE0会一直保持到该中断请求被CPU响应,响应前都不会自动清零,只有在响应后硬件才自动将IE0清零IE0=0。 外部低电平中断:CLR IT0。当中断引脚为低电平时,并保持一个机器周期,硬件自动置IE0=1。如果在下一个周期采样到中断引脚为高电平时,硬件自动将IE0清0。中断标志位自动清0条件:下降沿中断只有CPU响应中断同时才会清0,否则一直保持。低电平中断:任何时候当外部中断引脚为低电平时,IE0=1;为高电平时,IE0=0,所以
[单片机]
STM32 关于外部中断线、中断源和中断服务函数的问题
中断线问题: 上图可以看出,PA0、PB0...PG0共用的EXTI0中断线,PA1、PB2...PG1共用的EXTI1中断线,也就是 编程里面的(如下图库文件),对应16个中断线,后面三个是专用的中断线,不做讨论。 有人要问,假设:我设置的引脚是PB9和PE9都开启外部中断怎么办?小编告诉你,这还真办不了,我实测过。配置函数的时候后覆盖之前的函数的(如下图所示) 如果这样配置的话,会出现出货光电1的初始化覆盖掉编码盘的初始化,说白了就是编码盘的设置被覆盖掉了,结果是外部中断 出货光电1管脚会触发而编码盘就不起作用了,这也是STM32其中一个问题所在吧! 反过来,结果是外部中断 编码盘 管脚会触发
[单片机]
STM32 关于<font color='red'>外部中断</font>线、中断源和中断服务函数的问题
迁移微雪2.9寸电子墨水屏代码到Stm32F407
主要完成了微雪2.9寸电子墨水屏的代码迁移。官方提供的代码是基于STM32F103的,我对他进行了 代码的迁移,使之能运行在Stm32F407上。 墨水屏是从立创商城上买的,正常价格大概100元左右。商城活动大约40块钱入手 这是刚来的时候的样子,排线让我弄丢了,直接拆了插槽 把杜邦线焊上去了、、、、 这是运行demo时候的样子 墨水屏看起来真的很好看。进入正题,代码的迁移: 毫无疑问第一步肯定是修改 IO了,我在 readme 文件里面看到了引脚的定义。 这款屏一共用到了六个IO 其中四个是通用IO 两个是作为 SPI协议的MOSI和CLK线的虽然这款屏是标准的四线SPI,但是屏幕貌似是不需要给单片机回传
[单片机]
迁移微雪2.9寸电子墨水屏代码到<font color='red'>Stm32F407</font>上
STM32F407玩控制—系统组成
原本想在嵌入式操作系统的基础上玩控制,但有几个原因放弃了这一想法,1兴趣转移,2觉得在“裸装”单片机是玩控制没啥不好,3 STM32F407也应该属于当前主流单片机了,就控制上应用来说足够足够了,不像51单片机增加一个变量都要横算竖算,因此,玩到STM32F407也可以了,没必要再进一步深入了,再说,也想玩别的东西了,因此,这个系列的博文是个“早产儿”,4终极原因是最近一直感到眼睛干涩,可能是手机、平板电脑看的太多,而我为了方便,通常都是看电子书,这样一来只能尽量少看手机和平板电脑了,什么兴趣也得归零了,好,就此打住,转入正题,玩控制当然得有控制对象(被控对象),但你不可能有一家化工厂或火电厂给你去作试验,甚至连一个马达也不可能有
[单片机]
用<font color='red'>STM32F407</font>玩控制—系统组成
MSP430G2553(一)IO外部中断说明
这一篇文章将说明MSP430G2553的IO中断配置,整个P1的IO都可以配置IO中断,但中断处理函数只有一个,MSP430和大多数MCU一样提供上升沿、下降沿选择。 在Launchpad上有按键S2,接在P1.3口,当按下后P1.3将接入高电平,从而触发中断。 所有寄存器的具体名称和地址,可以查看M430G2553 datasheet 第 21页中对于P1的寄存器定义 在实例代码中,配置了P1.3和P1.6的LED灯,当按下P1.3的按键产生中断,LED灯将切换点亮 1.按键的中断配置 要配置按键中断,需要先设置P1.3口为输入,并且设置上拉电阻以保障稳定性, P1DIR &= ~BIT3;//设置P1.
[单片机]
Stm32f407 led代码简单分析
硬件平台: stm32f407ve 软件平台: win10 (OS Name: Microsoft Windows 10 Enterprise OS Version: 10.0.18363 N/A Build 18363) Keil5 5.26.2 HAL库版本: 2.14.0(目前下载的最新的) 实验介绍: 本次是使用hal库进行led闪烁实验。(根据之前建立的模板操作,这里不再建立工程模板) //包含基本的头文件 #include stm32f4xx.h //led端口的初始化,需要设置对应得IO引脚为
[单片机]
<font color='red'>Stm32f407</font> led代码简单分析
基于51汇编语言的外部中断
  主程序显示八位流水灯;   外部中断0:左右四位闪烁三次;   外部中断1:各位间隔闪烁三次。   仿真电路如下:      ;程序如下:   ORG 0000H   LJMP START   ORG 0003H   LJMP X0_INT   ORG 0013H   LJMP X1_INT   ORG 0030H   START:   SETB IT0   SETB IT1   SETB EX0   SETB EX1   SETB EA   MOV SP, #50H   ;----------------------   MOV A, #0FEH   LOOP:   MOV P1, A   CALL DELAY   RL
[单片机]
基于51汇编语言的<font color='red'>外部中断</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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