标题:
MSP430单片机临界代码
[打印本页]
作者:
51hei单片
时间:
2016-3-14 19:54
标题:
MSP430单片机临界代码
本程序是《MSP430系列单片机系统工程设计与实践》书里面的源码,(包含工程文件(例3.9.10) )完整例程下载:
http://www.51hei.com/bbs/dpj-46245-1.html
关于本程序的详细解说大家可以点击上图下载电子书
#include <msp430x42x.h>
float Val=123.4;
char Flag=0;
unsigned int SR_Val;
unsigned char DINT_Count=0;
void EnterCritical() /*进入临界代码区*/
{
if(DINT_Count==0) // 只对最外层操作。
{
SR_Val=__get_SR_register(); // 保存当前中断状所在的态寄存器
_DINT(); // 关中断
}
DINT_Count ++; // 嵌套层数计数+1
}
void ExitCritical() /*退出临界代码区*/
{
DINT_Count--; // 嵌套层数计数-1
if((DINT_Count==0)&&(SR_Val & GIE)) _EINT(); // 只对最外层操作。
} // 根据保存的状态恢复中断
/*
void EnterCritical(unsigned int *SR_Val)
{
*SR_Val = __get_SR_register();//保存中断状态
_DINT();
}
void ExitCritical(unsigned int *SR_Val)
{
if(*SR_Val & GIE) _EINT(); //恢复中断状态
}
*/
void main( void )
{ float Temp;
unsigned int GIE_Val;
WDTCTL= WDTPW +WDTHOLD;
P2OUT=0;
P2DIR|=BIT0; // P2.0指示灯
BTCTL = BT_ADLY_250; // 中断周期250ms
IE2 |= BTIE; // 允许BasicTimer中断
_EINT(); // 允许总中断
while(1)
{
EnterCritical();
Temp=Val;
ExitCritical();
if((Temp!=123.4)&&(Temp!=56.78)) //如果既非123.4也非56.78
{
P2OUT|=BIT0; // 才会执行到这一句(亮灯)
}
}
}
#pragma vector = BASICTIMER_VECTOR // BasicTimer定时器中断(1/4秒)
__interrupt void BT_ISR(void) //
{
Flag^=1;
if(Flag) Val=123.4; // Val在123.4与56.78之间切换
else Val=56.78;
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1