1、中断源
CC2530的CPU有18个中断源,每个中断源都有它自己的位于一系列SFR寄存器中的中断请求标志。每个中断请求都需要中断使能位来使能或禁止,具体定义如下表:
表1
Interrupt Number
中断号 |
Description
描述 |
Interrupt Name
中断名称 |
Interrupt Vector
中断向量 |
Interrupt Mask,CPU
中断屏蔽 |
Interrupt Flag, CPU
中断标志 |
0 |
RF TX FIFO underflow and RX FIFO overflow
射频发送队列空和接收队列溢出 |
RFERR |
03h |
IEN0.RFERRIE |
TCON.RFERRIF (1) |
1 |
ADC end of conversion
ADC转换完成 |
ADC |
0Bh |
IEN0.ADCIE |
TCON.ADCIF (1) |
2 |
USART 0 RX complete
串口0接收完毕 |
URX0 |
13h |
IEN0.URX0IE |
TCON.URX0IF (1) |
3 |
USART 1 RX complete
串口1接收完毕 |
URX1 |
1Bh |
IEN0.URX1IE |
TCON.URX1IF (1) |
4 |
AES encryption/decryption complete
AES加/解密完成 |
ENC |
23h |
IEN0.ENCIE |
S0CON.ENCIF |
5 |
Sleep Timer compare
睡眠定时器比较 |
ST |
2Bh |
IEN0.STIE |
IRCON.STIF |
6 |
Port 2 inputs/USB
端口2输入/USB |
P2INT |
33h |
IEN2.P2IE |
IRCON2.P2IF (2) |
7 |
USART 0 TX complete
串口0发送完毕 |
UTX0 |
3Bh |
IEN2.UTX0IE |
IRCON2.UTX0IF |
8 |
DMA transfer complete
DMA发送完成 |
DMA |
43h |
IEN1.DMAIE |
IRCON.DMAIF |
9 |
Timer 1 (16-bit) capture/compare/overflow
定时器1(16位)捕获/比较/溢出 |
T1 |
4Bh |
IEN1.T1IE |
IRCON.T1IF (1) (2) |
10 |
Timer 2
定时器2(MAC定时器) |
T2 |
53h |
IEN1.T2IE |
IRCON.T2IF (1) (2) |
11 |
Timer 3 (8-bit) compare/overflow
定时器3(8位)比较/溢出 |
T3 |
5Bh |
IEN1.T3IE |
IRCON.T3IF (1) (2) |
12 |
Timer 4 (8-bit) compare/overflow
定时器4(8位)比较/溢出 |
T4 |
63h |
IEN1.T4IE |
IRCON.T4IF (1) (2) |
13 |
Port 0 inputs
端口0输入 |
P0INT |
6Bh |
IEN1.P0IE |
IRCON.P0IF (2) |
14 |
USART 1 TX complete
串口1发送完毕 |
UTX1 |
73h |
IEN2.UTX1IE |
IRCON2.UTX1IF |
15 |
Port 1 inputs
端口1输入 |
P1INT |
7Bh |
IEN2.P1IE |
IRCON2.P1IF (2) |
16 |
RF general interrupts
RF通用中断 |
RF |
83h |
IEN2.RFIE |
S1CON.RFIF (2) |
17 |
Watchdog overflow in timer mode
看门狗计时溢出 |
WDT |
8Bh |
IEN2.WDTIE |
IRCON2.WDTIF |
(1) Hardware-cleared when interrupt service routine is called(当中断服务例程被调用后,硬件清除标志位)
(2) Additioal IRQ mask and IRQ flag bits exist.(附加中断屏蔽和中断标志位存在)
2、中断屏蔽
每个中断通过IEN0、IEN1、IEN2里的相应中断使能位来禁止或启用,具体如下表。
中断使能寄存器(IEN0,IEN1,IEN2)(0:中断禁止 1:中断使能)
表2
端口 |
Bit位 |
名称 |
初始化 |
读/写 |
描述 |
IEN0 |
7 |
EA |
0 |
R/W |
禁止所有中断
0:无中断被确认。
1:通过设置对应的使能位,将每个中断源分别使能或禁止。 |
6 |
– |
0 |
R0 |
不使用,读取为0值 |
5 |
STIE |
0 |
R/W |
睡眠定时器中断使能 |
4 |
ENCIE |
0 |
R/W |
AES加解密中断使能 |
3 |
URX1IE |
0 |
R/W |
串口1接收中断使能 |
2 |
URX0IE |
0 |
R/W |
串口0接收中断使能 |
1 |
ADCIE |
0 |
R/W |
ADC中断使能 |
0 |
RFERRIE |
0 |
R/W |
RF接收/发送队列中断使能 |
IEN1 |
7:6 |
– |
00 |
R0 |
不使用,读取为0值 |
5 |
P0IE |
0 |
R/W |
端口0中断使能 |
4 |
T4IE |
0 |
R/W |
定时器4中断使能 |
3 |
T3IE |
0 |
R/W |
定时器3中断使能 |
2 |
T2IE |
0 |
R/W |
定时器2中断使能 |
1 |
T1IE |
0 |
R/W |
定时器1中断使能 |
0 |
DMAIE |
0 |
R/W |
DMA传输中断使能 |
IEN2 |
7:6 |
– |
00 |
R0 |
不使用,读取为0值 |
5 |
WDTIE |
0 |
R/W |
看门狗中断使能 |
4 |
P1IE |
0 |
R/W |
端口1中断使能 |
3 |
UTX1IE |
0 |
R/W |
串口1中断使能 |
2 |
UTX0IE |
0 |
R/W |
串口0中断使能 |
1 |
P2IE |
0 |
R/W |
端口2中断使能 |
0 |
RFIE |
0 |
R/W |
RF通用中断使能 |
注意某些外部设备会因为若干事件产生中断请求。这些中断请求可以作用在端口0、端口1、端口2、定时器1、定时器2、定时器3、定时器4或者无线上。这些外部设备在相应的寄存器里都有一个内部中断源的中断屏蔽位。
为了启用中断,需要以下步骤:
(1)清除中断标志位(Clear interrupt flags);
(2)如果有,则设置SFR寄存器中对应的各中断使能位;
(3)设置寄存器IEN0、IEN1和IEN2中对应的中断使能位为1;
(4)设置全局中断位IEN0.EA为1;
(5)在该中断对应的向量地址上,运行该中断的服务程序。
下图给出了所有中断源及其相关的控制和状态寄存器的概述图;当中断服务程序被执行后,阴影框的中断标志位将被硬件自动清除;
3、中断处理
当中断发生时,CPU就指向表1所描述的中断向量地址。一旦中断服务开始,就只能够被更高优先级的中断打断。中断服务程序由指令RETI终止,当执行RETI后,CPU将返回到中断发生时的下一条指令。
当中断发生时,不管该中断使能或禁止,CPU都会在中断标志寄存器中设置中断标志位。当中断使能时,首先设置中断标志,然后在下一个指令周期,由硬件强行产生一个LCALL到对应的向量地址,运行中断服务程序。
新中断的响应,取决于该中断发生时CPU的状态。当CPU正在运行的中断服务程序,其优先级大于或等于新的中断时,新的中断暂不运行,直至新的中断的优先级高于正在运行的中断服务程序。中断响应的时间取决于当前的指令,最快的为7个机器指令周期,其中1个机器指令周期用于检测中断,其余6个用来执行LCALL。
中断标志
寄存器 |
Bit位 |
名称 |
初始化 |
读/写 |
描述 |
TCON |
7 |
URX1IF |
0 |
R/W
H0 |
USART 1 RX中断标志。当中断发生时设1,当CPU向量指向中断服务例程时清0。
0:无中断未决
1:中断未决 |
6 |
– |
0 |
R/W |
不使用 |
5 |
ADCIF |
0 |
R/W
H0 |
ADC中断标志。当中断发生时设1,当CPU向量指向中断服务例程时清0。
0:无中断未决
1:中断未决 |
4 |
– |
0 |
R/W |
不使用 |
3 |
URX0IF |
0 |
R/W
H0 |
USART 0 RX中断标志。当中断发生时设1,当CPU向量指向中断服务例程时清0。
0:无中断未决
1:中断未决 |
2 |
IT1 |
1 |
R/W |
保留。必须一直设1。 |
1 |
RFERRIF |
0 |
R/W
H0 |
RF TX/RX FIFO中断标志。当中断发生时设1,当CPU向量指向中断服务例程时清0。
0:无中断未决
1:中断未决 |
0 |
IT0 |
1 |
R/W |
保留。必须一直设1。 |
S0CON |
7:2 |
– |
000000 |
R/W |
不使用 |
1 |
ENCIF_1 |
0 |
R/W |
AES中断。ENC有两个中断标志位,ENCIF_1和ENCIF_0。设置其中一个标志就好请求中断服务。当AES协处理器请求中断时,两个标志都有设置。
0:无中断未决
1:中断未决 |
0 |
ENCIF_0 |
0 |
R/W |
AES中断。ENC有两个中断标志位,ENCIF_1和ENCIF_0。设置其中一个标志就好请求中断服务。当AES协处理器请求中断时,两个标志都有设置。
0:无中断未决
1:中断未决 |
S1CON |
7:2 |
– |
000000 |
R/W |
不使用 |
1 |
RFIF_1 |
0 |
R/W |
RF一般中断。RF有两个中断标志,RFIF_1和RFIF_0,设置其中一个标志就会请求中断服务。当无线电请求中断时两个标志都有设置。
0:无中断未决
1:中断未决 |
0 |
RFIF_0 |
0 |
R/W |
RF一般中断。RF有两个中断标志,RFIF_1和RFIF_0,设置其中一个标志就会请求中断服务。当无线电请求中断时两个标志都有设置。
0:无中断未决
1:中断未决 |
IRCON |
7 |
STIF |
0 |
R/W |
睡眠定时器中断标志位
0:无中断未决
1:中断未决 |
6 |
-- |
0 |
R/W |
必须一直设0。 |
5 |
P0IF |
0 |
R/W |
端口0中断标志
0:无中断未决
1:中断未决 |
4 |
T4IF |
0 |
R/W
H0 |
定时器4中断标志。当中断发生时设1,当CPU向量指向中断服务例程时清0。
0:无中断未决
1:中断未决 |
3 |
T3IF |
0 |
R/W
H0 |
定时器3中断标志。当中断发生时设1,当CPU向量指向中断服务例程时清0。
0:无中断未决
1:中断未决 |
2 |
T2IF |
0 |
R/W
H0 |
定时器2中断标志。当中断发生时设1,当CPU向量指向中断服务例程时清0。
0:无中断未决
1:中断未决 |
1 |
T1IF |
0 |
R/W
H0 |
定时器1中断标志。当中断发生时设1,当CPU向量指向中断服务例程时清0。
0:无中断未决
1:中断未决 |
0 |
DMAIF |
0 |
R/W |
DMA完成中断标志
0:无中断未决
1:中断未决 |
IRCON2 |
7:5 |
– |
000 |
R/W |
不使用 |
4 |
WDTIF |
0 |
R/W |
看门狗定时器中断标志
0:无中断未决
1:中断未决 |
3 |
P1IF |
0 |
R/W |
端口1中断标志
0:无中断未决
1:中断未决 |
2 |
UTX1IF |
0 |
R/W |
USART 1 TX中断标志
0:无中断未决
1:中断未决 |
1 |
UTX0IF |
0 |
R/W |
USART 0 TX中断标志
0:无中断未决
1:中断未决 |
0 |
P2IF |
0 |
R/W |
端口2中断标志
0:无中断未决
1:中断未决 |
4、中断优先级
中断可划分为6个中断优先组,每组的优先级通过设置寄存器IP0和IP1来实现。为了给中断(也就是它所在的中断优先组)赋值优先级,需要设置IP0和IP1的对应位。
表4-1
端口 |
Bit位 |
名称 |
初始化 |
读/写 |
描述 |
IP1 |
7:6 |
-- |
00 |
R/W |
没使用 |
5 |
IP1_IPG5 |
0 |
R/W |
中断第5组,优先级控制位1,参考表4-3 |
4 |
IP1_IPG4 |
0 |
R/W |
中断第4组,优先级控制位1,参考表4-3 |
3 |
IP1_IPG3 |
0 |
R/W |
中断第3组,优先级控制位1,参考表4-3 |
2 |
IP1_IPG2 |
0 |
R/W |
中断第2组,优先级控制位1,参考表4-3 |
1 |
IP1_IPG1 |
0 |
R/W |
中断第1组,优先级控制位1,参考表4-3 |
0 |
IP1_IPG0 |
0 |
R/W |
中断第0组,优先级控制位1,参考表4-3 |
IP0 |
7:6 |
-- |
00 |
R/W |
没使用 |
5 |
IP0_IPG5 |
0 |
R/W |
中断第5组,优先级控制位0,参考表4-3 |
4 |
IP0_IPG4 |
0 |
R/W |
中断第4组,优先级控制位0,参考表4-3 |
3 |
IP0_IPG3 |
0 |
R/W |
中断第3组,优先级控制位0,参考表4-3 |
2 |
IP0_IPG2 |
0 |
R/W |
中断第2组,优先级控制位0,参考表4-3 |
1 |
IP0_IPG1 |
0 |
R/W |
中断第1组,优先级控制位0,参考表4-3 |
0 |
IP0_IPG0 |
0 |
R/W |
中断第0组,优先级控制位0,参考表4-3 |
表4-2 优先级设置
IP1_X |
IP0_X |
优先级 |
0 |
0 |
0 – 最低级别 |
0 |
1 |
1 |
1 |
0 |
2 |
1 |
1 |
3 – 最高级别 |
中断优先级及其赋值的中断源显示在表4-3中,每组赋值为4个中断优先级之一。当进行中断服务请求时,不允许被同级或较低级别的中断打断。
表4-3 中断优先组
组 |
中断 |
IPG0 |
PEERR |
RF |
DMA |
IPG1 |
ADC |
T1 |
P2INT |
IPG2 |
URX0 |
T2 |
UTX0 |
IPG3 |
URX1 |
T3 |
UTX1 |
IPG4 |
ENC |
T4 |
P1INT |
IPG5 |
ST |
P0INT |
WDT |
当同时收到几个相同优先级的中断请求时,采用表4-4所列的轮流检测顺序来判定哪个中断优先响应。
表4-4中断轮流检测顺序
中断向量编号 |
中断名称 |
|
0 |
RFERR |
轮流检测顺序
↓ |
16 |
RF |
8 |
DMA |
1 |
ADC |
9 |
T1 |
2 |
URX0 |
10 |
T2 |
3 |
URX1 |
11 |
T3 |
4 |
ENC |
12 |
T4 |
5 |
ST |
13 |
P0INT |
6 |
P2INT |
7 |
UTX0 |
14 |
UTX1 |
15 |
P1INT |
17 |
WDT |
|