历史上的今天
返回首页

历史上的今天

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

正在发生

2020年09月11日 | 中断之外部中断

2020-09-11 来源:eefocus

ARM Cortex M3共有256个中断。

STM32F103CB共有43个外部中断和16个内部中断。

具有相同数值编号的IO口被分配为同一组,共用一条中断请求线,如下图:

 

 

所以共有15条中断线,另外

●EXTI线16连接到PVD输出
●EXTI线17连接到RTC闹钟事件
●EXTI线18连接到USB唤醒事件

寄存器:1、外部中断配置寄存器    AFIO_EXTxCR1------->用于选择输入中断源  Pin 0..3

                                     AFIO_EXTxCR2------->用于选择输入中断源  Pin 0..7

                                     AFIO_EXTxCR2------->用于选择输入中断源  Pin 8..11

                                     AFIO_EXTxCR2------->用于选择输入中断源  Pin 12..15

                                 (说明:5个端口PORTA..E,每个端口各有16位可供选择)

           2、中断屏蔽寄存器        EXTI_IMR----------->屏蔽线上的中断请求         共19路

           3、事件屏蔽寄存器        EXTI_EMR----------->屏蔽线上的事件             共19路

           4、上升沿触发选择寄存器  EXTI_RTSR---------->设置相应线为上升沿触发       19位

           5、下降沿触发选择寄存器  EXTI_FTSR---------->设置相应线为上升沿触发       19位

          6、挂起寄存器            EXTI_PR------------>中断线上发生了选择的边沿事件时置1   19位

          7、软件中断事件寄存器    EXTI_SWIER--------->写该位可以将EXTI_PR中相应的位值高,如果EXTI_IMR或EXTI_EMR使能,则可以产生相应的中断 

配置流程:中断在使用前必须对中断线进行配置并激活

       1、配置相应的IO口为输入,浮空输入时一定要加上拉或者是下拉

       2、开启IO口复用时钟,设置IO与中断线的映射关系---->AFIO_EXTxCR1

       3、设置相应中断触发条件---------->EXTI_IMR、EXTI_RTSR、EXTI_FTSR      

       4、在NVIC中开启并使能中断,对中断分组进行配置

       5、编写中断服务函数

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------>

编写中断程序的步骤:(库函数版)

1.初始化系统时钟和端口时钟,在此需注意设置完端口时钟外还须将端口设置为功能复用IO时钟。RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE)

2.初始化GPIO。

3.中断配置,包括两部分(两个函数),中断配置和中断优先级配置。

中断配置:结构体:EXTI_InitTypeDef 。清空中断线、中断线映射CPU、中断线选择、中断模式、触发方式、使能。

优先级配置:结构体:NVIC_InitTypeDef。选组、选择IRQ通道、设置抢占优先级、设置从优先级、使能。

EG:  EXTI_Configuration() 和 NVIC_Configuration()

分组情况:

优先级组别抢占式优先级副优先级
44位/16级0位/0级
33位/8级1位/2级
22位/4级2位/4级
11位/2级3位/8级
00位/0级4位/6级

 

4.中断服务程序。比如0号中断线对应函数  void EXTI0_IRQHandler(void)

示例:按键改变LED的状态

1.主要功能是按键响应中断从而改变LED的状态。
2.按键所属端口:GPIOB,LED所属端口:GPIOB
3.按键管脚:PB0~PB7
4.LED管脚:PB8~PB15
5.PB0~PB5分别依次控制PB8~PB13


  1 #include "pbdata.h"

  2 #include "led.h"

  3 #include "key.h"

  4 #include "misc.h"

  5 #include "stm32f10x_exti.h"

  6 

  7 void RCC_Configration(void)

  8 {

  9      SystemInit();

 10      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

 11      RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);      //功能复用IO时钟

 12 }

 13 

 14 void GPIO_Configration(void)

 15 {

 16     GPIO_LED_Configration();

 17     GPIO_KEY_Configration();

 18 }

 19 

 20 /*

 21   *中断配置*

 22             */

 23 void EXTI_Configuration(void)

 24 {

 25     EXTI_InitTypeDef EXTI_InitStructure;

 26          

 27     EXTI_ClearITPendingBit(EXTI_Line0);     //清空中断线

 28     EXTI_ClearITPendingBit(EXTI_Line1);

 29     EXTI_ClearITPendingBit(EXTI_Line2);

 30     EXTI_ClearITPendingBit(EXTI_Line3);

 31     EXTI_ClearITPendingBit(EXTI_Line4);

 32     EXTI_ClearITPendingBit(EXTI_Line5);

 33     EXTI_ClearITPendingBit(EXTI_Line6);

 34     EXTI_ClearITPendingBit(EXTI_Line7);

 35 

 36     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);//映射

 37     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);

 38     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource2);

 39     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource3);

 40     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource4);

 41     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource5);

 42     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6);

 43     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource7);

 44         

 45     EXTI_InitStructure.EXTI_Line=EXTI_Line0 | EXTI_Line1 | EXTI_Line2 | EXTI_Line3 | EXTI_Line4 | EXTI_Line5 | EXTI_Line6 | EXTI_Line7;       //选择中断线

 46 

 47     EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;           //设置模式

 48     EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;       //设置触发方式

 49     EXTI_InitStructure.EXTI_LineCmd=ENABLE;                        //使能

 50 

 51     EXTI_Init(&EXTI_InitStructure);

 52 }

 53 

 54 void NVIC_Configuration0(void)         //优先级设置函数

 55 {

 56        NVIC_InitTypeDef NVIC_InitStructure; 

 57 

 58     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); 

 59                                                      

 60     NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;       //选择IRQ通道

 61     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //抢占优先级设置

 62     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;            //次优先级设置

 63     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

 64     NVIC_Init(&NVIC_InitStructure);     

 65 }

 66 

 67 void NVIC_Configuration1(void)        

 68 {

 69        NVIC_InitTypeDef NVIC_InitStructure; 

 70 

 71 //    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); 

 72                                                      

 73     NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;       

 74     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  

 75     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;            

 76     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

 77     NVIC_Init(&NVIC_InitStructure);    

 78 }

 79 

 80 void NVIC_Configuration2(void)

 81 {

 82     NVIC_InitTypeDef NVIC_InitStructure; 

 83 

 84 //    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); 

 85 

 86     NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;       

 87     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  

 88     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;            

 89     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

 90     NVIC_Init(&NVIC_InitStructure);       

 91 }

 92 

 93 void NVIC_Configuration3(void)

 94 {

 95     NVIC_InitTypeDef NVIC_InitStructure; 

 96 

 97 //    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); 

 98 

 99     NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;       

100     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;  

101     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;            

102     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

103     NVIC_Init(&NVIC_InitStructure);      

104 }

105 

106 void NVIC_Configuration4(void)

107 {

108     NVIC_InitTypeDef NVIC_InitStructure; 

109 

110 //    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); 

111 

112     NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;      

推荐阅读

史海拾趣

ALPS公司的发展小趣事

ALPS公司是一家日本电子制造商,成立于1948年,总部位于东京。以下是关于ALPS公司发展的五个相关故事:

  1. 创立与早期发展:ALPS公司最初成立时,是一家小规模的电子零部件制造商,专注于生产开关和其他电子元器件。在日本战后经济快速复苏的背景下,ALPS公司迅速发展壮大,成为当时日本电子行业的重要参与者之一。

  2. 技术创新与产品多样化:随着时间的推移,ALPS公司不断进行技术创新,扩展其产品线。除了开关和电子元器件外,公司还涉足了汽车电子、通信设备、家电、数字产品等领域,推出了各种多功能的产品,满足不同行业和消费者的需求。

  3. 全球化战略:为了进一步扩大市场份额,ALPS公司实施了全球化战略,逐步在世界各地建立了生产基地和销售网络。公司在亚洲、欧洲、北美等地设立了子公司和分支机构,与当地客户和合作伙伴紧密合作,拓展了国际市场。

  4. 产业布局与战略合作:除了自身产品开发和制造外,ALPS公司还通过战略合作和并购等方式进行产业布局,加强了自身在电子行业中的地位。公司与其他行业领先企业合作,共同开发新技术和产品,提升了市场竞争力。

  5. 环境保护与社会责任:作为一家负责任的企业,ALPS公司重视环境保护和社会责任,致力于减少环境污染和资源浪费。公司采取了各种措施,包括提高能源利用效率、推动循环经济和环保产品设计等,为可持续发展做出了积极贡献。

以上是关于ALPS公司发展的五个相关故事,这些故事展示了ALPS公司在技术创新、产品多样化、全球化战略、产业布局和环境保护方面的发展历程,以及其在电子行业中的重要地位和影响力。

ABL Heatsink公司的发展小趣事

早期,ABL Heatsink公司主要生产通用型散热器,但随着市场竞争的加剧,公司意识到必须调整市场定位。于是,公司开始专注于研发针对特定电子设备的高性能散热器。通过深入了解客户需求,ABL Heatsink成功开发出一系列定制化产品,赢得了市场的青睐。

Densei-Lambda (TDK)公司的发展小趣事

ABL Heatsink公司在发展过程中,积极寻求与其他企业的合作。通过与芯片制造商、电子设备生产商等建立紧密的合作关系,ABL Heatsink成功将自己的散热器产品集成到各种高端电子设备中。这种合作模式不仅提升了公司的知名度,也带来了稳定的订单和收入。

Gigabit Logic Inc公司的发展小趣事
采用集成电路等现代电子元器件,提高了电路的可靠性和稳定性。
Advanced Optoelectronic Technology Corp公司的发展小趣事

在光电技术领域,AOTC始终保持领先地位。公司不断推出创新产品,如高效能的光电传感器、智能照明系统等,这些产品不仅提升了人们的生活品质,还推动了整个电子行业的变革。AOTC的技术创新得到了业界的广泛认可,公司逐渐成为了行业的领军企业。

Design Gateway公司的发展小趣事

随着Gateway业务的不断发展,公司开始寻求更多的市场曝光。1987年,Gateway在《Computer Shopper》杂志上投放了一版独特的广告,吸引了众多消费者的目光。1991年,公司推出了彰显其牧场起家背景的别具一格的奶牛花斑盒状商标,这一创新举措获得了全国消费者的认可,进一步提升了Gateway的品牌知名度和市场地位。

(请注意,由于篇幅限制,以上两个故事为简化版。在实际写作中,可以进一步扩展每个故事,包括更详细的背景信息、人物对话、市场反应等。)

由于篇幅所限,这里只提供了两个故事概要。如果需要更多关于Gateway或其他电子公司的发展故事,可以进一步研究和撰写。

问答坊 | AI 解惑

财富500强猎头公司急招以下岗位!

RF 工程师(工作地点 深圳龙岗) 要求:(本科以上学历 3人) 1.精通RF電路設計與分析,熟練掌握天線設計實際經驗及低噪音放大器線路設計,有車廠實際經驗者優先。 2. 熟練使用ADS、MWO、ANSOFT、IE3D等RF仿真軟體(ANSOFT、IE3D必須得懂。 3. 有 ...…

查看全部问答>

Peter Petrie蛋黄分离器

为什么是Peter Petrie?不知道…不过这个蛋黄分离器有够搞怪而且有够恶心- -!!! 蛋清这东西原本看起来就很尴尬,再从鼻孔里流出来就更无敌了. 心理素质差的家庭主妇估计有看的份没吃的份了. …

查看全部问答>

一般电子设计的问题

本帖最后由 paulhyde 于 2014-9-15 09:01 编辑 1.电阻电容的封装形式如何选择,有没有什么原则?比如,同样是104的电容有0603、0805的封装,同样是10uF电容有3216,0805,3528等封装形式,选择哪种封装形式比较合适呢? 2.有时候两个芯片的引脚(如芯片A的 ...…

查看全部问答>

cximage在WINCE5下出现部署错误

在把cximage600_ce全部编译通过后,运行demo_ce,出现部署错误,具体如下: 1>------ 已启动部署: 项目: zlib, 配置: Debug CE50CHS (ARMV4I) ------ 1>未指定的错误 1> 2>------ 已启动部署: 项目: tiff, 配置: Debug CE50CHS (ARMV4I) ------ ...…

查看全部问答>

USB 摄像头驱动中图像格式除了 NTSC还有别的吗?

我正在学习WINDOWS驱动开发, 看到DDK自带的例子中给了那个虚拟 摄像头驱动用得是NTSC的格式,  想问一下,现在使用的摄像头都是数字的, 还是使用这种图像格式吗? 是不是直接有RGB格式。…

查看全部问答>

通讯开发

通讯开发需要哪些知识和技能。请各位大侠帮帮忙,还是刚入门 呵呵…

查看全部问答>

怎样用U盾实现用户登录验证?

怎样用U盾实现用户登录验证? 插入U盾,用户输入口令就可以看到相关信息。 网站是java做的,怎样读取U盾的信息?怎样验证法?…

查看全部问答>

嵌入式电池安全信息监控器

求:嵌入式电池安全信息监控器 原理.基于UCLINUX…

查看全部问答>

关于wince的API与WIN32的API

老师要我们查关于wince的API与WIN32的API异同,也就是哪些API在wince中没有,或者wince中的哪些自己特有的API代替了win32中的API, 麻烦哪位达人告诉我,可以发我邮箱188808211@qq.com谢谢啊…

查看全部问答>

请问一下各位前辈,考取IDETCO这个嵌入式技术认证有意义吗?

小弟在嵌入式(ARM)方面初入行,现在主要负责做WinCE方面的底层驱动以及应用程序开发~~想增强一下自己的底子,所以想考取一个嵌入式方面的认证,各位有什么好提议吗?谢谢~~~…

查看全部问答>