⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 MSP430设计的继电保护控制和通信程序
💻 C
字号:
/*与主cpu通讯,并可以往Flash中写入密码。通过com口接收密码并校验,如果正确让继电器动作,并往主cpu作出相应
的反应*/
#include <msp430x12x.h>
#include <string.h>
#define Num   9
#define RIGHT 0x01
#define ERROR 0x00
#define uchar unsigned char
#define uint  unsigned int
#define KEYON3 P1IN&BIT0
//定时时间
#define Time100ms 3277
uchar FlashData[16];
uchar RecComm[30];
uchar RecCount,FrameCount;
uchar Pass64Bit1[8]={1,1,1,1,1,1,1,1};
uchar Pass64Bit2[8]={1,1,1,1,1,1,1,1};
uint TimeCount;
uchar PassFlag;
/////////////////////////////////////////////////////
void delay(uint time);
void InitTimerA(uint time);
void Com0Init(void);
void SendFrame(uchar *Frame,uchar CountFrame);
void flash_write(char *pAdd,uchar *Data,uchar count);
uchar flash_read(char *pAdd,uchar *Data,uchar count);
uchar CheckSum(uchar *pFrame,uint Count);
uchar Verify(uchar *Data1,uchar *Data2,uchar count);
void copy(uchar *pData,uchar *newData,uchar count);
////////////////////////////////////////////////////
void delay(uint time)
{
   uint m,n;
   for(m=0;m<time;m++)
   {
       for(n=0;n<125;n++)
       {;}
   }
}
///////////////////////////////////////////////////
void InitTimerA(uint time)
{
   TACTL = TASSEL0 + TACLR;              // ACLK, clear TAR
   CCTL0 &= ~CCIE;                         // CCR0 interrupt disable
   CCR0 = time;
   TACTL |= MC0;                         // Start Timer_A in UP mode
   //while(!(TACTL & TAIFG))
   //{;}
}
void Com0Init(void)                         //串口通讯初始化程序
{
  //while ((IFG1 & OFIFG) == OFIFG);      // OSCFault flag still set?                

  //BCSCTL2 |= SELM1+SELM0;               // MCLK = LFXT1 (safe)
  UCTL0 = CHAR;                         // 8-bit character
  UTCTL0 = SSEL0;                       // UCLK = ACLK
  UBR00 = 0x03;                         // 32768/9600 - 3.413
  UBR10 = 0x00;                         //
  UMCTL0 = 0x4a;                        // modulation
  ME2 |= UTXE0 + URXE0;                 // Enabled USART0 TXD/RXD
  IE2 |= URXIE0;                        // Enabled USART0 RX interrupt
  P3SEL |= 0x30;                        // P3.4,5 = USART0 TXD/RXD
  P3DIR |= 0x10;                        // P3.4 output direction
  _EINT();                              // Enable interrupts
}
////////////////////////////////////////////////////////
/*interrupt[TIMERA0_VECTOR] void TimerA(void)
{
      TimeCount++;
}*/
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)       //通讯中断服务程序

//interrupt[UART0RX_VECTOR] void usart0_rx (void)       //通讯中断服务程序
{
   
  //if(RecCount == FrameCount)
    // RecCount=0;
   //else 
   //{
      RecComm[RecCount]=RXBUF0;
      RecCount++;
  // }
}
/////////////////////////////////////////////////////////
//send frame use uart0
void SendFrame(uchar *Frame,uchar CountFrame)
{
   uchar *pTem,m;
   pTem = Frame;
   for(m=0;m<CountFrame;m++)
   {
      while ((IFG1 & UTXIFG0) == 0);        // USART0 TX buffer ready?
      TXBUF0 = *pTem;
      pTem++;
   }
}
//////////////////////////////////////////////////////
/* 对segB操作 */
void flash_write(char *pAdd,uchar *Data,uchar count)
//void flash_write(int *pAdd,uchar *Data,uchar count)
{
    uchar m; 
    char *TemAdd;
    char *pwrite;           /* 定义定义写地址指针 */
    uchar *pTemData;
    _DINT();
    while(FCTL3&BUSY);       /* 检测是否为忙 */
    flash_read((char *)0x01000,FlashData,16);
    while(FCTL3&BUSY);       /* wait for free */
    FCTL2=FWKEY;            /* ACLK,写操作  */
    FCTL3 = FWKEY;          /* LOCK IS LOW */
    FCTL1 = FWKEY+ERASE;    /* 擦除一段 */
    pwrite = pAdd;    
    pTemData = Data;
    *pwrite=0;              /* 空写入启动擦除 */
    FCTL1 = FWKEY+WRT;      /* 对flash编程 */
    m=0;
    TemAdd = (char *)0x01000;
    while(TemAdd < pwrite)    /* 写入不需改变的flash数据 */
    {
         *TemAdd = *(FlashData + m);
         TemAdd++;
         m++;
    }
    for(m=0;m<count;m++)
    {
       *(pwrite+m)= *(pTemData+m);
    }
    while(FCTL3&BUSY)       //等待对flash写结束
    {;}
    FCTL1=FWKEY;
    FCTL3^=(FXKEY+LOCK);       //写完了,确定
    _EINT();

}

//--------------------------------------------------------
uchar flash_read(char *pAdd,uchar *Data,uchar count)
{
  uchar *read_data;
  char *pread;
  uchar m;
  _DINT();
  while(FCTL3 & BUSY)
  {;}
  FCTL3 = FWKEY;              //LOCK IS LOW
  FCTL2 = FWKEY;          //ACLK
  FCTL1 = FWKEY;
  pread = pAdd;
  read_data= Data;
  //read_data=*(pread+n);       //读地址中的数据
  for(m=0;m<count;m++)
  {
     *(read_data+m)= *(pread+m);
  } 
  while(FCTL3&BUSY)
  {;}
  FCTL3^=(FXKEY+LOCK);        //读完
  _EINT();
  return(*pread);        //返回读出数据
}
/////////////////////////////////////说明:在主函数首先应该读出存入flash的config_flag标志,如不为0X00,则福config_flag=0x01;
////////////////////////////////////////////////////
uchar CheckSum(uchar *pFrame,uint Count)
{
    uchar *pTem,m;
    uchar Check_Sum;
    pTem = pFrame;
    Check_Sum =0;
    for(m=0;m<Count;m++)
    {
         Check_Sum += *(pTem++);
     }
     return Check_Sum;
}
//////////////////////////////////////////////////////////
uchar Verify(uchar *Data1,uchar *Data2,uchar count)
{
    uchar m;
    for(m=0;m<count;m++)
    {
        if((*(Data1+m))!=(*(Data2+m)))
        return  ERROR;
    }
    return RIGHT;
}
/////////////////////////////////////////
void copy(uchar *pData,uchar *newData,uchar count)
{
    uchar m;
    for(m=0;m<count;m++)
    {
        *(pData+m)=*(newData+m);
    }
}
///////////////////////////////////////////
void main()
{
     unsigned int i,CheckSum,m;
     uchar ReceiveData[30];
     uchar SendData[2];
     uchar Check;
     WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
     BCSCTL1 &= (~XTS);                       // ACLK = LFXT1 = LFXTAL
     i=0xff;
     /*do 
     {
        IFG1 &= ~OFIFG;                       // Clear OSCFault flag
        for (i = 0xFF; i > 0; i--);           // Time for flag to set
     }
     while ((IFG1 & OFIFG) == OFIFG);      // OSCFault flag still set?  */         

     BCSCTL2 |= SELM1+SELM0;               // MCLK = LFXT1 (safe)
     for(i=0;i<100;i++)
     {
       m++;
     }  
     flash_read((char *)0x01000,Pass64Bit1,8);
     flash_read((char *)0x01008,Pass64Bit2,8);
     InitTimerA(Time100ms);
     Com0Init();
     P2DIR |= (BIT0+BIT1);
     P2DIR &= ~BIT2;
     P3DIR |= (BIT0+BIT1+BIT2+BIT3);
     P1DIR &= ~BIT0;                       /* Test KEY ON */
     P2OUT &= ~(BIT0+BIT1+BIT2);
     P3OUT &= ~(BIT0+BIT1+BIT2+BIT3);
     PassFlag = 0;
     RecCount=0;
     FrameCount=18;
     TimeCount = 0;
     while(1)
     {
          P2OUT |= BIT0;             /* 接通data in */
          delay(50);
          P2OUT &= ~BIT0;             /* 接通data in */
          delay(50);
     }
     
     while(1)
     {
          if(RecCount == FrameCount)
          {
                TimeCount=0;
                copy(ReceiveData,RecComm,18);
                RecCount=0;
                Check=0;
                for(m=0;m<17;m++)
                {
                   Check=Check+ReceiveData[m];
                }
                //Check = CheckSum(ReceiceData,17);
                if(ReceiveData[17] == Check)
                {
                     if(ReceiveData[0] == 0x01)
                     {
                         copy(Pass64Bit1,&ReceiveData[1],8);
                         copy(Pass64Bit2,&ReceiveData[9],8);
                         flash_write((char *)0x01000,Pass64Bit1,8);
                         flash_write((char *)0x01008,Pass64Bit2,8);
                         RecCount=0;
                         FrameCount = 2;
                         SendData[0]=ReceiveData[0];
                         SendData[1]=0x01;        /* return com ok to master */
                         SendFrame(SendData,FrameCount);
                         RecCount=0;
                         FrameCount = 18;
                     }
                     if(ReceiveData[0] == 0x02)
                     {
                          if((Verify(&ReceiveData[1],Pass64Bit1,8) == RIGHT)|| (Verify(&ReceiveData[9],Pass64Bit2,8) == RIGHT))
                          {
                                RecCount=0;
                                FrameCount = 2;
                                SendData[0]=ReceiveData[0];
                                SendData[1]=0x01;       /* return com ok to master */
                                SendFrame(SendData,FrameCount);
                                PassFlag = 1;
                                RecCount=0;
                                FrameCount = 18;
                          }
                          else
                          {
                                RecCount=0;
                                FrameCount = 2;
                                SendData[0]=ReceiveData[0];
                                SendData[1]=0x02;       //Verify Error
                                PassFlag = 0;
                                SendFrame(SendData,FrameCount);
                                RecCount=0;
                                FrameCount = 18;
                          }
                     }
                }
                else
                {
                     RecCount=0;
                     FrameCount = 2;
                     SendData[0]=ReceiveData[0];
                     SendData[1]=0x00;       //check Eroor
                     SendFrame(SendData,FrameCount);
                     RecCount=0;
                     FrameCount = 18;
                }     
                RecCount=0;
                FrameCount = 18;     
          }
          if(((PassFlag == 1) || (PassFlag == 0)) && (KEYON3))  /* 5s后不点火则自动关断,拔下钥匙后5秒后自动关断 */   
          {
               if(TACTL & TAIFG)
               {
                   TimeCount++;
                   TACTL &= ~TAIFG;  //轻重断标志
               } 
               if(TimeCount >= 50)
               {
                   PassFlag = 3;           /* 5s后不点火则自动关断,等待主板再一次发送命令以恢复PassFlag =0 or 1 */
                   TimeCount = 0;           /* 定时器清零 */
                   P2OUT &= ~BIT0;          /* 关断data in */
               }
          }      
          if((!(KEYON3)) && (PassFlag == 1))
          {
               TimeCount=0;
               P2OUT |= BIT0;             /* 接通data in */
               PassFlag = 0;
          }
     }
}     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -