中断在计算机组成中都有详细介绍。中断分为外部中断和内部中断。对于CC2530片上系统来说,通用I/O引脚设置为输出时候,可以用于产生中断,可以设置为外部信号的上升或下降沿出发。P0,P1,P2都有中断使能位。对于IEN1~2寄存器内的端口所有的位都是公共的。
- IEN1.P0IE:P0中断使能
- IEN2.P1IE:P1中断使能
- IEN2.P2IE:P2中断使能
此外还包括其他很多类型的中断;
- IEN1.TxIE:定时器x中断使能
- IEN2.RFIE:RF一般中断使能
除了公共中断使能外,P0~P2中断标志寄存器P0IEN,P1IEN,P2IEN的单独中断使能配置外设I/O或通用输出I/O或通用输出I/O引脚使能都有中断发生。
当中断条件发生时,P0~P2中断标志寄存器P0IFG,P1IFG,P2IFG中相应的中断状态标志见设置为1,不管是否设置了它的中断使能位,中断标志都会设置。当执行中断时,中断状态标志被清除,该标志清0,且该标志必须在清除CPU端口中断标志(PxIF)之前清除。
- P1CTL:P0,P1,P2的触发设置。
- PxIFG:Px中断标志。
所涉及寄存器如下:
P0IEN:各个控制口的中断使能,0为中断禁止,1为中断使能。如下表:
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
P0_7 | P0_6 | P0_5 | P0_4 | P0_3 | P0_2 | P0_1 | P0_0 |
|DMA
P0INP:设置各个I/O口的输入模式,0为上拉/下拉,1为三态模式,如下表:
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
P0_7模式 | P0_6模式 | P0_5模式 | P0_4模式 | P0_3模式 | P0_2模式 | P0_1模式 | P0_0模式 |
PICTL:D0~D3设置各个端口的中断触发方式,0为上升沿触发,1为下降沿触发。如下表:
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
I/O驱动能力 | 未用 | 未用 | 未用 | P2_0~P2_4 | P1_4~P1_7 | P1_0~P1_3 | P0_0~P0_7 |
IEN10:中断使能1,0为中断禁止,1为中断使能。如下表:
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
未用 | 未用 | 端口0 | 定时器4 | 定时器3 | 定时器2 | 定时器1 | DMA使用 |
D7控制I/O引脚在输出模式下的驱动能力。选择输出驱动能力增强来补偿引脚DVDD的低I/O电压。确保在较低的电压下的驱动能力和较高电压下相同。0为最小驱动能力增强。1为最大驱动能力增强。
P0IFG:中断状态标志寄存器,当输入端口有中断请求时,相应的标志位将置1.如下表:
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
P0_7 | P0_6 | P0_5 | P0_4 | P0_3 | P0_2 | P0_1 | P0_0 |
部分代码如下:
/*主函数*/
void main(void)
{
led_init();
ext_init();
while(1); //等待中断
}
``
/*外部中断初始化*/
void ext_init(void)
{
P0SEL &=~0x10; //通用I/O
P0DIR &=~0x10; //做输入
P0INP &=~0x10; //0:上拉/下拉
P0IEN |=0x10; //开P0口中断
PICTL &=~0x01; //上升沿触发
P0IFG &=~0x10; //P0_4中断标志清0
P0IE=1; //P0中断使能
EA=1; //总中断使能
}
/*中断服务子程序*/
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
EA = 0; //关中断
Delay(250);
D6=0;
Delay(250);
D6=1;
Delay(250);
D6=0
Delay(250);
D6=1;
Delay(250);
D6=0;
if(P0IFG & 0x10)>0{ //按键中断,P0_4
P0IFG &=~0x10; //P0_4中断标志清0
D7=!D7;
}
P0IF = 0; //P0中断标志清0
EA = 1; //开中断
}