历史上的今天
返回首页

历史上的今天

今天是:2024年12月27日(星期五)

正在发生

2018年12月27日 | STM32 关于外部中断线、中断源和中断服务函数的问题

2018-12-27 来源:eefocus

中断线问题:



上图可以看出,PA0、PB0...PG0共用的EXTI0中断线,PA1、PB2...PG1共用的EXTI1中断线,也就是 编程里面的(如下图库文件),对应16个中断线,后面三个是专用的中断线,不做讨论。



有人要问,假设:我设置的引脚是PB9和PE9都开启外部中断怎么办?小编告诉你,这还真办不了,我实测过。配置函数的时候后覆盖之前的函数的(如下图所示)



如果这样配置的话,会出现出货光电1的初始化覆盖掉编码盘的初始化,说白了就是编码盘的设置被覆盖掉了,结果是外部中断  出货光电1管脚会触发而编码盘就不起作用了,这也是STM32其中一个问题所在吧! 反过来,结果是外部中断  编码盘 管脚会触发 而 出货光电1管脚就不起作用了!


中断源问题:


  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0); //设置GPIOX中断源以及哪个中断脚

  EXTI_InitStructure.EXTI_Line = EXTI_Line0;//中断线

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//设置为外部中断模式

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿触发

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能

  EXTI_Init(&EXTI_InitStructure);//配置使能

中断服务函数:


 简单的配置:


void EXTI15_10_IRQHandler(void)//中断服务函数,如果中断线是10-15。

{

if(EXTI_GetITStatus(EXTI_Line10) != RESET) 

{

Beep_ON;SOFT_DELAY; Beep_OFF;

EXTI_ClearITPendingBit(EXTI_Line10);     

}  


if(EXTI_GetITStatus(EXTI_Line11) != RESET) 

{

Beep_ON;SOFT_DELAY; Beep_OFF;

EXTI_ClearITPendingBit(EXTI_Line11);     

}  


if(EXTI_GetITStatus(EXTI_Line12) != RESET) 

{

Beep_ON;SOFT_DELAY;Beep_OFF;

EXTI_ClearITPendingBit(EXTI_Line12);     

}  

 

void EXTI9_5_IRQHandler(void)//中断服务函数,如果中断线是5-9。

{

if(EXTI_GetITStatus(EXTI_Line5) != RESET) 

{

Beep_ON;SOFT_DELAY; Beep_OFF;

EXTI_ClearITPendingBit(EXTI_Line5);     

}  


if(EXTI_GetITStatus(EXTI_Line8) != RESET) 

{

Beep_ON;SOFT_DELAY; Beep_OFF;

EXTI_ClearITPendingBit(EXTI_Line8);     

}  


if(EXTI_GetITStatus(EXTI_Line9) != RESET) 

{

Beep_ON;SOFT_DELAY;Beep_OFF;

EXTI_ClearITPendingBit(EXTI_Line9);     

}  

 

每个中断服务函数代表一个或者一类,上面的代码说明:只要是中断线在EXTI_Line   10-15 的,中断服务函数就只有一个,但是由于中断线只有唯一性,可以在中断服务函数里面判断到底是哪个中断线触发,这也保证不会误触发或者是占线的一系列的问题。


如上图,外部中断分为几类:如下:


  DCD     EXTI0_IRQHandler           ; EXTI Line 0//只是管脚的中断服务函数,还有串口等等中断服务函数

  DCD     EXTI1_IRQHandler           ; EXTI Line 1             

  DCD     EXTI2_IRQHandler           ; EXTI Line 2

  DCD     EXTI3_IRQHandler           ; EXTI Line 3

  DCD     EXTI4_IRQHandler           ; EXTI Line 4

  DCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5

  DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10


所以在配置外部中断服务函数或者其他中断服务函数的问题时,参照:库启动件 startup_stm32f10x_hd.s


推荐阅读

史海拾趣

Amveco Toroidal Power Products公司的发展小趣事

为了进一步扩大市场份额,Amveco公司积极寻求与行业内外的合作伙伴建立战略合作关系。公司与多家知名的电子设备制造商建立了长期稳定的合作关系,为其提供定制化的环形变压器解决方案。此外,公司还通过参加国际电子展会、建立海外销售网络等方式,积极开拓国际市场,实现了业务的全球化布局。

ept Connectors公司的发展小趣事

进入上世纪80年代,EPT Connectors公司迎来了一次重要的技术突破。公司成功推出了DIN 41612连接器,这一产品凭借其高性能和可靠性迅速在市场上获得了认可。随后,EPT又相继推出了PC/104和PC/104-Plus、Hm2.0、AdvancedTCA和MicroTCA等产品组,进一步巩固了其在连接器领域的领先地位。这些产品的推出不仅提升了EPT的品牌影响力,也为公司带来了可观的收益。

FTDI [Future Technology Devices International Ltd.]公司的发展小趣事

FTDI的创立可以追溯到1992年3月13日,由弗雷德·达特(Fred Dart)领导创建。初期,公司专注于为个人电脑市场提供服务,特别是针对主板芯片组的解决方案。FTDI的首发产品就得到了IBM等知名企业的青睐,这些芯片被成功应用于AMBRA和PS/2系列个人电脑中,为当时快速发展的计算机技术贡献了重要力量。这一早期成功奠定了FTDI在电子行业中稳固的基础。

Achronix Semiconductor Corporation公司的发展小趣事

FTDI的创立可以追溯到1992年3月13日,由弗雷德·达特(Fred Dart)领导创建。初期,公司专注于为个人电脑市场提供服务,特别是针对主板芯片组的解决方案。FTDI的首发产品就得到了IBM等知名企业的青睐,这些芯片被成功应用于AMBRA和PS/2系列个人电脑中,为当时快速发展的计算机技术贡献了重要力量。这一早期成功奠定了FTDI在电子行业中稳固的基础。

AEC Design公司的发展小趣事
在初步获得市场认可后,AEC Design公司开始积极拓展国内外市场。通过与各大电商平台和实体零售商建立合作关系,公司的产品线逐渐覆盖更广泛的消费群体。同时,公司还积极参加各类行业展会和论坛,与业界同行交流学习,不断提升自身的品牌影响力和市场竞争力。
Acme Electric Corporation公司的发展小趣事
在初步获得市场认可后,AEC Design公司开始积极拓展国内外市场。通过与各大电商平台和实体零售商建立合作关系,公司的产品线逐渐覆盖更广泛的消费群体。同时,公司还积极参加各类行业展会和论坛,与业界同行交流学习,不断提升自身的品牌影响力和市场竞争力。

问答坊 | AI 解惑

电感设计软件

电感设计软件,从别处下载的.…

查看全部问答>

一篇关于SDRAM不错的文章

一篇关于SDRAM不错的文章…

查看全部问答>

紧急求助:DM9000网卡程序异常?

我在2440上移植了DM9000A的网卡,系统运行后能够被PING通。可是一运行IE就报如下错误: Data Abort: Thread=97d9aab4 Proc=81d96340 \'device.exe\' AKY=ffffffff PC=02b52178(dm9isa.dll+0x00002178) RA=02b52174(dm9isa.dll+0x00002174) BVA=06 ...…

查看全部问答>

高分! 在51里的串口接收中如何加入超时处理?

我现在需要用到2051接收来自PC的数据(长度不定,但长度信息是在接收的第一个字节里),打算用方式1,定时器2,串口超时了就表示接收已经完成,现在问题是:如何实现串口的超时处理? 是用另外一个定时器?还是在等待RI的过程中DJNZ某数以实现计时 ...…

查看全部问答>

arm-linux平台上摄像头 quick capture interface的中断问题

我需要在pxa271平台上通过quick capture interface来获取摄像头图像,程序是从别的操作系统移植过来的,所以CIF寄存器初始化设置的逻辑应该没有问题,现在的问题是只要我设置了Start of Frame的中断,即 CICR0置位 ~(CICR0_SOFM), 再enable CIF接 ...…

查看全部问答>

怎么设置IP呀 ?

我是菜鸟, 我想知道怎么在WinCE里面设置IP. 察了半天都说修改注册表. 可我连注册表都打不开呀. 我是用 VS2003做得开发.我想在程序里面进行修改. 高手能否提供一个修改注册表得函数, 或者API之类得, 感激不尽啊!!!!…

查看全部问答>

用8962的GPIO采集单总线数据不成功

  源例程,寻求帮助!!!谢谢     GPIO管脚能否配置采样速率? [ 本帖最后由 bjmonsoon 于 2011-1-13 19:35 编辑 ]…

查看全部问答>

关于PB5.0查看函数源码的问题

       我在PB5.0下要修改代码,但是有的函数在其他文件里(例如在根目录下),我想看一下某个函数的实现体,我在函数上点击右键选择Go To Definition of \"函数名\", 但是出现对话框说要去project中的setting中设置, 我 ...…

查看全部问答>