durongze 发表于 2024-5-5 01:06:29

【官网例子分析系列】例子06--中断


注意事项:
       1.对于基本的IO相关概念可以看 前5集。

--------------------------------------------------------------------------------------
概念介绍:

IE中断使能寄存器
    EA:总中断允许控制位。EA 的作用是使中断允许形成多级控制。即各中断源首先受 EA 控制;其次还受各中断源自己的中断允许控制位控制。
      0:CPU 屏蔽所有的中断申请
      1:CPU 开放中断
    ELVD:低压检测中断允许位。
      0:禁止低压检测中断
      1:允许低压检测中断
    EADC:A/D 转换中断允许位。
      0:禁止 A/D 转换中断
      1:允许 A/D 转换中断
    ESn:串行口 n 中断允许位。
      0:禁止串行口 1 中断
      1:允许串行口 1 中断
    ETn:定时/计数器 Tn 的溢出中断允许位。
      0:禁止 T1 中断
      1:允许 T1 中断
    EXn:外部中断 n 中断允许位。
      0:禁止 INT1 中断
      1:允许 INT1 中断

IE2中断使能寄存器
    EUSB:USB 中断允许位。
      0:禁止 USB 中断
      1:允许 USB 中断
    ESPI:SPI 中断允许位。
      0:禁止 SPI 中断
      1:允许 SPI 中断
    ESn:串行口 n 中断允许位。
      0:禁止串行口 1 中断
      1:允许串行口 1 中断
    ETn:定时/计数器 Tn 的溢出中断允许位。
      0:禁止 T1 中断
      1:允许 T1 中断

TCON定时器控制寄存器
    TFn:定时器n溢出中断标志。中断服务程序中,硬件自动清零。
    IEn:外部中断n中断请求标志。中断服务程序中,硬件自动清零。
    TRn:
    ITn:

IP中断优先级控制寄存器
    PLVD:低压检测中断优先级控制位
      00:LVD 中断优先级为 0 级(最低级) 01:LVD 中断优先级为 1 级(较低级)
      10:LVD 中断优先级为 2 级(较高级) 11:LVD 中断优先级为 3 级(最高级)
    PADC: 中断优先级控制位
      00:ADC 中断优先级为 0 级(最低级) 01:ADC 中断优先级为 1 级(较低级)
      10:ADC 中断优先级为 2 级(较高级) 11:ADC 中断优先级为 3 级(最高级)
    PSn:串口n中断优先级控制位
      00:串口n 中断优先级为 0 级(最低级) 01:串口n 中断优先级为 1 级(较低级)
      10:串口n 中断优先级为 2 级(较高级) 11:串口n 中断优先级为 3 级(最高级)
    PTn:定时器1中断优先级控制位
      00:定时器n 中断优先级为 0 级(最低级) 01:定时器n 中断优先级为 1 级(较低级)
      10:定时器n 中断优先级为 2 级(较高级) 11:定时器n 中断优先级为 3 级(最高级)
    PXn:外部中断1中断优先级控制位
      00:INTn 中断优先级为 0 级(最低级) 01:INTn 中断优先级为 1 级(较低级)
      10:INTn 中断优先级为 2 级(较高级) 11:INTn 中断优先级为 3 级(最高级)

IP2中断优先级控制寄存器
    PSPI:SPI中断优先级控制位
      00:SPI 中断优先级为 0 级(最低级) 01:SPI 中断优先级为 1 级(较低级)
      10:SPI 中断优先级为 2 级(较高级) 11:SPI 中断优先级为 3 级(最高级)
    PPWMn:高级PWMn中断优先级控制位
      00:高级 PWMn 中断优先级为 0 级(最低级) 01:高级 PWMn 中断优先级为 1 级(较低级)
      10:高级 PWMn 中断优先级为 2 级(较高级) 11:高级 PWMn 中断优先级为 3 级(最高级)
    PCMP:比较器中断优先级控制位
      00:CMP 中断优先级为 0 级(最低级) 01:CMP 中断优先级为 1 级(较低级)
      10:CMP 中断优先级为 2 级(较高级) 11:CMP 中断优先级为 3 级(最高级)
    PI2C:I2C中断优先级控制位
      00:I2C 中断优先级为 0 级(最低级) 01:I2C 中断优先级为 1 级(较低级)
      10:I2C 中断优先级为 2 级(较高级) 11:I2C 中断优先级为 3 级(最高级)
    PUSB:USB中断优先级控制位
      00:USB 中断优先级为 0 级(最低级) 01:USB 中断优先级为 1 级(较低级)
      10:USB 中断优先级为 2 级(较高级) 11:USB 中断优先级为 3 级(最高级)

IP3中断优先级控制寄存器
    PRTC:RTC中断优先级控制位
      00:RTC 中断优先级为 0 级(最低级) 01:RTC 中断优先级为 1 级(较低级)
      10:RTC 中断优先级为 2 级(较高级) 11:RTC 中断优先级为 3 级(最高级)
    PI2S:I2S中断优先级控制位
      00:I2S 中断优先级为 0 级(最低级) 01:I2S 中断优先级为 1 级(较低级)
      10:I2S 中断优先级为 2 级(较高级) 11:I2S 中断优先级为 3 级(最高级)

ET0 : 中断相关寄存器 --> IE(中断允许寄存器)         --> ET0
PT0 : 中断相关寄存器 --> IP(中断优先级控制寄存器) --> PT0
TMOD: 特殊功能寄存器列表 --> TMOD(定时器模式寄存器)--> GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0
T0_CT: 定时器 0/1 模式寄存器(TMOD)--> T0_CT
T0CLKO: 特殊功能寄存器列表 --> INTCLKO(中断与时钟输出控制寄存器)--> T0CLKO (定时器 0时钟分频输出)
T0x12: 定时器的相关寄存器 --> AUXR(辅助寄存器1)-->T0x12
    T0x12:定时器0速度控制位
      0:12T 模式,即 CPU 时钟 12 分频( FOSC/12 FOSC/12 FOSC/12)
      1:1T 模式,即 CPU 时钟不分频( FOSC/1 FOSC/1 )

TH0: 定时器的相关寄存器 --> TH0(定时器 0高 8位寄存器)
TL0: 定时器的相关寄存器 --> TL0(定时器 0低 8位寄存器)

---------------------------------------------------------------------------------------
例子分析:

    WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1; //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度

    P0M1 = 0x30;   P0M0 = 0x30;   //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
    P1M1 = 0x30;   P1M0 = 0x30;   //设置P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V)
    P2M1 = 0x3c;   P2M0 = 0x3c;   //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V)
    P3M1 = 0x50;   P3M0 = 0x50;   //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
    P4M1 = 0x3c;   P4M0 = 0x3c;   //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
    P5M1 = 0x0c;   P5M0 = 0x0c;   //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
    P6M1 = 0xff;   P6M0 = 0xff;   //设置为漏极开路(实验箱加了上拉电阻到3.3V)
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

    display_index = 0;
    for(i=0; i<8; i++)LED8 = DIS_BLACK;    //全部消隐
   
    INT0_cnt = 0;
    INT1_cnt = 0;

    /*
    TCON定时器控制寄存器
      TFn:定时器n溢出中断标志。中断服务程序中,硬件自动清零。
      IEn:外部中断n中断请求标志。中断服务程序中,硬件自动清零。
      TRn:
      ITn:
    */
    IE1= 0;   //外中断1标志位         见TCON定时器控制寄存器
    IE0= 0;   //外中断0标志位
    EX1 = 1;    //INT1 Enable
    EX0 = 1;    //INT0 Enable

    IT0 = 1;    //INT0 下降沿中断       见TCON定时器控制寄存器
//IT0 = 0;    //INT0 上升,下降沿中断
    IT1 = 1;    //INT1 下降沿中断      
//IT1 = 0;    //INT1 上升,下降沿中断

    //INT2, INT3, INT4 实验板上没有引出测试按键,供需要时参考使用
    /*IE中断使能寄存器
    ESn:串行口 n 中断允许位。
      0:禁止串行口 1 中断
      1:允许串行口 1 中断
    ETn:定时/计数器 Tn 的溢出中断允许位。
      0:禁止 T1 中断
      1:允许 T1 中断
    EXn:外部中断 n 中断允许位。
      0:禁止 INT1 中断
      1:允许 INT1 中断 */
    EX2 = 1;    //使能 INT2 下降沿中断见IE中断使能寄存器
    EX3 = 1;    //使能 INT3 下降沿中断
    EX4 = 1;    //使能 INT4 下降沿中断

    EA = 1;   //允许总中断

    while(1)
    {
      delay_ms(1);    //延时1ms
      DisplayScan();
    }


durongze 发表于 2024-5-5 01:32:33

文档里对 TCON 定时器控制寄存器 的说明不全, TRn和ITn没有说明。

    TFn:定时器n溢出中断标志。中断服务程序中,硬件自动清零。
    IEn:外部中断n中断请求标志。中断服务程序中,硬件自动清零。
    TRn:
    ITn:

liuzonggong 发表于 2024-11-30 22:09:51

这个使能做得好
页: [1]
查看完整版本: 【官网例子分析系列】例子06--中断