嵌入式学习小组
直播中

李耘蝶

7年用户 156经验值
私信 关注

哪位大神可以详细介绍一下ATtiny2313复位与中断处理吗?

ATtiny2313复位与中断处理

回帖(5)

杨杰

2020-11-18 14:37:21
  AVR有不同的中断源。每个中断和复位在程序空间都有独立的中断向量。所有的中断事件 都有自己的使能位。当使能位置位,且状态寄存器的全局中断使能位 I 也置位时,中断可以发生。
  ATtiny2313 的程序存储区的最低地址缺省为复位向量和中断向量。完整的向量列表请参见P40“中断” 。 列表也决定了不同中断的优先级。向量所在的地址越低,优先级越高。RESET 具有最高的优先级,第二个为 INT0 – 外部中断请求 0。
  任一中断发生时全局中断使能位 I 被清零,从而禁止了所有其他的中断。用户软件可以在 中断程序里置位 I 来实现中断嵌套。此时所有的中断都可以中断当前的中断服务程序。执行 RETI 指令后I 自动置位。
  从根本上说有两种类型的中断。第一种由事件触发并置位中断标志。对于这些中断,程序 计数器跳转到实际的中断向量以执行中断处理程序,同时硬件将清除相应的中断标志。中 断标志也可以通过对其写 ”1” 的方式来清除。当中断发生后,如果相应的中断使能位为 “0”,则中断标志位置位,并一直保持到中断执行,或者被软件清除。类似的,如果全局 中断标志被清零,则所有已发生的中断都不会被执行,直到 I 置位。然后挂起的各个中断 按中断优先级依次执行。
  第二种类型的中断则是只要中断条件满足,就会一直触发。这些中断不需要中断标志。若中断条件在中断使能之前就消失了,中断不会被触发。
  AVR 退出中断后总是回到主程序并至少执行一条指令才可以去执行其他被挂起的中断。要注意的是,进入中断服务程序时状态寄存器不会自动保存,中断返回时也不会自动恢复。这些工作必须由用户通过软件来完成。
  使用CLI 指令来禁止中断时,中断禁止立即生效。没有中断可以在执行CLI 指令后发生,即使它是在执行CLI 指令的同时发生的。下面的例子说明了如何在写EEPROM 时使用这个指令来防止中断发生以避免对EEPROM 内容的可能破坏。
举报

王玉梅

2020-11-18 14:37:36
  汇编代码例程
  in r16, SREG ; 保存SREG
  cli ; 禁止中断
  ***i EECR, EEMWE ; 启动 EEPROM 写操作
  ***i EECR, EEWE
  out SREG, r16 ; 恢复SREG (I 位)
  C 代码例程
  char cSREG;
  cSREG = SREG; /* 保存SREG */
  /* 禁止中断*/
  _CLI();
  EECR |= (1《《EEMWE); /* 启动 EEPROM 写操作*/
  EECR |= (1《《EEWE);
  SREG = cSREG; /* 恢复SREG (I 位) */
  使用SEI 指令使能中断时,紧跟其后的第一条指令在执行任何中断之前一定会首先得到执行。
举报

张帆

2020-11-18 14:37:47
  汇编代码例程
  sei ; 置位全局中断使能标志
  sleep ; 进入休眠模式,等待中断发生
  ; 注意: 在执行任何被挂起的中断之前MCU 将首先进入休眠模式
举报

韩禹

2020-11-18 14:38:00
  C 代码例程
  _SEI(); /* 置位全局中断使能标志*/
  _SLEEP(); /* 进入休眠模式,等待中断发生*/
  /* 注意: 在执行任何被挂起的中断之前MCU 将首先进入休眠模式*/
举报

更多回帖

发帖
×
20
完善资料,
赚取积分