历史上的今天
返回首页

历史上的今天

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

2019年09月17日 | STML8的中断使用小结

2019-09-17 来源:eefocus

STM8L的中断,有两种模式,分别为Pin模式和Port模式,也就是所谓线中断和端口中断。 


简而言之,线中断是指所有寄存器组的同一管脚Pin的中断都使用同一中断号, 端口中断是指同一个或多个寄存器组的所有管径Pin的中断使用同一中断号。 


举例而言 

所有Port A/B/C/D/E的Pin1的中断都是EXTI1, 

Port B 和Port G的所有Pin的中断都是EXTIB/G


实现方面,因为关联寄存器很多,直接操作比较太繁琐,容易出错。 

比较好的选择是利用ST的库函数,代码清晰,易于维护,可以参照以下步骤. 简而言之,线中断比较简单,需要依次调用:


 1. GPIO_Init()                       端口初始化、上拉输入、浮空输入皆可

 2. EXTI_SetPinSensitivity()          触发方式设定

 3. enableInterrupts()                开中断


端口中断复杂一些,需要依次调用(缺一不可):


 1. GPIO_Init()                   端口初始化、上拉输入、浮空输入皆可

 2. EXTI_SetPortSensitivity()     触发方式设定

 3. EXTI_SelectPort()             选择触发端口

 4. EXTI_SetHalfPortSelection()   选择端口高字节或低字节

 3. enableInterrupts()            开中断


此外,设定中断优先级,两者皆用ITC_SetSoftwarePriority()函数, 

在中断处理中,中断状态的清理也都使用EXTI_ClearITPendingBit()函数。


需要注意的是,


两种中断模式下,函数名类似,但参数类型定义并不一致,容易混淆,需要注意检查


比如: 

EXTI_SetPinSensitivity的参数为EXTI_Pin_TypeDef,如EXTI_Pin_7 

EXTI_SetPortSensitivity的参数为EXTI_Port, 如EXTI_Port_G


ITC_SetSoftwarePriority()和EXTI_ClearITPendingBit()函数中 

如果是端口中断模式,要使用EXTIB_G_IRQn等代表端口的参数,而非GPIO的管脚号


根据MCU型号不同,不是所有的GPIO都能同时支持线中断和端口中断 

比如STM8L052R8,其PG管脚只支持端口中断,使用前一定要查看手册。以下摘自STM8L手册: 

● EXTIB/G - 8 lines on Port B or G: PB[7:0] or PG[7:0] 

● EXTID/H - 8 lines on Port D or H: PD[7:0] or PH[7:0] 

● EXTIE/F - 8 lines on Port E or F: PE[7:0] or PF[7:0] 

● EXTI0 - 6 lines on Port A/B/C/D/E/F, bit 0: Px[0] 

● EXTI1 - 5 lines on Port A/B/C/D/E, bit 1: Px[1] 

● EXTI2 - 5 lines on Port A/B/C/D/E, bit 2: Px[2] 

● EXTI3 - 5 lines on Port A/B/C/D/E, bit 3: Px[3] 

● EXTI4 - 5 lines on Port A/B/C/D/E, bit 4: Px[4] 

● EXTI5 - 5 lines on Port A/B/C/D/E, bit 5: Px[5] 

● EXTI6 - 5 lines on Port A/B/C/D/E, bit 6: Px[6] 

● EXTI7 - 5 lines on Port A/B/C/D/E, bit 7: Px[7]


线中断初始化:


    GPIO_DeInit(GPIOC);  //PC0

    GPIO_Init(GPIOC, GPIO_Pin_0, GPIO_Mode_In_PU_IT); // 上拉中断输入

    EXTI_SetPinSensitivity(EXTI_Pin_0, EXTI_Trigger_Falling); // 下降沿触发

    ITC_SetSoftwarePriority(EXTI0_IRQn, ITC_PriorityLevel_2); // 软件优先级2


线中断的中断处理:


INTERRUPT_HANDLER(EXTI0_IRQHandler, 8)

{

    EXTI_ClearITPendingBit(EXTI_IT_Pin0); // 清中断

    val = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0);

    if( val == RESET ) {

        // 你的处理

    }

}


端口中断的初始化:


// GPIO初始化 (PG5)

GPIO_DeInit(GPIOG);

GPIO_Init(GPIOG, GPIO_Pin_5, GPIO_Mode_In_PU_IT);           // 上拉输入带中断


disableInterrupts();


EXTI_DeInit();

EXTI_SetPortSensitivity(EXTI_Port_G, EXTI_Trigger_Rising); // 上升沿触发

EXTI_SelectPort(EXTI_Port_G);                              // PG端口选择

EXTI_SetHalfPortSelection(EXTI_HalfPort_G_MSB ,ENABLE);    // 允许PG的[4:7]pin触发

EXTI_SetHalfPortSelection(EXTI_HalfPort_G_LSB ,DISABLE);   // 禁止PG的[0:3]pin触发

ITC_SetSoftwarePriority(EXTIB_G_IRQn, ITC_PriorityLevel_1);// 设定优先级


enableInterrupts();                                        // 开中断


端口中断的中断处理:


INTERRUPT_HANDLER(EXTIB_G_IRQHandler, 6)

{

  /* In order to detect unexpected events during development,

     it is recommended to set a breakpoint on the following instruction.

  */

    // 清PG中断状态

    EXTI_ClearITPendingBit(EXTI_IT_PortG);

    val = GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_5);

    if( val ) {

        count++; // 你的处理

    }

}


最后,ST官方的代码注释是最好的说明:


To use a GPIO pin as an interrupt source, follow theses steps:


     1. Configure the GPIO pin in input mode with interrupt enabled using

        GPIO_Init()


     2. Configure the GPIO pin sensitivity (falling, rising...) using 

        EXTI_SetPinSensitivity()


     3. Enable global interrupts using enableInterrupts()


     4. In the IRQ handler corresponding to the GPIO pin, clear the interrupt

        pending bit using EXTI_ClearITPendingBit()


   To use a GPIO port as an interrupt source, follows theses steps:  


     1. Configure the GPIO pins of the same port in input mode with interrupt

        enabled using GPIO_Init()


     2. Configure the GPIO port sensitivity (falling, rising...) using 

        EXTI_SetPortSensitivity()


     3. Select the GPIO port and the corresponding half port using  

        EXTI_SelectPort() then EXTI_SetHalfPortSelection()


     4. Enable global interrupts using enableInterrupts()


     5. In the IRQ handler corresponding to the GPIO port, clear the interrupt

        pending bit using EXTI_ClearITPendingBit()


推荐阅读

史海拾趣

DSP Group Inc公司的发展小趣事

在智能语音领域,DSP Group凭借其深厚的技术积累和创新能力,取得了显著的突破。公司推出了一系列智能语音处理技术和产品,如SmartVoice系列语音处理芯片和算法套件等。这些技术和产品不仅为用户提供了更加自然、智能的语音交互体验,还为智能家居、汽车电子等领域的发展提供了有力支持。

捷嘉电子(Chequers Electronic)公司的发展小趣事

随着公司规模的扩大,捷嘉电子开始着手整合产业链资源,以提升整体竞争力。公司通过与上游供应商建立长期稳定的合作关系,确保了原材料的质量和稳定供应;同时,通过加强与下游客户的沟通与协作,实现了产品的定制化服务和快速响应市场需求。这些举措不仅提高了捷嘉电子的运营效率,也进一步巩固了其在市场上的地位。

DEVCON公司的发展小趣事

在竞争激烈的电子行业中,提供优质的服务是赢得客户信任的关键。DEVCON公司深知这一点,因此不断创新服务模式,提升服务质量。公司建立了完善的售后服务体系,为客户提供及时、专业的技术支持和解决方案。同时,公司还积极开展培训活动,提升员工的技能水平和服务意识。这些创新举措赢得了客户的广泛赞誉和信赖,为DEVCON公司的稳定发展提供了有力保障。

EG & G Inc公司的发展小趣事

EG & G Inc公司成立于20世纪早期,最初专注于电子设备的研发和生产。公司凭借其技术优势和创新能力,在电子行业中逐渐崭露头角。在成立初期,EG & G Inc就与多家知名企业和研究机构建立了合作关系,共同推动电子技术的发展和应用。这些合作关系不仅为公司带来了技术上的支持,也为其在市场上的扩张奠定了基础。

Gamma Microelectronics ( APM )公司的发展小趣事

2007年10月,G24i在英国建立了DSSC的30MW试产线,这是全球范围内的重要里程碑。这条生产线具备高效的生产能力,能够在不到3小时的时间内制造出长达约800米的太阳能电池,生产速度高达每分钟4米以上。这一成就不仅展示了G24i在规模化生产方面的实力,也为后续的商业化应用奠定了产能基础。尽管初期商业化模组产品的转换效率仅为3%,但G24i通过不断优化生产工艺和降低成本,逐步提升了产品的市场竞争力。

博通集成(BEKEN)公司的发展小趣事

博通集成深知技术创新是企业发展的核心动力。因此,公司始终保持高额的研发投入,不断推动技术创新和产品研发。公司拥有一支专业的研发团队,具备强大的研发实力和创新能力。通过持续的研发投入和技术创新,博通集成在无线连接芯片设计领域取得了显著的成果和进展。

问答坊 | AI 解惑

RFIC和RFID 完全不同吧?

百度的答案,还请大家深入说说: RFIC是RF System 里的Block做成IC ,,基本上成品就是IC ; 而RFID是Radio-frequency identification 是一个系统,有特定的规范。 二者是否有确定的包含与被包含的关系呢?…

查看全部问答>

在Wince上进行快速应用开发(RAD)!!!!

Lazarus是一个类似Delphi的IDE,其语言是Free Pascal,开发方式就是RAD,自从2.2.0 FPC(Free Pascal Compile)开始,就支持WINCE -ARM平台。使用Lazarus开发,界面可以比C#丰富,且更为简单,但是速度会快很多,因为Lazarus生成的是二进制EXE,而 ...…

查看全部问答>

安装CE6的SP1出错toolMsmCA(Error):Setup package issue or CoreCon。。。

安装CE6的SP1是出错 “ToolMsmCA(Error):Setup package issue or CoreCon DataStore corrupted:CDeviceSDKInstallShin Add/Remove failed.HR=0x80004005. 我之前装了VS2005。 这几天才装这个,不知怎么出错,安装进度停在Installing the Gene ...…

查看全部问答>

最牛的无线数传资料

无线数传模组: a.通用数传模组    WAP200B、EM200D、GW200B,最大100mW,64个频道,传输距离800米左右,内置前向纠错,最高速度19200(接口可达115200); b.高灵敏度数传模组   WAP200C、GW200KB,最大20mW,64个频道,传 ...…

查看全部问答>

DDK下重载new/delete的问题

各位,最近在开发一个驱动的时候需要检测内存泄漏,于是自己重载了new/delete,在win32下测了一下没问题,于是决定将其加入到当前的驱动下。可是,问题来了,总是出现LNK2005的错误,我查了一下这个错,应该是连接顺序的问题,出错信息显示在DDK中 ...…

查看全部问答>

急!需要开发条码打印机。不知道如何设计及开发?

市场有一款是uc/os 8 位的代码打印机。 可以接扫描枪,扫入条码,然后按键。打印出一个新条码。 现在想开发这样的东东。谁做过啊? 着急啊。请求指点,合作都可以…

查看全部问答>

STM32现在有没有带总线和USBHOST或者OTG的片子?

                                  …

查看全部问答>

ASM eagle60 W/B BSOB

近来老板搞了点垃圾产品,在生产时用的是BSOB,但第二点不是翘线就是打不上,很多参数都用过了,不知还有哪里没想到的。求教怎样可以使ASM eagle60 W/B 的BSOB达到最佳。…

查看全部问答>

LM4F232系列模块的使用

之前用过MDK4.22版的 反正觉得有点问题,编译的时候 似乎没有错会报错  于是就换成了4.21版本的 附件是一个被压缩的工程包,此工程包过对PWM、定时器、串口、OLED(基于GR_LIB)、按键、LED等模 块的使用。建工程就不说了 相信用keil软件的 ...…

查看全部问答>

如何成为单片机开发高手

单片机适用于电子玩具、工业控制、民用电器、机电一体化产品、航天航海等众多领域,而单片机的应用开发不单是软件的开发,其开发语言和硬件密切相关。所以只有开发者对单片机的内部结构非常了解,才能编好软件。而单片机的开发应用还涉及到硬件扩展 ...…

查看全部问答>