历史上的今天
返回首页

历史上的今天

今天是:2024年08月29日(星期四)

正在发生

2019年08月29日 | STM32F429 >> 7. 中断

2019-08-29 来源:eefocus

本工程板级支持包文件适用于野火stm32f429 开发板。

STM32 的中断主要涉及两个部分,NVIC 和EXTI


NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能;外部中断/事件控制器(EXTI)可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。


EXTI 可分为两大功能:产生中断 和 产生事件


当其产生中断时,其中断线路将输入信号输入到NVIC,进一步运行中断服务函数,实现功能(其输出最终被映射到NVIC的相应通道。);而当其产生事件时,则是传输一个脉冲信号给其他外设使用

在这里插入图片描述

EXTI 是在APB2 总线上的


在这里插入图片描述

EXTI0 至 EXTI15 用于 GPIO,通过编程控制可以实现任意一个 GPIO 作为 EXTI的输

入源。


编程要点

配置NVIC

a. 设置优先级组

b. 配置 NVIC_InitStructure

c. 使能 NVIC

配置EXTI

a. 开启 EXTI 时钟

b. 连接 EXTI 到中断源

c. 配置 EXTI 初始化结构体

d. 使能 EXTI

编写EXTI 中断服务函数

bsp_exti.c

NVIC_Init() 函数在misc.c 中


/**

  ******************************************************************************

  * @file    bsp_exti.c

  * @author  Waao

  * @version V1.0.0

  * @date    21-Dec-2018

  * @brief   This file contains some board support package's functions for the configuration of the NVIC.

  *            

  ******************************************************************************

  * @attention

  *

  * None

  *

  ******************************************************************************

  */



#include

#include

#include


/**

  * @brief  Configure the NVIC

  * @param  None

  * @retval None

  */

static void NVIC_Configuration(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

//Configure the NVIC to prioritygroup1

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

//Configure the preemption priority to 1

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

//Configure the subpriority to 1

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

//Enable the interrupt channel

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

//Configure the interrupt channel

NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;

NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = KEY2_INT_EXTI_IRQ;

NVIC_Init(&NVIC_InitStructure);

}



/**

  * @brief  Configure the EXTI

  * @param  None

  * @retval None

  */

void EXTI_Key_Config(void)

{

EXTI_InitTypeDef EXTI_InitStructure;

KEY_GPIO_Config();

LED_GPIO_Config();

//Enable the clock of the SYSCFG(must do that when use the GPIO external interrupt)

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

NVIC_Configuration();

//Connect the exti interrupt source to key1 pin 

SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE, KEY1_INT_EXTI_PINSOURCE);

//Choice the exti interrupt source

EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;

//Choice the mode

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

//Choice the trigger type

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

//Enable

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

//Connect the exti interrupt source to key1 pin 

SYSCFG_EXTILineConfig(KEY2_INT_EXTI_PORTSOURCE, KEY2_INT_EXTI_PINSOURCE);

EXTI_InitStructure.EXTI_Line = KEY2_INT_EXTI_LINE;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

}


bsp_exti.h

/**

  ******************************************************************************

  * @file    bsp_exti.h

  * @author  Waao

  * @version V1.0.0

  * @date    21-Dec-2018

  * @brief   This file contains some board support package's definition for the exti.

  *            

  ******************************************************************************

  * @attention

  *

  * None

  *

  ******************************************************************************

  */

#ifndef __EXTI_H_

#define __EXTI_H_


#include



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

#define KEY1_INT_GPIO_PORT                GPIOA

#define KEY1_INT_GPIO_CLK                 RCC_AHB1Periph_GPIOA

#define KEY1_INT_GPIO_PIN                 GPIO_Pin_0

#define KEY1_INT_EXTI_PORTSOURCE          EXTI_PortSourceGPIOA

#define KEY1_INT_EXTI_PINSOURCE           EXTI_PinSource0

//The EXTI_Line number must be consistent with the GPIO_Pin number

#define KEY1_INT_EXTI_LINE                EXTI_Line0

#define KEY1_INT_EXTI_IRQ                 EXTI0_IRQn


#define KEY1_IRQHandler                   EXTI0_IRQHandler



#define KEY2_INT_GPIO_PORT                GPIOC

#define KEY2_INT_GPIO_CLK                 RCC_AHB1Periph_GPIOC

#define KEY2_INT_GPIO_PIN                 GPIO_Pin_13

#define KEY2_INT_EXTI_PORTSOURCE          EXTI_PortSourceGPIOC

#define KEY2_INT_EXTI_PINSOURCE           EXTI_PinSource13

#define KEY2_INT_EXTI_LINE                EXTI_Line13

#define KEY2_INT_EXTI_IRQ                 EXTI15_10_IRQn


#define KEY2_IRQHandler                   EXTI15_10_IRQHandler


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


static void NVIC_Configuration(void);

void EXTI_Key_Config(void);


#endif


中断线须与端口号一致


stm32f4xx_it.c

部分代码,其余部分不需修改:


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

/*                 STM32F4xx Peripherals Interrupt Handlers                   */

/*  Add here the Interrupt Handler for the used peripheral(s) (PPP), for the  */

/*  available peripheral interrupt handler's name please refer to the startup */

/*  file (startup_stm32f429_439xx.s).                         */

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


/**

  * @brief  Turn the status of the led2 when we trigger the exti0

  * @param  None

  * @retval None

  */

void KEY1_IRQHandler(void)

{

LED2_TOGGLE;

EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);

}


/**

  * @brief  Turn the status of the led3 when we trigger the exti13

  * @param  None

  * @retval None

  */

void KEY2_IRQHandler(void)

{

LED3_TOGGLE;

EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);

}


中断服务函数在stm32f4xx_it.c 中进行构建

中断服务函数的名称必须与启动文件当中给出的一致

中断服务函数中任务执行完必须清除中断标志


推荐阅读

史海拾趣

动运科技(DONGWOON)公司的发展小趣事

随着技术的不断成熟和市场的逐步扩大,动运科技开始将目光投向国际市场。公司先后在深圳、上海、美国、日本和台湾等地设立了研发或分公司与办事处,形成了全球化的研发和销售网络。通过与全球知名企业的合作,动运科技的产品逐渐进入了智能手机、LED照明、物联网等多个领域,并取得了显著的业绩。

Auris公司的发展小趣事

在Auris公司的发展历程中,2017年夏天的一次收购事件具有重要意义。Auris以8000万美元的价格收购了Hansen Medical,这是一家专门开发工具来操控导管的公司。这次收购不仅增强了Auris在手术机器人领域的技术实力,也为其后续的产品研发和市场拓展提供了更多可能性。

浙江东亚电子(DongYa)公司的发展小趣事

浙江东亚电子注重企业文化的建设,致力于为员工提供一个良好的工作环境和发展平台。公司关注员工的学习和成长,为员工提供持续长效的发展机会和有竞争力的薪酬。同时,公司还积极开展各类文化活动和社会公益活动,增强员工的归属感和凝聚力。

这些故事框架展示了浙江东亚电子在电子行业中发展起来的几个重要方面。通过技术创新、产业布局拓展、国际市场开拓、品质管理提升和企业文化建设等方面的努力,公司不断壮大自身实力,成为行业内的佼佼者。

Aleph America Corporation公司的发展小趣事

浙江东亚电子一直将品质管理作为公司发展的重要基石。公司建立了完善的质量管理体系,从原材料采购到产品制造、销售等各个环节都严格把关。此外,公司还积极参与行业标准和规范的制定工作,不断提升自身的品质管理水平。

德艺隆(DEALON)公司的发展小趣事

面对数字化转型和智能化升级的大趋势,德艺隆不甘落后。他们引进先进的生产设备和技术,提高了生产效率和产品质量;同时,公司还加大了对数字化和智能化技术的研发和应用力度,推出了一系列智能化产品解决方案。这些举措不仅提升了公司的竞争力,也为公司的未来发展奠定了坚实的基础。

Apex Tool Group公司的发展小趣事

德艺隆自创立之初,就专注于电子开关、插座和连接器的研发与生产。在创始人陈建新的带领下,公司聚集了一批从业多年的设计开发、生产管理等技术人员。他们日夜兼程,不断攻克技术难关,逐渐在行业内树立了技术领先的地位。一次,公司接到一个要求极高精度的连接器订单,技术人员经过反复试验,最终成功研发出符合要求的连接器,赢得了客户的赞誉,也为公司赢得了更多的市场份额。

问答坊 | AI 解惑

建议:坛里面组织LM3S8962开发板的朋友,对TI的驱动程序仔细研读

分配有开发板的朋友,每月提交一篇关于LM3S8962的使用心得。其实最好还是,像周立功那样,对所有的驱动程序进行分析验证,最后形成使用习惯,分享给广大学习者。这个任务很重,建议统一论坛组织,是一个长期的工作。这工作做好了,以后利用LM3S系列 ...…

查看全部问答>

eboot下实现SDHC的问题(2440)

背景:随着现在大容量卡的普及,小容量的卡反而比较难找了。在loader菜单下使用SD卡进行系统升级应该算是最快捷方便的了。但当你拿着一张大容量卡,loader却无法识别的时候,就尴尬了。看来卡不一定容量越大越好啊! 问题描述:现在在EBOOT中加入了 ...…

查看全部问答>

做电源按键驱动,发现驱动加载失败,大侠们,帮帮忙吧...

电源按键驱动加载失败,KITL监测的打印信息如下: Loaded symbols for \'F:\\WINCE500\\PBWORKSPACES\\NEW2442\\RELDIR\\CABLE2442_ARMV4I_RELEASE\\PWRBTN2440.DLL\'    6721 PID:7f92c1e TID:7fa2c6a PwrButton2440: DLL_PROCESS_ATT ...…

查看全部问答>

頂一下我的編程網吧

頂一下我的編程網吧 www.kingofcoders.com…

查看全部问答>

渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临!

渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临! 渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临! 详情请参见 www.neworigin.net 同时欢迎大家与我们的609期学员交流!这期学员已与2月11日毕业 ...…

查看全部问答>

电容三点式震荡电路『紧急求教』

这个震荡电路,一直调不出波形。不知道什么有什么错误之处。以前一样的电路调出过。不知道现在怎么出不来了。请大家帮忙看看。谢谢1…

查看全部问答>

STM32F103系列USB内置CRC生成和校验功能吗

                                 如题,STM32F103系列USB内置CRC生成和校验功能吗,因为I2C和SPI是带了的?…

查看全部问答>

CCS加载中的一些问题的讨论

本帖最后由 dontium 于 2015-1-23 13:34 编辑 你好,我自己开发了一块6711的板子,我在用CCS LOAD PROGRAM 时候总是LOAD不进去,错误提示为: “FILE hello.out does not match the target endianness,not loaded.Check build options,or use th ...…

查看全部问答>