历史上的今天
返回首页

历史上的今天

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

正在发生

2021年09月29日 | STM32入门学习之EXTI外部中断(STM32F030F4P6基于CooCox IDE)

2021-09-29 来源:eefocus

下面的代码,是把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                                           */

推荐阅读

史海拾趣

ABOV(现代单片机)公司的发展小趣事

ABOV(现代单片机)是一家韩国的半导体公司,以下是该公司发展的五个相关故事:

  1. 公司成立和初期发展: ABOV公司成立于1997年,总部位于韩国首尔。公司专注于设计、制造和销售嵌入式系统解决方案,主要产品包括微控制器(MCU)和嵌入式闪存等。成立初期,ABOV致力于技术创新和产品研发,建立起一支技术精湛的研发团队。

  2. 技术创新和产品推出: ABOV在技术创新方面投入了大量资源,不断推出新产品和解决方案。公司的现代单片机产品以其高性能、低功耗和丰富的功能而闻名。ABOV还在嵌入式闪存技术方面取得了重大突破,推动了嵌入式系统的发展和普及。

  3. 市场拓展和国际合作: 随着产品技术的不断成熟和市场需求的增长,ABOV积极拓展国际市场,并与全球各地的客户建立了合作关系。公司的现代单片机产品被广泛应用于消费电子、汽车电子、工业控制等领域,赢得了客户的信赖和认可。

  4. 持续投入研发和创新: ABOV持续投入研发,并不断提升产品性能和功能。公司注重与客户的密切合作,根据客户需求进行定制化开发,为客户提供个性化的解决方案。ABOV还与学术机构和合作伙伴合作,共同推动技术创新和产业发展。

  5. 未来展望和发展方向: ABOV将继续致力于技术创新和产品升级,加强在嵌入式系统领域的研发和应用。公司将继续拓展国际市场,加强与客户和合作伙伴的合作,推动现代单片机技术的发展和普及,为全球的电子行业做出更大的贡献。

Hi-Tech Resistors Pvt Ltd公司的发展小趣事

机顶盒,全称为数字视频变换盒,是现代家庭娱乐不可或缺的重要设备。从广义上讲,任何与电视机连接的网络终端设备均可视为机顶盒,它们不仅限于接收和转换电视信号,还承载着丰富的娱乐与信息服务功能。

机顶盒的核心功能在于接收并转换来自有线电缆、卫星天线、宽带网络及地面广播的数字电视信号,将其转换为电视机可识别的视频和音频流。这一转换过程确保了观众能够享受到高清乃至4K超高清的画质和震撼的音效,极大地提升了观看体验。此外,机顶盒还集成了诸如电子节目指南、因特网网页浏览等增值服务,让电视机不再仅仅是单向接收信息的设备,而是成为一个能够与用户进行互动的智能终端。

随着技术的发展,机顶盒的种类日益丰富,按主要功能可分为数字卫星机顶盒、有线电视数字机顶盒、IPTV机顶盒等。这些机顶盒不仅满足了用户多样化的观看需求,还通过连接互联网,提供了在线购物、视频点播、游戏娱乐等多元化服务。未来,随着高清、超高清技术的普及以及人工智能、云计算等技术的应用,机顶盒将向智能化、多功能化方向发展,为用户提供更加便捷、个性化的使用体验。

总之,机顶盒作为连接电视与互联网的桥梁,在丰富家庭娱乐生活、提升观看体验方面发挥着重要作用。随着技术的不断进步和市场需求的持续增长,机顶盒行业将迎来更加广阔的发展前景。

GAIA Converter Inc公司的发展小趣事

随着全球化进程的加速,锋鸣电子(上海总部)于2015年启动了国际化战略。公司首先在东南亚地区设立生产基地,利用当地的成本优势扩大产能。随后,锋鸣电子积极参加国际展会,拓展海外市场,与多家国际知名企业建立了合作关系。通过国际化战略的实施,锋鸣电子不仅提升了品牌知名度,还实现了销售收入的快速增长。

Amulet Technologies公司的发展小趣事

随着全球化进程的加速,锋鸣电子(上海总部)于2015年启动了国际化战略。公司首先在东南亚地区设立生产基地,利用当地的成本优势扩大产能。随后,锋鸣电子积极参加国际展会,拓展海外市场,与多家国际知名企业建立了合作关系。通过国际化战略的实施,锋鸣电子不仅提升了品牌知名度,还实现了销售收入的快速增长。

Aearo Technologies公司的发展小趣事

Aearo Technologies公司创立于四十多年前,从一开始就致力于能量控制技术的研发。公司凭借创始团队在声学、材料科学和工程领域的深厚背景,成功开发出了一系列高性能的噪声和振动控制材料。这些创新材料为公司在电子行业中树立了良好的声誉,也为其后续发展奠定了坚实的基础。

Degson Electronics Co Ltd公司的发展小趣事

随着市场需求的不断变化,Degson意识到只有不断创新和升级产品,才能在激烈的市场竞争中保持领先地位。因此,公司投入大量资金用于研发,并在技术上取得了重大突破。Degson成功研发出了一系列新型接线端子和精密模具,不仅提高了产品的性能和质量,还降低了生产成本。这些新产品迅速在市场上获得了广泛应用,进一步巩固了Degson在电子连接器领域的领先地位。

问答坊 | AI 解惑

信号与系统分析及MATLAB实现 PDF格式(很好的书哦)

希望大家在下载时帮忙顶一下。使越来越多的人下载。用matlab软件去理解信号与系统。 共有6个分卷。现在已经全部上传完毕。可以下载了。 图书封面如下所示。S …

查看全部问答>

招聘

嵌入式产品系统开发硬件工程师若干名; 软件工程师若干名; 项目经理若干名; 技术总监若干名。 热忱欢迎有志之士的加入。一旦录用待遇从优。 欢迎电询和传真 联系人:郑经理 简历投递地址:zona_zheng@axwdragon.com 电话联系:027-878805 ...…

查看全部问答>

Protel99se印制电路版图设计技巧

Protel99se印制电路版图设计技巧…

查看全部问答>

注册程序

在winCE中如何给写的程序加入注册部分,只有注册了才能用.…

查看全部问答>

准备学习ARM9,请大家推荐款S3C2410开发板

准备学习ARM9,请大家推荐款S3C2410开发板…

查看全部问答>

继续寻觅美国微软,微软美国

从上海回来有段时间了,从去到回来一直想保持低调,所以也没有说什么. 还是说正经的吧 目前比较紧急的需求有3个 外派美国微软的开发测试工程师 职位名称:赴美国微软软件开发测试工程师 工作城市:美国 职位要求: 1、计算机相关专业本科以 ...…

查看全部问答>

请为各位在WINCE下用什么语言开发应用程序??

小弟刚接触不久,主要在WINCE下作CAN的通讯,请问各位在WINCE下都用什么语言,除了EVC,有用.NET的么??感觉怎么样???…

查看全部问答>

帮忙推荐一款和149兼容,RAM达到4K的芯片!~~

帮忙推荐一款 和 430F149,引脚,电路,程序完全兼容的一款芯片。 但是 RAM 可以达到 4K,或者 4K 以上的芯片。 谢谢。。。 我现在程序 RAM 不够用。。。…

查看全部问答>

图解零电压开关电源(ZVS)的10个工作流程描述

零电压开关电源(ZVS)是当前开关电源技术中比较先进,也比较成熟的技术,因为处于软开关状态,可以做到更高的频率及更高的效率,并且系统的可靠性更高跟稳定。 基于ZVS技术的芯片目前也比较多,比较典型的有UC3875及UCC3879,刘胜利的“现代高 ...…

查看全部问答>