MSP430系列单片的中断实现与中断嵌套!
1)430默认的是关闭中断嵌套的,除非你在一个中断程序中再次开总中断EINT;
2)当进入中断程序时,只要不在中断中再次开中断,则总中断是关闭的,此时来中断不管是比当前中断 优先级高还是低都不执行;
3)若在中断A中开了总中断,则可以响应后来的中断B(不管B的优先级比A高还是低),B执行完再继续执行A。注意:进入中断B后总中断同样也会关闭,如果B中断程序执行时需响应中断C,则此时也要开总中断,若不需响应中断,则不用开中断,B执行完后跳出中断程序进入A程序时,总中断会自动
打开;
4)若在中断中开了总中断,后来的中断同时有多个,则会按优先级来执行,即中断优先级只有在多个中断同时到来时才起做用!
5)
对于单源中断,只要响应中断,系统硬件自动清中断标志位,对于TA/TB定时器的比较/捕获中断,只要访问TAIV/TBIV,标志位倍被自动清除;
对于多源中断要手动清标志位,比如P1/P2口中断,要手工清除相应的标志,如果在这种中断用"EINT();"开中断,而在打开中断前没有清标志,就会有相同的中断不断嵌入,而导致堆栈溢出引起复位,所以在这类中断中必须先清标志再打开中断开关.
//==================================================
中断处理
当一个外部设备发出中断请求时,如果外部设备的中断使能位和通用中断使能位GIE置位了,需要有中断服务程序。只有不可屏蔽中断需要设置单独的个别的中断使能位来。
中断接收
从接受到中断请求,到开始执行中断服务子程序第一条指令之前,时长是6个机器周期。中断逻辑执行如下:
1).完成任何当前指令
2).指向的下一条指令的PC被压入堆栈
3).SR被压入堆栈
4).在执行最后一条指令时如果发生了多个中断,拥有最高优先级的中断被选择并等待处理
5).对于只有单个中断源的中断,它的标志位会自动复位。而多源中断的中断标志位由软件服务去设置
6).状态寄存器SR被清除。这会终止任何低功耗模式。因为GIE位被清除,所以禁止任何中断产生
7).中断向量中的内容将会载入到PC中,程序从这个地址开始运行中断服务程序。
中断返回
中断服务程序以指令RETI (return from an interrupt service routine)结束。中断返回占用5个周期去执行以下动作。
1).压入到堆栈中的SR的数据出栈,所有先前GIE,CPUOFF等的设置将生效,无论在中断服务程序中如何设置
2).PC出栈,从断点处执行程序。
中断嵌套
如果在中断服务子程序中设置了GIE位,就可能发生中断嵌套。当允许中断嵌套时,任何正在执行中断服务子程序发生中断将会打断中断服务程序,无论它的中断优先级如何。该嵌套中断程序执行完后,在回到当前中断继续执行.
具体方式如下:
1)430默认的是关闭中断嵌套的,除非你在一个中断程序中再次开总中断EINT;
2)当进入中断程序时,只要不在中断中再次开中断,则总中断是关闭的,此时来中断不管是比当前中断的优先级高还是低都不执行;
3)若在中断A中开了总中断,则可以响应后来的中断B(不管B的优先级比A高还是低),B执行完再继续执行A。注意:进入中断B后总中断同样也会关闭,如果B中断程序执行时需响应中断C,则此时也要开总中断,若不需响应中断,则不用开中断,B执行完后跳出中断程序进入A程序时,总中断会自动打开;
4)若在中断中开了总中断,后来的中断同时有多个,则会按优先级来执行,即中断优先级只有在多个中断同时到来时才起做用!中断服务不执行抢先原则。
5)对于单源中断,只要响应中断,系统硬件自动清中断标志位,对于TA/TB定时器的比较/捕获中断,只要访问TAIV/TBIV,标志位倍被自动清除;
对于多源中断要手动清标志位,比如P1/P2口中断,要手工清除相应的标志,如果在这种中断用"EINT();"开中断,而在打开中断前没有清标志,就会有相同的中断不断嵌入,而导致堆栈溢出引起复位,所以在这类中断中必须先清标志再打开中断开关.
1)430默认的是关闭中断嵌套的,除非你在一个中断程序中再次开总中断EINT;
2)当进入中断程序时,只要不在中断中再次开中断,则总中断是关闭的,此时来中断不管是比当前中断 优先级高还是低都不执行;
3)若在中断A中开了总中断,则可以响应后来的中断B(不管B的优先级比A高还是低),B执行完再继续执行A。注意:进入中断B后总中断同样也会关闭,如果B中断程序执行时需响应中断C,则此时也要开总中断,若不需响应中断,则不用开中断,B执行完后跳出中断程序进入A程序时,总中断会自动
打开;
4)若在中断中开了总中断,后来的中断同时有多个,则会按优先级来执行,即中断优先级只有在多个中断同时到来时才起做用!
5)
对于单源中断,只要响应中断,系统硬件自动清中断标志位,对于TA/TB定时器的比较/捕获中断,只要访问TAIV/TBIV,标志位倍被自动清除;
对于多源中断要手动清标志位,比如P1/P2口中断,要手工清除相应的标志,如果在这种中断用"EINT();"开中断,而在打开中断前没有清标志,就会有相同的中断不断嵌入,而导致堆栈溢出引起复位,所以在这类中断中必须先清标志再打开中断开关.
//==================================================
中断处理
当一个外部设备发出中断请求时,如果外部设备的中断使能位和通用中断使能位GIE置位了,需要有中断服务程序。只有不可屏蔽中断需要设置单独的个别的中断使能位来。
中断接收
从接受到中断请求,到开始执行中断服务子程序第一条指令之前,时长是6个机器周期。中断逻辑执行如下:
1).完成任何当前指令
2).指向的下一条指令的PC被压入堆栈
3).SR被压入堆栈
4).在执行最后一条指令时如果发生了多个中断,拥有最高优先级的中断被选择并等待处理
5).对于只有单个中断源的中断,它的标志位会自动复位。而多源中断的中断标志位由软件服务去设置
6).状态寄存器SR被清除。这会终止任何低功耗模式。因为GIE位被清除,所以禁止任何中断产生
7).中断向量中的内容将会载入到PC中,程序从这个地址开始运行中断服务程序。
中断返回
中断服务程序以指令RETI (return from an interrupt service routine)结束。中断返回占用5个周期去执行以下动作。
1).压入到堆栈中的SR的数据出栈,所有先前GIE,CPUOFF等的设置将生效,无论在中断服务程序中如何设置
2).PC出栈,从断点处执行程序。
中断嵌套
如果在中断服务子程序中设置了GIE位,就可能发生中断嵌套。当允许中断嵌套时,任何正在执行中断服务子程序发生中断将会打断中断服务程序,无论它的中断优先级如何。该嵌套中断程序执行完后,在回到当前中断继续执行.
具体方式如下:
1)430默认的是关闭中断嵌套的,除非你在一个中断程序中再次开总中断EINT;
2)当进入中断程序时,只要不在中断中再次开中断,则总中断是关闭的,此时来中断不管是比当前中断的优先级高还是低都不执行;
3)若在中断A中开了总中断,则可以响应后来的中断B(不管B的优先级比A高还是低),B执行完再继续执行A。注意:进入中断B后总中断同样也会关闭,如果B中断程序执行时需响应中断C,则此时也要开总中断,若不需响应中断,则不用开中断,B执行完后跳出中断程序进入A程序时,总中断会自动打开;
4)若在中断中开了总中断,后来的中断同时有多个,则会按优先级来执行,即中断优先级只有在多个中断同时到来时才起做用!中断服务不执行抢先原则。
5)对于单源中断,只要响应中断,系统硬件自动清中断标志位,对于TA/TB定时器的比较/捕获中断,只要访问TAIV/TBIV,标志位倍被自动清除;
对于多源中断要手动清标志位,比如P1/P2口中断,要手工清除相应的标志,如果在这种中断用"EINT();"开中断,而在打开中断前没有清标志,就会有相同的中断不断嵌入,而导致堆栈溢出引起复位,所以在这类中断中必须先清标志再打开中断开关.