📄 uart.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 + -