历史上的今天
返回首页

历史上的今天

今天是:2025年01月31日(星期五)

2019年01月31日 | 【stm32f103】stm32 外部中断(寄存器版)

2019-01-31 来源:eefocus

中断分类                                                                                                                                         

STM32的EXTI控制器支持19 个外部中断/ 事件请求。每个中断设有状态位,每个中断/ 事件都有独立的触发和屏蔽设置。

STM32的19个外部中断对应着19路中断线,分别是EXTI_Line0-EXTI_Line18:


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

线16:连接到 PVD 输出。

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

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


 触发方式:STM32 的外部中断是通过边沿来触发的,不支持电平触发。 


外部中断分组:STM32 的每一个GPIO都能配置成一个外部中断触发源,STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0为第一组,那么依此类推,我们能得出一共有16 组,STM32 规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。


寄存器组                                                                                                                                        

EXTICR寄存器组,总共有4 个,因为编译器的寄存器组都是从0 开始编号的,所以EXTICR[0]~ EXTICR[3],对应《STM32参考手册》里的 EXTICR1~ EXTICR 4(查了好久才搞明白这个数组的含义!!)。每个 EXTICR只用了其低16 位。


EXTICR[0] ~EXTICR[3]的分配如下:


EXTI寄存器的结构体:

typedef struct 

  vu32 IMR; 

  vu32 EMR; 

  vu32 RTSR; 

  vu32 FTSR; 

  vu32 SWIER; 

  vu32 PR; 

} EXTI_TypeDef;

       IMR:中断屏蔽寄存器

这是一个 32 寄存器。但是只有前 19 位有效。当位 x 设置为1 时,则开启这个线上的中断,否则关闭该线上的中断。


EMR:事件屏蔽寄存器


同IMR ,只是该寄存器是针对事件的屏蔽和开启。


RTSR:上升沿触发选择寄存器


该寄存器同IMR ,也是一个32为的寄存器,只有前 19位有效。位 x 对应线x 上的上升沿触发,如果设置为 1 ,则是允许上升沿触发中断/ 事件。否则,不允许。


FTSR:下降沿触发选择寄存器


同 PTSR,不过这个寄存器是设置下降沿的。下降沿和上升沿可以被同时设置,这样就变成了任意电平触发了。


SWIER:软件中断事件寄存器


通过向该寄存器的位x 写入 1 ,在未设置 IMR 和EMR的时候,将设置PR中相应位挂起。如果设置了IMR 和EMR时将产生一次中断。被设置的SWIER位,将会在PR中的对应位清除后清除。


PR:挂起寄存器


0 ,表示对应线上没有发生触发请求。


1,表示外部中断线上发生了选择的边沿事件。通过向该寄存器的对应位写入 1 可以清除该位。


在中断服务函数里面经常会要向该寄存器的对应位写1 来清除中断请求。


中断配置步骤                                                                                                                          

STM32的每个IO口都可以作为中断输入,这点很好用。要把IO口作为外部中断输入,有以下几个步骤:


1)初始化IO口为输入。


这一步设置你要作为外部中断输入的IO口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。否则可能导致中断不停的触发。在干扰较大的地方,就算使用了上拉/下拉,也建议使用外部上拉/下拉电阻,这样可以一定程度防止外部干扰带来的影响。


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


STM32的IO口与中断线的对应关系需要配置外部中断配置寄存器EXTICR,这样我们要先开启复用时钟,然后配置IO口与中断线的对应关系。才能把外部中断与中断线连接起来。

3)开启与该IO口相对的线上中断/事件,设置触发条件。

这一步,我们要配置中断产生的条件,STM32可以配置成上升沿触发,下降沿触发,或者任意电平变化触发,但是不能配置成高电平触发和低电平触发。这里根据自己的实际情况来配置。同时要开启中断线上的中断,这里需要注意的是:如果使用外部中断,并设置该中断的EMR位的话,会引起软件仿真不能跳到中断,而硬件上是可以的。而不设置EMR,软件仿真就可以进入中断服务函数,并且硬件上也是可以的。建议不要配置EMR位。

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

这一步,我们就是配置中断的分组,以及使能,对STM32的中断来说,只有配置了NVIC的设置,并开启才能被执行,否则是不会执行到中断服务函数里面去的。关于NVIC的详细介绍,请参考前面章节。

5)编写中断服务函数。

这是中断设置的最后一步,中断服务函数,是必不可少的,如果在代码里面开启了中断,但是没编写中断服务函数,就可能引起硬件错误,从而导致程序崩溃!所以在开启了某个中断后,一定要记得为该中断编写服务函数。在中断服务函数里面编写你要执行的中断后的操作。


程序如下:


void EXIT8_IPRT()

{

RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;

EXTI->IMR = EXTI_IMR_MR8;

EXTI->RTSR = EXTI_RTSR_TR8;

AFIO->EXTICR[2] = AFIO_EXTICR3_EXTI8_PA;

NVIC_EnableIRQ(EXTI9_5_IRQn);

}

 

void GPIOA8_Init()

{

/* 1. ENABLE GPIOA CLOCK */

RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;

/* 2. CONFIG PA8*/

GPIOA->CRH &= ~(GPIO_CRH_MODE8 | GPIO_CRH_CNF8);

GPIOA->CRH |= GPIO_CRH_CNF8_1;

EXIT8_IPRT();

while(1)

{

}

}

调试如下                                                                                                                          

1)初始化IO口为输入。如图

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

3)开启与该IO口相对的线上中断/事件,设置触发条件。

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


5)编写中断服务函数。


void EXTI9_5_IRQHandler(void)

{

Delay_ms(10);

if((EXTI->PR) & EXTI_PR_PR8)

{

EXTI->PR = EXTI_PR_PR8;

printf("Monitor rising\n");

}

}


推荐阅读

史海拾趣

APM Hexseal公司的发展小趣事

APM Hexseal的创始人Milton Morse是一位自学成才的工程师和杰出的创新者。他敏锐地洞察到电子行业对密封解决方案的迫切需求,于是开始设计原始的密封开关“靴子”。这种模制的覆盖物能够保护拨动开关和安装面板免受各种液体和气体的渗透。这一创新产品迅速取得了巨大的成功,为APM Hexseal公司奠定了坚实的基础。

Defender Security公司的发展小趣事

随着网络安全问题的全球化趋势日益明显,Defender Security公司开始积极拓展国际市场。他们与多家国际知名的网络安全企业建立了合作关系,共同应对全球网络安全挑战。通过技术交流和合作研发,Defender Security不断提升自己的国际竞争力,逐渐成为了全球网络安全领域的重要力量。

Amulet Technologies公司的发展小趣事

随着勒索软件的日益猖獗,Defender Security公司迅速调整战略,成立了专门的研究小组来对抗这种威胁。他们深入分析了勒索软件的传播方式和攻击手段,开发出了高效的检测和防御系统。通过不断的技术创新和优化,Defender Security成功帮助多家企业抵御了勒索软件的攻击,赢得了市场的广泛认可。

ASPEED Technology公司的发展小趣事

ASPEED与Audinate建立了合作伙伴关系,共同开发Dante AV-A。这一合作使得ASPEED的SoC能够支持Dante AV-over-IP芯片组,为专业AV行业的制造商提供了更加便捷、高效的解决方案。通过合作,ASPEED进一步巩固了其在专业AV市场的地位,并拓宽了公司的业务范围。

Advanced Microelectronic Products Inc公司的发展小趣事

随着公司业务的不断发展,AMP公司意识到与国际伙伴合作的重要性。于是,公司积极寻求与国际知名企业的战略合作,通过技术交流和资源共享,共同开发新型电子产品。这些国际合作不仅提升了AMP公司的技术水平,还进一步提升了其品牌影响力和国际知名度。公司因此获得了更多海外市场的认可,实现了业务的全球化布局。

Equator Technologies公司的发展小趣事

在发展过程中,Equator始终注重拓展国际市场。通过与全球各地的合作伙伴建立紧密的合作关系,Equator将其产品和服务推向了世界各地。特别是在亚洲市场,Equator凭借其卓越的技术实力和优质的产品赢得了众多客户的青睐。同时,公司还积极参加国际展会和交流活动,与全球同行进行技术交流和合作,不断提升自身的国际竞争力。

问答坊 | AI 解惑

[共享]发一个LCD1602驱动程序(四位数据线)

经过多次优化,得到比较精简的程序。 可以用Proteus仿真,硬件上也可用 编译器:ICC-AVR v6.31A   目标芯片 : M16 时钟: 8.0000Mhz 下面是AVR与LCD连接信息 PA2 ->RS PA3 ->EN 地  ->RW PA4 ->D4 PA5 ->D5 ...…

查看全部问答>

分享:LED照明设计基础知识

转自:电子元件技术 发光二极管(LED)继在中小尺寸屏幕的便携产品背光等应用获大量采用后,随着它发光性能的进一步提升及成本的优化,近年来已迈入通用照明领域,如建筑物照明、街道照明、景观照明、标识牌、信号灯、以及住宅内的照明等,应用可谓 ...…

查看全部问答>

单片机视频教程【4-2】数码管

$(\'swf_Rx2\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/30389179/v.swf\'), ...…

查看全部问答>

新批准的 ZigBee Health Care 标准现可供公众下载

面向能源管理、住宅、商业和消费电子应用产品创造无线解决方案的全球企业联盟 ZigBee(R) 联盟 (ZigBee(R) Alliance) 今天宣布,董事会已经批准 ZigBee Health Care(ZigBee 医疗保健标准),并向公众发布标准。ZigBee Health Care 带来了新方法,帮 ...…

查看全部问答>

CAN总线原理与应用

CAN总线原理与应用…

查看全部问答>

请问KEIL C51 的IO口怎么定义?

比如:     #include     main()     {      sbit  p11=P1^1;      p11=0;     }     编译时出现错误; 有些用80X51.h; 头文件 ...…

查看全部问答>

usb 不能正确的识别

我的usb 不能被电脑识别,且电源的灯也不闪,不知道为什么,请高手们帮忙解决,谢谢…

查看全部问答>

关于动态卸载键盘过滤驱动

一个键盘过滤驱动支持动态卸载: // 原作者 : sinister VOID KeyDriverUnload( PDRIVER_OBJECT KeyDriver ) { PDEVICE_OBJECT KeyFilterDevice ;      PDEVICE_OBJECT KeyDevice ; PDEVICE_EXTENSION KeyExtension; P ...…

查看全部问答>

急,重开一帖,讨论wince是否能支持512M内存问题?????

重开一帖方便大家讨论,我用的是s3c6410,arm11的核,可以支持2Gbit即512M内存,以前是128M的,完全可以使用,现在改成512M(没办法,要做移动pc之类的东西。。。),使用两个bank: bank0: 0x50000000 - 0x60000000 bank1: 0x60000000 - 0x7000000 ...…

查看全部问答>

pppoe上网问题

请问如何实现在CE下PPPOE拨号上网 我在PB下添加的PPPOE特征 在CE下的网络设置那可以看到PPPOE的连接 但是不能拨号成功 更别说拨号上网了。 请问各位如何才能成功用PPPOE拨号上网 希望大家提出宝贵意见!!谢谢 我的联系方式: QQ:50224041 ...…

查看全部问答>