Zigbee-I/O中断(二)


一.中断易忘点

1.中断请求

当外部设备就绪时会产生一个中断请求信号加到CPU的中断请求输入端,即对CPU提出中断请求。对于中断请求信号,需注意两个问题:

a)有效的中断请求电平保持到被cpu发现;

b)当cpu响应请求后应当有效的请求电平去掉;

2. 中断响应

​ CPU在每条指令执行的最后一个时钟周期监测中断请求输入管脚有无请求发生, 而后决定是否对它做出响应。

3. 中断图

image-20210329193102894

4. 中断优先级

image-20210329195117552

二. I/O中断

IO中断总结图

1. 注解

从右到左看(P0口为例)

  1. P0IE: 8个P0口的总中断 P0可以位寻址, P1,P2不可以

    P0IF: P0的总的中断标志位 位寻址

    EA: 所有I/O口的总中断 位寻址

    P0IEN: 8个P0口的各个中断 字节地址

    P0IFG: P0的每个的中断标志位 字节地址

    PICTL: 触发方式

  2. 上图是关于P0的配置, P1,P2与P0有所不同, 在于:

    1. 组中断, 端口中断标志位P0位寻址, P1,P2字节寻址
    2. 各个寄存器的名称不一样, 可以根据名称依次寻找手册
    3. 注意P2五位的中断, 有三位不一样

2.中断初始化

-------------------------------------
#设置I/O口方式
    P0SEL &= ~(1<<1);
-------------------------------------
#清除标志位 (不可交换)
    P0SEL &= ~(1<<1);
    P0IF = 0;
-------------------------------------
#开中断
    P0IEN|=1<<1;
      P0IE=1; 
      PICTL|=1;
#合上总开关(这一步也可以放在其他的地方)
    EA=1;     
-------------------------------------

3. 中断函数

#pragma vector=P0INT_VECTOR//指定中断向量
__interrupt void P0_ISR(void)
{
    if(P0IFG&(1<<1))
    {
          # delay(10);//中断, 不需要延时去抖
         if(P0_1==0)//按键是否确定被按下
            P1_0=0;//点亮灯
        delay(800)//保持点亮一段时间

          P0IFG&=~(1<<1);//中断标志不能自动清除,必须由手工清除                                    
          P0IF=0;//
    }
}

###########################################
# 1. interrupt前是两下滑线
# 2. 中断不需要消抖
# 3. 中断标志不能自动清除,必须由手工清除
###########################################

待补充…..


文章作者: 梵星
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 梵星 !
  目录