历史上的今天
返回首页

历史上的今天

今天是:2024年12月26日(星期四)

正在发生

2018年12月26日 | STM32F429之外部中断

2018-12-26 来源:eefocus

7个中断通道在NVRC中使用


7个中断服务函数EXPORT  EXTI9_5_IRQHandler      


22个中断线


中断源为任意想要连接的GPIO,用那个连哪个SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);


配置NVRC—配置GPIO(打开SYSCFG时钟)—连接中断源到GPIO—配置中断EXTI—编写中断服务函数


具体如下


STM32F4的每个IO都可以作为外部中断的中断输入口,这点也是STM32F4的强大之处。STM32F407的中断控制器支持22个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F407的22个外部中断为:


EXTI线0~15:对应外部IO口的输入中断。


EXTI线16:连接到PVD输出。


EXTI线17:连接到RTC闹钟事件。


EXTI线18:连接到USB OTG FS唤醒事件。


EXTI线19:连接到以太网唤醒事件。


EXTI线20:连接到USB OTG HS(在FS中配置)唤醒事件。


EXTI线21:连接到RTC入侵和时间戳事件。


EXTI线22:连接到RTC唤醒事件。




GPIO跟中断线的映射关系图:




库函数配置外部中断的步骤:


1)      使能IO口时钟,初始化IO口为输入


    GPIO_InitTypeDef GPIO_InitStructure; 



RCC_AHB1PeriphClockCmd(KEY1_INT_GPIO_CLK|KEY2_INT_GPIO_CLK ,ENABLE);


  GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;

 

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;                


  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;


  GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStructure); 



2)      开启SYSCFG时钟,设置IO口与中断线的映射关系。


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


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);


配置GPIO与中断线的映射关系(连接中断源到GPIO引脚)


SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);


将中断线0与GPIOA映射起来,那么很显然是GPIOA.0与EXTI0中断线连接了。


3)      初始化线上中断,设置触发条件等。


EXTI_InitTypeDef  EXTI_InitStructure;


EXTI_InitStructure.EXTI_Line=EXTI_Line4;  (选择中断源)(EXTI_Line0~EXTI_Line15)


EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  (中断模式)(分为中断和事件event)


EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Falling;(下降沿触发)(上升沿触发Rising,任意电平触发Rising_Fallingr)


EXTI_InitStructure.EXTI_LineCmd = ENABLE;


 EXTI_Init(&EXTI_InitStructure);             //初始化外设EXTI寄存器


上面的例子设置中断线4上的中断为下降沿触发。

4)      配置中断分组(NVIC),并使能中断。


设置中断线2的中断优先级。 在野火例程中,将NVRC设置成一个函数static void NVIC_Configuration(void) 在void EXTI_Key_Config(void)里调用。


NVIC_InitTypeDef  NVIC_InitStructure;


NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;  //使能按键外部中断通道中断线0-4每个中断线对应一个通道, 中断线5-9共用EXTI9_5_IRQ,中断线10-15共用EXTI15_10_IRQ


NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;  //抢占优先级2,


NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;             //响应优先级2


NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                //使能外部中断通道


NVIC_Init(&NVIC_InitStructure);                          //中断优先级分组初始化


5)      编写中断服务函数。


中断服务函数的名字是在MDK中事先有定义的。这里需要说明一下,STM32F4的IO口外部中断函数只有7个,分别为:

EXPORT  EXTI0_IRQHandler         


EXPORT  EXTI1_IRQHandler      


EXPORT  EXTI2_IRQHandler        


EXPORT  EXTI3_IRQHandler       


EXPORT  EXTI4_IRQHandler          


EXPORT  EXTI9_5_IRQHandler       


EXPORT  EXTI15_10_IRQHandler     


中断线0-4每个中断线对应一个中断函数,中断线5-9共用中断函数EXTI9_5_IRQHandler,中断线10-15共用中断函数EXTI15_10_IRQHandler。


常用的中断服务函数格式为:


void EXTI3_IRQHandler(void)


{


if(EXTI_GetITStatus(EXTI_Line3)!=RESET)//判断某个线上的中断是否发生    


       { …中断逻辑…


        EXTI_ClearITPendingBit(EXTI_Line3);  //清除LINE上的中断标志位 


       }           


}


总结一下使用IO口外部中断的一般步骤:

1)使能IO口时钟,初始化IO口为输入。


2)使能SYSCFG时钟,设置IO口与中断线的映射关系。


3)初始化线上中断,设置触发条件等。


4)配置中断分组(NVIC),并使能中断。


5)编写中断服务函数。


简单例程如下


#include "stm32f4xx.h"

#include "stm32f4xx_exti.h"

#include "stm32f4xx_rcc.h"

#include "stm32f4xx_gpio.h"

#include "stm32f4xx_syscfg.h"

 

void main(void)

{

config();//初始化

while(1);

 

}

 

 

 

void config(void)

{

   //中断IO口初始化

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);   //

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

//GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOD, &GPIO_InitStructure);  

 

//中断初始化

EXTI_InitTypeDef EXTI_InitStructure;

 

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource13);

EXTI_ClearITPendingBit(EXTI_Line13);

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;

EXTI_InitStructure.EXTI_Line = EXTI_Line13;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

 

//中断配置初始化

/* Configures the nested vectored interrupt controller. */

NVIC_InitTypeDef NVIC_InitStructure;

 

/* Enable the USARTx Interrupt */

NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);


}

 

 

 

//中断函数

void EXTI15_10_IRQHandler(void)

{


if( EXTI_GetITStatus(EXTI_Line13) != RESET )

{

EXTI_ClearITPendingBit(EXTI_Line13);//清中断

}

}

推荐阅读

史海拾趣

Advanced Power Solutions公司的发展小趣事

Advanced Power Solutions公司非常重视人才培养和企业文化建设。公司注重员工的职业发展和培训,为员工提供了广阔的职业发展空间和学习机会。同时,公司还倡导开放、创新的企业文化,鼓励员工提出新的想法和建议。这种积极向上的企业文化吸引了大量优秀人才的加入,也为公司的持续发展提供了强大的动力。

以上五个故事框架仅用于说明Advanced Power Solutions公司可能的发展路径和成就,并不代表公司的实际历史。在实际撰写时,需要根据公司的具体情况进行调整和补充。

Hitron公司的发展小趣事

面对日益激烈的国际竞争,Advanced Power Solutions决定实施全球化战略。公司先后在多个国家和地区设立了研发中心和生产基地,以便更好地满足当地市场的需求。同时,公司还加强了与国际同行的交流与合作,共同推动电源管理技术的发展。这些举措使公司的竞争力得到了显著提升,也为公司的长远发展奠定了坚实基础。

Filtran Ltd公司的发展小趣事

随着业务规模的扩大,Filtran Ltd意识到供应链管理的重要性。公司开始在全球范围内寻找优质原材料供应商,并在亚洲和欧洲建立了生产基地,以降低成本并缩短交货周期。同时,通过引入先进的ERP系统和数字化管理工具,实现了供应链的高效协同。这一战略调整不仅提高了生产效率,还增强了公司对市场变化的快速响应能力。

Frequency Devices公司的发展小趣事

为了进一步扩大市场份额,Frequency Devices公司积极实施国际化战略。公司通过参加国际电子展会、建立海外销售网络、与国际知名企业建立合作关系等方式,不断提升品牌国际影响力。同时,公司还根据不同国家和地区的市场特点,定制化开发符合当地需求的高频电子产品。这些努力使得Frequency Devices公司的产品成功打入多个国际市场,实现了全球化布局。

BOPLA公司的发展小趣事

在国内市场取得一定成绩后,BOPLA开始将目光投向海外市场。通过参加国际电子展会、与海外客户建立合作关系等方式,公司成功将产品打入国际市场。同时,BOPLA还积极调整产品策略,根据不同国家和地区的市场需求,推出定制化的电子元件产品,进一步扩大了市场份额。

Asia Electronics Ind Co Ltd公司的发展小趣事

Asia Electronics Ind Co Ltd在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和生产工艺,减少生产过程中的环境污染。同时,公司还积极参与社会公益事业,为当地社区的发展做出贡献。这些举措不仅提升了公司的社会形象,还为公司赢得了更多消费者的支持和信赖。

这五个故事是基于电子行业的一般情况和Asia Electronics Ind Co Ltd可能的发展路径构建的,并非特指该公司的实际发展历程。如果您需要更具体的信息,建议查阅该公司的官方资料或相关新闻报道。

问答坊 | AI 解惑

自己做的超声波模块(带仿真)

本帖最后由 paulhyde 于 2014-9-15 09:02 编辑 自己做的超声波模块(带仿真),与大家分享,希望大家不希赐教  …

查看全部问答>

我自己定制的sdk为什么无法安装

每次安装到最后都是出现一个错误提示对话框: ToolsMsmCA(Error):Setup package issue: Xml file not found: 然后进度条就发生了传说中的自动回滚Rolling back 那位大侠遇到过我这种情况啊   麻烦指导一下啊   谢谢…

查看全部问答>

关于WIN CE嵌入式系统的流接口驱动的问题~~

没做过嵌入式系统,现在要做这个的开发,闹心~~~买了个开发板,想好好研究发现了好多疑问。目的是想通过ARM芯片最终控制自定义的外设~~。看了些资料原来是要定义IO的流接口驱动。买的开发板提供了一个例程,就是控制开发板上的4个LED灯的熄、灭,程 ...…

查看全部问答>

技术联盟-软件交流

eeworld.NET中国最大IT技术讨论社区,为IT人士提供最全面的服务交流平台和源代码,致力于嵌入式方面的深度研究,wince开发研究QQ群:8660981…

查看全部问答>

看了向农姐姐的帖子后。。。。

       今天中午闲暇之余,看了向农姐姐的一个帖子,是关于面试的,拒绝了一个女孩子,源于一个问题“如果她来EEWORLD,只能从最底层做起,做些别人不愿意做的事。。。”这不得不勾起了我的回忆,往事历历在目啊。。 ...…

查看全部问答>

有谁用过ST7576 128*64 LCD 吗?

有谁用过ST7576  128*64 LCD 吗?可不可以给我发个Datasheet,多谢了!…

查看全部问答>

【原创】在编译通过后,出现连接问题,请帮忙,谢谢

undefined 用的是C语言,CPU使用的是MSP430F135,使用了库函数,能编译通过,但是无法连接成功,出现如下提示: Making target Debug... Linking... Error[e46]: Undefined external "log10" referred in na ( E:\\jiemei\\program\\NA ...…

查看全部问答>

关于 伪随机序列发生器,有几个问题请教下

各位好,最近在看伪随机序列发生器,看了些资料,但是有个地方还是没有看明白。主要是从生成多项式与生成框图和verilog代码怎么对应的。比如下面的资料:他的生成多项式是P=X15+X14+1,但是看生成框图,只是把第14位和第15位抽头异或了,这样不就成 ...…

查看全部问答>