当前位置:首页 > 单片机 > 单片机
[导读]STM8L系列单片机是ST公司推出的低功耗单片机,与STM8S系列相比功耗降低了很多,但内部结构也删减了很多,使用时一定要仔细阅读手册。这是第一次使用STM8,实现功能不是很复杂就没想研究库函数,准备直接控制寄存器操作

STM8L系列单片机是ST公司推出的低功耗单片机,与STM8S系列相比功耗降低了很多,但内部结构也删减了很多,使用时一定要仔细阅读手册。这是第一次使用STM8,实现功能不是很复杂就没想研究库函数,准备直接控制寄存器操作,没想到本人因为中断问题纠结了大半天。

在外部中断中这一点很不同,STM8S自动清除外部中断,而STM8L是需要软件清除,清除标志位的寄存器根据设置而不同,下面有说明。

下面以STM8L外部中断PB1为例说明外部中断寄存器操作

设置外部中断有下面几步:

第一步、设置IO口为中断输入通过设置(PB_DDR |= 0X00;PB_CR1 |= 0X02;PB_CR2 |= 0X02;)

第二步、设置中断触发方式(00: Falling edge and low level;01: Rising edge only;10: Falling edge only;11: Rising and falling edge)

第三步、更改中断向量表(stm8_interrupt_vector.c文件中)

第四步、编写中断处理函数,记住在函数里面清除中断


第一步、设置IO口为中断输入

PB_DDR |= 0X00; //输入

 PB_CR1 |= 0X02; // 0000_0010

 PB_CR2 |= 0X02; // 0000_0010 CR1与CR2结合确定为上拉外部中断输入

第二步、设置中断触发方式STM8L中PB与PD端口比较特殊可以有两种触发模式

 EXTI_CONF= 0x00;

这两种触发模式通过寄存器EXTI_CONF进行设置

第一种方式与A,C port一样通过下面两个寄存器设置触发模式设置寄存器EXTI_CONF[0]为0,表示Port B[3:0]使用第一种方式(我在此命名为普通方式)

  EXTI_CR1寄存器设置Port A, B, C and/or D external interrupts 的3、2、1、0引脚

  EXTI_CR2寄存器设置Port A, B, C and/or D external interrupts 的7、6、5、4引脚

第二种方式通过EXTI_CR3寄存器设置触发模式EXTI_CONF[0]为1,表示Port B[3:0]使用第二种方式(我在此命名为特殊方式)

  EXTI_CR3寄存器的[3:2]位设置端口D的触发模式

  EXTI_CR3寄存器的[1:0]位设置端口B的触发模式

第三步、更改中断向量表

  {0x82, KEY_Interrupt}, /* irq9 */

  PB1普通模式中断向量号为9,其中KEY_Interrupt可以根据实际命名,只要和后面写的中断函数名一致就可以。

  为什么选择为9看下面的图片就知道了。

第四步、编写中断处理函数

  @far @interrupt void KEY_Interrupt(void)
  {
    LED1 = !LED1;
    //EXTI_SR2 = 0x01; //如果设置为特殊模式通过此寄存器清除中断标志位
    EXTI_SR1 |=0x02; //如果设置为普通模式通过此寄存器清除中断标志位

  }

在这一步骤中有两点说明:

1、如果中断执行函数不想在stm8_interrupt_vector.c文件中编写,需要在stm8_interrupt_vector.c 文件中添加这样一个函数

  @far @interrupt void KEY_Interrupt(void);

2、EXTI_SR2 = 0x01; //如果设置为特殊模式通过此寄存器清除中断标志位
  EXTI_SR1 |=0x02; //如果设置为普通模式通过此寄存器清除中断标志位


中断向量等级:

通过下面的第一个表格可以知道如果我们用普通中断模式端口B1的中断属于EXTI1(如果是PB2属于EXTI2),特殊模式端口B的中断属于EXTIB and EXTID,

知道这点后我们结合手册中的中断向量表就知道我们应该在哪个位置写中断入口函数名了。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

我们本希望循环5次,然后结束,但是实际情况是陷入了死循环。这种错误在实际开发中,还比较难发现。其原因在于i的类型,无符号整型是永远不小于0的。我们需要将i的类型改为有符号型。

关键字: 死循环 C 语言 空循环

MCS-51单片机有两个外部中断源INT0和INT1,它们分别在P3.2和P3.3引脚出现低电平或下降沿信号时向单片机发出中断请求。外部中断可用于检测单片机外部发生的事件,如键盘敲击和特定脉冲发生的次数等。

关键字: 51单片机 外部中断

外部中断是单片机实时地处理外部事件的一种机制。具体指的是,当某种外部事件发生时,单片机的中断系统迫使CPU暂停正在执行的程序,转而去进行中断事件的处理;中断处理完毕后,又返回被中断的程序处,继续执行下去。这里我们以Nuc...

关键字: MCU 外部中断 ST

STM32CubeMX是官方推荐的配置软件,而HAL库也是取代之前的库函数的通用库,所以STM32CubeMX+HAL库是当前主流的工程创建方式,HAL库的可移植性也高于被取代的库函数。 之前在[程序员小哈]的公众号中写...

关键字: LED 外部中断

1.ARM中一些常见英文缩写解释 MSB:最高有效位; LSB:最低有效位; AHB:先进的高性能总线; VPB:连接片内外设功能的VLSI外设总线; EMC:外部存储器控制器; MAM:存储器加速模块; VIC:向量中...

关键字: ARM THUMB I2C 外部中断

/********************************文件所用资源1.外部中断0、1 定时中断0、1 串口中断2.端口:P3.0,P3.1,P3.3,P3.4,P3.5********************...

关键字: c51程序 串口中断 外部中断 定时中断

#include #include #include int main(void){MCUCR |= (1

关键字: AVR gcc编程 单片机 外部中断

刚拿到探索套件,还以为MCU直接测量电流啊,原来是通过电压间接测量的。当JP1处于ON的位置,能够提供IDD测量电路测量;JP1处于OFF位置,测量装置被旁路;当JP1跳线帽被拔出,可以使用万用表测量管脚1和2的电流。测...

关键字: stm8l 测量电流 idd

因为没有中断的清除标志位,这一点与其它单片机是不同的。EXTI_CR1 触发边沿的设置要在总中断没开时才能写入!PD7 是 不可屏蔽的最高优先级的硬件中断(TLI)设置顺序:最好先关中断 设置边沿 开启引脚 最后开总中断...

关键字: stm8s 外部中断

以下总结参考原子STM32开发指南STM32F103 的中断控制器支持 19 个外部中断/事件请求。STM32F103 的19 个外部中断为:线 0~15:对应外部 IO 口的输入中断。线 16:连接到 PVD 输出。线...

关键字: STM32 外部中断
关闭
关闭