请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430F5529 主题中讨论的其他器件:MSP430FG4618、
大家好! 我正在尝试通过 I2C 连接并使用 EEPROM 24LC1025运行以下程序、但它正在锁定且不会按照所述退出循环:
//将数据复制到 I2CBufferArray unsigned char temp; for (i;i < bufferPtr;i++) { 温度=数据[i]; //必需,否则 IAR 抛出 //警告[Pa082] I2CBufferArray[counterI2cBuffer]= temp; counterI2c 缓冲器--; }
#define I2C_PORT_SEL P3SEL #define I2C_PORT_OUT P3OUT #define I2C_PORT_REN P3REN #define I2C_PORT_DIR P3DIR #define SDA_PIN BIT0 // UCB0SDA 引脚 P3.0 #define SCL_PIN BIT1 // UCB.S 引脚 P3.1 #define SCL_CLOCK _DIV 0x0A // SCL 时钟偏差 void InitI2C (unsigned char EEPROM_i2c_address); void EEPROM_ByteWrite (unsigned int Address、unsigned char PageWrite (unsigned int StartAddress、unsigned char * Data、unsigned int Size); unsigned char EEPROM_RandomRead (unsigned char EEPROM CurrentAddress);unsigned char EEPROM_CurrentRefad (unsigned int Data)、void int Resize、void int Data; void EEPROM_AckPolling (void);
#include
#include "I2Croutines.h"
#define MAXPAGEWRITE 64
int PtrTransmit;
unsigned char I2CBufferArray[66];
unsigned char I2CBuffer;
/*--------------- */
//说明:
// I2C 模块的初始化
/*--------------- */
void InitI2C (unsigned char EEPROM_i2c_address)
{
I2C_PORT_DIR |= SDA_PIN + SCL_PIN;
I2C_PORT_SEL |= SDA_PIN + SCL_PIN; //将 I2C 引脚分配给 USCI_B0
I2C_PORT_OUT |= SDA_PIN + SCL_PIN; //将 I2C 引脚分配给 USCI_B0
//用户指南中显示的 I2C 模块的建议初始化步骤:
UCB0CTL1 |= UCSWRST; //启用 SW 复位
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C 主设备,同步模式
UCB0CTL1 = UCSSEL_2 + UCTR + UCSWRST; //使用 SMCLK、TX 模式、保持软件复位
UCB0BR0 = SCL_CLOCK_DIV; // fSCL = SMCLK/11 = 95.3kHz
UCB0BR1 = 0;
UCB0I2CSA = EEPROM_i2c_address; //定义从机地址
//在本例中为从地址
//定义控制字节
//发送到 EEPROM。
//UCB0I2COA = 0x01A5; //自己的地址。
UCB0IE |= UCTXIE + UCRXIE + UCNACKIE;
UCB0CTL1 &=~UCSWRST; //清除 SW 复位、
如果(UCB0STAT 和 UCBBUSY)则恢复运行 //测试总线是否空
闲{ //否则手动时钟打开
//生成
I2C_PORT_SEL &=~SCL_PIN; //为 SCL 选择端口功能
I2C_PORT_OUT &=~SCL_PIN; //
I2C_PORT_DIR |= SCL_PIN; //将 SCL 驱动为低电平
I2C_PORT_SEL |= SDA_PIN + SCL_PIN; //选择的模块功能
//使用的 I2C 引脚
};
__ENABLE_INTERRUPT();}/*--><!--kadov_tag{</spaces>}}-->
//
说明:
//初始化 I2C 模块以执行写操作。
/*------------------ */
void I2CWriteInit (void)
{
UCB0CTL1 |= UCTR; // UCTR=1 =>发送模式(R/W 位= 0)
UCB0IFG &&~UCTXIFG;
UCB0IE &&=~UCRXIE; //禁用接收就绪中断
UCB0IE |= UCTXIE; //启用发送就绪中断}/--><!--kadov_tag{{</spaces>}/--><!--kadov_tag{</spaces>}}-->
*/
/说明:
// I2C 模块初始化以执行读取操作。
/*------------------ */
void I2CReadInit (void)
{
UCB0CTL1 &=~UCTR; // UCTL=0 =>接收模式(R/W 位= 1)
UCB0IFG &&~UCRXIFG;
UCB0IE &&~UCTXIE; //禁用发送就绪中断
UCB0IE |= UCRXIE; //启用接收就绪中断}/--><!--kadov_tag{{</spaces>}/--><!--kadov_tag{</spaces>}}-->
*/
//说明:
//字节写入操作。 通过 I2C 总线与 EEPROM
//(2465)进行通信。 一个数据字节被写入一个用户定义的地址。
/*------------------ //
void EEPROM_ByteWrite (unsigned int Address、unsigned char Data)
{
unsigned char ADR_hi;
unsigned char ADR_lo;
while (UCB0STAT 和 UCBUSY); //等待 I2C 模块具有
//完成所有操作。
ADR_HI =地址>> 8; //计算高字节
ADR_LO =地址和0xFF; //和地址
I2CBufferArray[2]的低字节= ADR_HI; //低字节地址。
I2CBufferArray[1]= ADR_lo; //高字节地址。
I2CBufferArray[0]=数据;
PtrTransmit = 2; //设置 I2CBufferArray 指针
I2CWriteInit();
UCB0CTL1 |= UCTXSTT; //开始条件生成
//=> I2C 通信开始
__bis_SR_register (LPM3_bits + GIE); //通过中断
UCB0CTL1输入 LPM0 |= UCTXSTP; // I2C 停止条件
while (UCB0CTL1 & UCTXSTP); //确保已发送停止条件}/*--><!--kadov_tag{{</spaces>}--><!--kadov_tag{</spaces>}--><!--kadov_tag{</spaces>}--><!--kadov_tag{</spaces>}--><!--kadov_tag{</spaces>}}-->
*/
//说明:
//页写操作。
通过 I2C 总线与 EEPROM //(24xx65)进行通信。 一个数据字节被写入一个用户定义的地址。
/*------------------ //
void EEPROM_PageWrite (unsigned int StartAddress、unsigned char * Data、unsigned int size)
{
volatile unsigned int i = 0;
volatile unsigned char counterI2cBuffer;
unsigned char ADR_hi;
unsigned char currentAddress
= StartAddress;
unsigned int currentSize = size;unsigned
int bufferPtr = 0;
unsigned char moreToDataRead = 1;unsign
while (UCB0STAT 和 UCBUSY); //等待 I2C 模块具有
//完成所有操作。
//执行直到数据缓冲区中没有更多数据
while (moreDataToRead)
{
ADR_HI =电流地址>> 8; //计算高字节
ADR_lo =电流地址和0xFF; //和低字节地址
//一次发送低至64字节数据包的斩波数据
//保持当前起始地址的指针
if (currentSize > MAXPAGEWRITE)
{
bufferPtr = bufferPtr + MAXPAGEWRITE;
counterI2cBuffer = MAXPAGEWRITE - 1;
PtrTransmit = MAXPAGEWRITE + 1; //设置 I2CBufferArray 指针
currentSize = currentSize - MAXPAGEWRITE;
currentAddress = currentAddress + MAXPAGEWRITE;
//获取起始地址
I2CBufferArray[MAXPAGEWRITE + 1]= ADR_HI;//高字节地址。
I2CBufferArray[MAXPAGEWRITE]= ADR_LO;//低字节地址
。}
其他
{
bufferPtr = bufferPtr + currentSize;
counterI2cBuffer =当前大小-1;
PtrTransmit = currentSize + 1; //设置 I2CBufferArray 指针。
MoreDataToRead = 0;
currentAddress = currentAddress + currentSize;
//获取起始地址
I2CBufferArray[currentSize + 1]= ADR_HI;//高字节地址。
I2CBufferArray[电流大小]= ADR_lo;//低字节地址
。}
//将数据复制到 I2CBufferArray
unsigned char temp;
for (i;i < bufferPtr;i++)
{
温度=数据[i]; //必需,否则 IAR 抛出
//警告[Pa082]
I2CBufferArray[counterI2cBuffer]= temp;
counterI2c 缓冲器--;
}
I2CWriteInit();
UCB0CTL1 |= UCTXSTT; //开始条件生成
//=> I2C 通信开始
_bis_SR_register (LPM3_bits + GIE); //输入带中断的 LPM0
UCB0CTL1 |= UCTXSTP; // I2C 停止条件
while (UCB0CTL1 & UCTXSTP); //确保发送了停止条件
EEPROM_AckPolling(); //确保数据被写入 EEPROM
}
}-->----------------- //
//说明:
//当前地址读取操作。 从 EEPROM 读取数据。
使用来自 EEPROM 的当前//地址。
/*------------------ //
unsigned char EEPROM_CurrentAddressRead (void)
{
while (UCB0STAT 和 UCBUSY); //等待 I2C 模块具有
//完成所有操作
I2CReadInit();
UCB0CTL1 |= UCTXSTT; // I2C 启动条件
while (UCB0CTL1 & UCTXSTT); //起始条件是否已发送?
UCB0CTL1 |= UCTXSTP; // I2C 停止条件
_ bis_SR_register (LPM3_bits + GIE); //通过中断
while (UCB0CTL1 & UCTXSTP)输入 LPM0; //确保停止条件已发送
返回 I2CBuffer;
}-->---------------
*/
//说明:
//随机读取操作。 从 EEPROM 读取数据。 EEPROM
//地址由参数 Address 定义。
/*------------------ //
unsigned char EEPROM_RandomRead (unsigned int Address)
{
unsigned char ADR_hi;
unsigned char ADR_lo;
while (UCB0STAT & UCBUSY); //等待 I2C 模块具有
//完成所有操作
ADR_HI =地址>> 8; //计算高字节
ADR_LO =地址和0xFF; //和地址
I2CBufferArray[1]的低字节= ADR_HI; //存储必须
包含 I2CBufferArray[0]= ADR_lo 的单字节; //在 I2CBuffer 中发送。
PtrTransmit = 1; //设置 I2CBufferArray 指针
//写入地址优先
I2CWriteInit();
UCB0CTL1 |= UCTXSTT; //开始条件生成
//=> I2C 通信开始
__bis_SR_register (LPM3_bits + GIE); //输入带中断的 LPM0
//读取数据字节
I2CReadInit();
UCB0CTL1 |= UCTXSTT; // I2C 启动条件
while (UCB0CTL1 & UCTXSTT); //起始条件是否已发送?
UCB0CTL1 |= UCTXSTP; // I2C 停止条件
_ bis_SR_register (LPM3_bits + GIE); //通过中断
while (UCB0CTL1 & UCTXSTP)输入 LPM0; //确保停止条件已发送
返回 I2CBuffer;
}-->---------------
*/
//说明:
//顺序读取操作。 数据从 EEPROM 以顺序
//形式从作为起点的参数地址读取。 指定
要读取的//大小并填充到数据缓冲区。
/*------------------ //
void EEPROM_SequentialRead (unsigned int Address、unsigned char * Data、unsigned int size)
{
unsigned char ADR_hi;
unsigned char ADR_lo;
unsigned int counterSize;
while (UCB0STAT 和 UCBUSY); //等待 I2C 模块具有
//完成所有操作
ADR_HI =地址>> 8; //计算高字节
ADR_LO =地址和0xFF; //和地址
I2CBufferArray[1]的低字节= ADR_HI; //存储必须
包含 I2CBufferArray[0]= ADR_lo 的单字节; //在 I2CBuffer 中发送。
PtrTransmit = 1; //设置 I2CBufferArray 指针
//写入地址优先
I2CWriteInit();
UCB0CTL1 |= UCTXSTT; //开始条件生成
//=> I2C 通信开始
__bis_SR_register (LPM3_bits + GIE); //输入带中断的 LPM0
//读取数据字节
I2CReadInit();
UCB0CTL1 |= UCTXSTT; // I2C 启动条件
while (UCB0CTL1 & UCTXSTT); //起始条件是否已发送?
for (counterSize = 0;counterSize < size;counterSize++)
{
_bis_SR_register (LPM3_bits + GIE); //输入带中断的 LPM0
DATA[counterSize]= I2CBuffer;
}
UCB0CTL1 |= UCTXSTP; // I2C 停止条件
_ bis_SR_register (LPM3_bits + GIE); //通过中断
while (UCB0CTL1 & UCTXSTP)输入 LPM0; //确保已发送停止条件}/*--><!--kadov_tag{{</spaces>}--><!--kadov_tag{</spaces>}--><!--kadov_tag{</spaces>}--><!--kadov_tag{</spaces>}--><!--kadov_tag{</spaces>}}-->
//
//说明:
//确认轮询。 如果写入周期为
//正在进行、EEPROM 将不会应答。 它可用于确定写入周期何时完成。
/*------------------ *
/ void EEPROM_AckPolling (void)
{
while (UCB0STAT 和 UCBUSY); //等待 I2C 模块具有
//完成所有操作
都执行
{
UCB0STAT = 0x00; //清除 I2C 中断标志
UCB0CTL1 |= UCTR; // I2CTRX=1 =>发送模式(R/W 位= 0)
UCB0CTL1 &=~UCTXSTT;
UCB0CTL1 |= UCTXSTT; //起始条件已生成
while (UCB0CTL1和 UCTXSTT) //等待 I2CSTT 位被清零
{
if (!(UCNACKIFG & UCB0STAT)) //如果收到 ACK 则分接
中断;
}
UCB0CTL1 |= UCTXSTP; //停止条件在之后生成
//发送从器件地址=> I2C 通信开始
while (UCB0CTL1 & UCTXSTP); //等待停止位被复位
_delay_cycles (500); //软件延迟
}while (UCNACKIFG & UCB0STAT);
}/--><!-------------------
*/
*中断服务例程 */
* 请注意、编译器版本在以下代码和*/
/*中进行检查 根据编译器版本、正确的中断服务 */
* 例程定义。 //
#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
#pragma vector=USCI_B0_vector
__interrupt void USCI_B0_ISR (void)
#Elif defined (__GSCI__)
void __attribute__((interrupt (USCI_B0_ISR vector)#vector 0 (void
) UICS_编译器#UIC_不支持!
#endif
{
if (UCTXIFG & UCB0IFG)
{
UCB0TXBUF = I2CBufferArray[PtrTransmit];//加载 TX 缓冲区
PtrTransmit ----; //测量 TX 字节计数器
if (PtrTransmit < 0)
{
while (!(UCB0IFG & UCTXIFG)); // USCI_B0 TX 缓冲器就绪?
UCB0IE &=~UCTXIE; //禁用中断。
UCB0IFG &=~UCTXIFG; //清除 USCI_B0 TX int 标志
__BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);//退出 LPM0
}
}
否则、if (UCRXIFG & UCB0IFG)
{
I2CBuffer = UCB0RXBUF; //将接收到的数据存储在缓冲区中
__BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);//退出 LPM0
}
#include #include "I2Croutines.h" #include #include #include #include #include #include #include // // // Endereço (s) da (s) Memória (s)执行数据记录器 //// ************* // #define BANCO1 0x50 // Endereço 0x50 DO Banco 0 da EEPROM 24LC1025 #define BANCO2 0x54 // Endereço 0x51 DO Banco 1 da EEPROM 24LC1025 #define BANCO3 0x51 // Endereço 0x54 DO Banco 0 da EEPROM 24LC1025 #define BANCO4 0x55 // Endereço 0x55 DO Banco 1 da EEPROM 24LC1025 unsigned char VerNome[33]="Teste com Constania EEPROM 24LC1025"; unsigned char Unidade_Coletado[5]="m3/h"; unsigned int MS_Byte、LS_Byte; unsigned int Memoria = 65535; char * Gerateriro = 3.345 ;unsigned int ponteia_length;unsigned int void main (void) { WDTCTL = WDTPW + WDTHOLD; //去稳定性 o WDT //设置 XT1 P5SEL |= BIT4+BIT5; //选择 XT1 UCSCTL6 &=~(XT1OFF); // UCSCTL6上的 XT1 |= XCAP_3; //内部负载电容 UCSCTL3 = 0; // FLL 参考时钟= XT1 //SFRIE1 = OFIE; //启用 osc 故障中断 //禁用 VUSB LDO 和 SLDO USBKEYPID = 0x9628; //将 USB KEYandPID 设置为0x9628 //启用对 USB 配置寄存器的访问 USBPWRCTL &=~(SLDOEN + VUSBEN); //禁用 VUSB LDO 和 SLDO USBKEYPID = 0x9600; //禁用对 USB 配置寄存器的访问 //禁用 SVS PMMCTL0_H = PMMPW_H; // PMM Password SVSMHCTL &=~(SVMHE+SVSHE); //禁用高侧 SVS SVSMLCTL &=~(SVMLE+SVSLE); //禁用低侧 SVS // P1.2/TA0.1 P1DIR |= BIT0; // P1.0输出 RTCCTL01 = RTCTEV_3; RTCPS0CTL = RT0PSDIV_7; //将 RTPS0设定为/256 RTCPS1CTL = RT1IP_6 + RT1PSIE + RT1SSEL_3;//将 RT1IP 设定为/4、启用 // RT1PS 中断并选择 // RTOPS 输出作为时钟 // Rotina para Recuperação de Dados do Nome Aido 支流数据记录器 anteriormente // Rotinas para Recuperação de Dados do Fator da Vazão Unidade Coletado e Intervalo Coletado Adimido ao 数据记录器 anteriormente InitI2C(Banco1); //初始化 o Bankco1 da Memória EEPROM EEPROM_PageWrite (0、VerNome、32); // Salva na Memória EEPROM o Nome dado ao 数据记录器 for (length=0;length<=32;length++) { VerNome[length]='; } EEPROM_SequentialRead (0,VerNome,33); // Resgata o último Nome Dado ao 数据记录器 EEPROM_PageWrite (34、Unidade_Coletado、5); for (length=0;length<=4;length++) { Unidade_Coletado[length]= 0; } EEPROM_SequentialRead (34,Unidade_Coletado,5); MS_Byte =内存; // Carrega o Valor Mais significativo MSD LS_Byte = Memorya>>8; // Carrega o Valor menos significativo LSD Memoria = 0; EEPROM_ByteWrite (40、MS_Byte); // Escreve na EEPROM o Byte MSB com o valor do Endereço da última Memória EEPROM_AckPolling(); // Verifica se completou o ciclo de escrica na EEPROM EEPROM_ByteWrite (41、LS_Byte); // Escreve na EEPROM o Byte LSB com o valor do Endereço da última Memória EEPROM_AckPolling(); // Verifica se completou o ciclo de escrica na EEPROM Memoria = EEPROM_RandomRead (40); // Efetua a Leitura na EEPROM do Byte com o valor do último Endereço de Memória Salvo Memoria |=(unsigned int) EEPROM_RandomRead (41)<<8); Ponteiro_Geral =(无符号字符*)&Constante_Batteria; // Armazena o Valor da Constante da Bateria no Ponteiro 32位 EEPROM_ByteWrite (42,* Ponteiro_Geral++); // Escreve na EEPROM o Byte com o valor da Constantte da Bateria EEPROM_AckPolling(); // Verifica se completou o ciclo de escrica na EEPROM EEPROM_ByteWrite (43、* Ponteiro_Geral++); // Escreve na EEPROM o Byte com o valor da Constantte da Bateria EEPROM_AckPolling(); // Verifica se completou o ciclo de escrica na EEPROM EEPROM_ByteWrite (44、* Ponteiro_Geral++); // Escreve na EEPROM o Byte com o valor da Constantte da Bateria EEPROM_AckPolling(); // Verifica se completou o ciclo de escrica na EEPROM EEPROM_ByteWrite (45、* Ponteiro_Geral++); // Escreve na EEPROM o Byte com o valor da Constantte da Bateria EEPROM_AckPolling(); // Verifica se completou o ciclo de escrica na EEPROM EEPROM_ByteWrite (46、* Ponteiro_Geral); // Escreve na EEPROM o Byte com o valor da Constantte da Bateria EEPROM_AckPolling(); // Verifica se completou o ciclo de escrica na EEPROM * Ponteiro_Geral = 0; // Reseta a Variável de Ponteiro para Novo Cilco constante_Batteria = 0.0; Ponteiro_Geral =(无符号字符*)&Constante_Batteria; // Efetua a Leitura dos Dados do Fator de Vazão Coletado anteriormente na EEPROM por Ponteiro * Ponteiro_Geral++= EEPROM_RandomRead (42); *Ponteiro_Geral++= EEPROM_RandomRead (43); *Ponteiro_Geral++= EEPROM_RandomRead (44); *Ponteiro_Geral++= EEPROM_RandomRead (45); *Ponteiro_Geral = EEPROM_RandomRead (46); // Rotinas para Recuperação de Dados do Fator da Vazão Unidade Coletado e Intervalo Coletado Atidido 数据记录器 anteriormente InitI2C (Banco2); //初始化 o Bankco1 da Memória EEPROM EEPROM_PageWrite (0、VerNome、33); // Salva na Memória EEPROM o Nome dado ao 数据记录器 for (length=0;length<=32;length++) { VerNome[length]= 0; } EEPROM_SequentialRead (0,VerNome,33); // Resgata o último Nome Dado ao 数据记录器 EEPROM_PageWrite (34、Unidade_Coletado、5); for (length=0;length<=4;length++) { Unidade_Coletado[length]= 0; } EEPROM_SequentialRead (34,Unidade_Coletado,5); MS_Byte =内存; // Carrega o Valor Mais significativo MSD LS_Byte = Memorya>>8; // Carrega o Valor menos significativo LSD Memoria = 0; EEPROM_ByteWrite (40、MS_Byte); // Escreve na EEPROM o Byte MSB com o valor do Endereço da última Memória EEPROM_AckPolling(); // Verifica se completou o ciclo de escrica na EEPROM EEPROM_ByteWrite (41、LS_Byte); // Escreve na EEPROM o Byte LSB com o valor do Endereço da última Memória EEPROM_AckPolling(); // Verifica se completou o ciclo de escrica na EEPROM Memoria = EEPROM_RandomRead (40); // Efetua a Leitura na EEPROM do Byte com o valor do último Endereço de Memória Salvo Memoria |=(unsigned int) EEPROM_RandomRead (41)<<8); Ponteiro_Geral =(无符号字符*)&Constante_Batteria; // Armazena o Valor da Constante da Bateria no Ponteiro 32位 EEPROM_ByteWrite (42,* Ponteiro_Geral++); // Escreve na EEPROM o Byte com o valor da Constantte da Bateria EEPROM_AckPolling(); // Verifica se completou o ciclo de escrica na EEPROM EEPROM_ByteWrite (43、* Ponteiro_Geral++); // Escreve na EEPROM o Byte com o valor da Constantte da Bateria EEPROM_AckPolling(); // Verifica se completou o ciclo de escrica na EEPROM EEPROM_ByteWrite (44、* Ponteiro_Geral++); // Escreve na EEPROM o Byte com o valor da Constantte da Bateria EEPROM_AckPolling(); // Verifica se completou o ciclo de escrica na EEPROM EEPROM_ByteWrite (45、* Ponteiro_Geral++); // Escreve na EEPROM o Byte com o valor da Constantte da Bateria EEPROM_AckPolling(); // Verifica se completou o ciclo de escrica na EEPROM EEPROM_ByteWrite (46、* Ponteiro_Geral); // Escreve na EEPROM o Byte com o valor da Constantte da Bateria EEPROM_AckPolling(); // Verifica se completou o ciclo de escrica na EEPROM * Ponteiro_Geral = 0; // Reseta a Variável de Ponteiro para Novo Cilco constante_Batteria = 0.0; Ponteiro_Geral =(无符号字符*)&Constante_Batteria; // Efetua a Leitura dos Dados do Fator de Vazão Coletado anteriormente na EEPROM por Ponteiro * Ponteiro_Geral++= EEPROM_RandomRead (42); *Ponteiro_Geral++= EEPROM_RandomRead (43); *Ponteiro_Geral++= EEPROM_RandomRead (44); *Ponteiro_Geral++= EEPROM_RandomRead (45); *Ponteiro_Geral = EEPROM_RandomRead (46); 执行{ _bis_SR_register (LPM3_bits + GIE); __no_operation(); } while (1); __bis_SR_register (LPM3_bits + GIE); } // RTC 中断服务例程 #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__) #pragma vector=RTC_vector __interrupt void RTC_ISR (void) #Elif defined (__IAR_systems_systems_ic_)(void )#pragma COMPLECTION_ICC_(void)(#pragma COMPLEC_(void)(void)(#pragma COMPLEC_)(void)(#_ #endif { P1OUT ^= 0x01; //切换 P1.0 RTCCTL01 &=~RTCTEVIFG; RTCPS1CTL &=~RT1PSIFG; }