基于STM32的CRC校驗(yàn)說明
///*****************************************************************************
//下面是test.c里面的函數(shù)
///*****************************************************************************
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//串口獵人用的程序 //////////
//值得說明的是,CRC協(xié)議同樣適用于串口獵人適用,也就是”協(xié)議”是通用的 ////////
// USART1->DR=num; ////////
//串口獵人只能發(fā)送hex值,即只能發(fā)送16進(jìn)制的數(shù)據(jù),才能顯示出波形 /////////
// while((USART1->SR&0X40)==0); ////////
// delay_ms(500); ////////
// num-=1; ////////
// if(num==0x00) ////////
// num=0xff; ///////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//值得說明的是,CRC協(xié)議同樣適用于串口獵人適用,也就是”協(xié)議”是通用的 ////////
//串口助手用的程序 ////////
// printf("%d ",0XA5); ////////
// printf("%d ",t); ////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Visualscope串口示波器的程序 ////////
////////
for(i=0;i<4;i++)//先裝載數(shù)據(jù) ////////
{ ////////
OutData[i]= num; ////////
num-=70; ////////
} ////////
num=0xff; ////////
OutPut_Data();//調(diào)用主函數(shù) ////////
delay_ms(10);//定義發(fā)送頻率 ////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///*****************************************************************************
//下面是USART.H里面的函數(shù)
///*****************************************************************************
//串口示波器的變量
extern float OutData[4];//這是全局變量
unsigned short CRC_CHECK(unsigned short *Buf, unsigned short CRC_CNT);
void voTxIsr(void);
void OutPut_Data();
///*****************************************************************************//下面的是USART.C里面的文件
//這里用到了串口接收數(shù)據(jù)中斷函數(shù),所以需要把原先的數(shù)據(jù)串口中斷函數(shù)屏蔽了
///*****************************************************************************
//the following is MCU code for CRC16 ,please refer.
//-------------------------------------------------------------------------------------------
#define ULONG unsigned long
#define RxCountMax 18
//float OutData[4]; 這個是全局變量,在main函數(shù)和USART.H中都有定義
unsigned short TxBuf[10];
unsigned short RxBuf[RxCountMax];
unsigned short RxCnt;
unsigned short TxCnt;
unsigned short Rx50msCnt;
unsigned long pAddr1,pAddr2,pAddr3,pAddr4;
//CRC16校驗(yàn)算法
unsigned short CRC_CHECK(unsigned short *Buf, unsigned short CRC_CNT)
{
unsigned short CRC_Temp;
unsigned char i,j;
CRC_Temp = 0xffff;
for (i=0;i CRC_Temp ^= Buf[i]; for (j=0;j<8;j++) { if (CRC_Temp & 0x01) CRC_Temp = (CRC_Temp >>1 ) ^ 0xa001; else CRC_Temp = CRC_Temp >> 1; } } return(CRC_Temp); } //Receive interrupt routine 串口接收中斷函數(shù) void USART1_IRQHandler(void) { unsigned short i,CRC_RX,CRC_Tmp; RxBuf[RxCnt] = USART1->DR; //acquire data 接收數(shù)據(jù) RxCnt++; if(RxCnt == RxCountMax) { CRC_Tmp = CRC_CHECK(RxBuf,16); //CRC Calculation 計(jì)算接收到的數(shù)據(jù)的CRC校驗(yàn)值 CRC_RX = ((unsigned short)RxBuf[RxCountMax-1]<<8) + RxBuf[RxCountMax-2]; //接收的數(shù)據(jù)中的最后兩位就是CRC校驗(yàn)值 if(CRC_Tmp == CRC_RX){ //比較兩個校驗(yàn)值是否相同 LED0=~LED0; //這里是我做的一個現(xiàn)象,通信成功就亮/滅一下燈 pAddr1 = ((ULONG)(RxBuf[0x3])<<24)"((ULONG)(RxBuf[0x2])<<16)|((ULONG)(RxBuf[0x1])<<8)|RxBuf[0x0]; //然后把數(shù)據(jù)保存起來 pAddr2 = ((ULONG)(RxBuf[0x7])<<24)|((ULONG)(RxBuf[0x6])<<16)|((ULONG)(RxBuf[0x5])<<8)|RxBuf[0x4]; pAddr3 = ((ULONG)(RxBuf[0xB])<<24)|((ULONG)(RxBuf[0xA])<<16)|((ULONG)(RxBuf[0x9])<<8)|RxBuf[0x8]; pAddr4 = ((ULONG)(RxBuf[0xF])<<24)|((ULONG)(RxBuf[0xE])<<16)|((ULONG)(RxBuf[0xD])<<8)|RxBuf[0xC]; } RxCnt = 0; } Rx50msCnt = 0; //to add--Clear Receive Data Register Fll flag; // USART1->DR=res; // while((USART1->SR&0X40)==0);// } //Transfer interrupt routine 串口發(fā)送數(shù)據(jù)函數(shù) void voTxIsr(void) { if(TxCnt <= 9) { USART1->DR = TxBuf[TxCnt]; //Clear Tx interrupt flag TxCnt++; if(TxCnt >= 10) {