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;

第三步、更改中断向量表 (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,

 

STM8L外部中断 为何 死循环 寄存器操作

 

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

 STM8L外部中断 为何 死循环 寄存器操作

STM8L外部中断 为何 死循环 寄存器操作

STM8L外部中断 为何 死循环 寄存器操作

 

 


 

             

   希望可以对 大家有帮助 --------  ForeverLongo

          

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章:

  • 2021-07-13
  • 2021-11-25
  • 2021-07-04
  • 2022-12-23
  • 2021-08-19
  • 2022-12-23
猜你喜欢
  • 2021-10-06
  • 2021-11-16
  • 2022-12-23
  • 2021-10-12
  • 2021-06-17
  • 2021-10-24
  • 2021-11-12
相关资源
相似解决方案