zoukankan      html  css  js  c++  java
  • 【HC89S003F4开发板】 6crc校验

    HC89S003F4开发板crc校验

    前言

    第一次用有带crc的mcu

    使用资料自带的demo

    • @实现效果 通过PC向MCU发送5个8位数据,MCU返回CRC校验值
    void main()
    {
    /************************************系统初始化****************************************/
    	WDTCCR = 0x00;						  //关闭看门狗
    		                                //本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
    	CLKSWR = 0x51;						  //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
    	CLKDIV = 0x01;						  //Fosc 1分频得到Fcpu,Fcpu=16MHz 
    /**********************************相关配置初始化**************************************/
    	P2M0 = P2M0&0x0F|0x80;			//P21设置为推挽输出
    	P0M1 = P0M1&0x0F|0x20;			//P03设置为上拉输入
    	TXD_MAP = 0x21;						  //TXD映射P21
    	RXD_MAP = 0x03;						  //RXD映射P03		
    	T4CON = 0x06;						    //T4工作模式:UART1波特率发生器
      TH4 = 0xFF; 
    	TL4 = 0x98;							    //波特率9600
    	SCON2 = 0x02;						    //8位UART,波特率可变
    	SCON = 0x10;						    //允许串行接收
    	IE |= 0X10;							    //使能串口中断
    /**********************************CRC配置初始化***************************************/
    	CRCC = 0x07;					      //CRC复位,LSB first,复位初值为0xFFFF
    
    	EA = 1;
    
    	while(1)
    	{
    		if(guc_UARTFlag)
    		{
    			IE &=~ 0x10;				                     //失能UART1中断
    			gui_CrcResault = CRC_CalcCRC(guc_UARTbuf_a,sizeof(guc_UARTbuf_a));	
    										                           //写入校验数据并获取CRC效验值
    			memcpy(guc_CrcValue_a,&gui_CrcResault,2);//内存拷贝函数
    			for(guc_i = 0;guc_i< 2;guc_i++)
    			{
    				SBUF = guc_CrcValue_a[guc_i];          //发送8位串口数据
    				while(!(SCON & 0x02));
    				SCON &=~ 0x02;			                   //清除发送中断标志位
    			}
    			CRCC = 0x07;				                     //CRC复位,LSB first,复位初值为0xFFFF
    			IE |= 0x10;					                     //UART1中断使能
    			guc_UARTFlag = 0;			                   //标志位清零
    			guc_UARTCnt = 0;			                   //计数清零
    			SCON |= 0x10;				                     //UART1接收使能
    		}	
    	}
    }
    
    /***************************************************************************************
      * @说明  	UART1中断服务函数
      *	@参数	无
      * @返回值 无
      * @注		无
    ***************************************************************************************/
    void UART1_Rpt(void) interrupt UART1_VECTOR
    {
    	if(SCON&0x01)						                //判断接收中断标志位
    	{	
    		guc_UARTbuf_a[guc_UARTCnt++] = SBUF;  //转存8位串口接收数据
    		if(guc_UARTCnt >= 5)
    		{
    			SCON &=~ 0x10;			               	//失能UART1接收
    			guc_UARTFlag = 1;
    		}
    		SCON &=~ 0x01;			              		//清除接收中断标志位
    	}									
    }
    
    /**
      * @说明  	写入需要校验的数据并返回校验结果
      * @参数  	*fucp_CheckArr : CRC校验数据首地址
      * @参数  	fui_CheckLen : CRC校验数据长度
      *         取值范围 0 - 65535
      * @返回值 CRC校验结果。
      			低位在前,高位在后
      * @注		无
      */
    unsigned int CRC_CalcCRC(unsigned char *fucp_CheckArr,unsigned int fui_CheckLen)
    {
    	while(fui_CheckLen--)CRCL = *(fucp_CheckArr++);
    	return CRCR;
    }
    

    实现效果

    • 打印信息

    image

    • 比较结果和工具相同

    image

  • 相关阅读:
    【osd】OSD的状态转化
    【monitor】paxos算法
    【osd】Ceph中的数据一致性
    【osd】peering基本概念
    【osd】PG的生成过程
    【osd】ceph读写流程
    【osd】peering 运行过程 举例阐述
    【osd】BACKOFF
    【vscode】快捷键
    python写文件,过滤空行,根据某一行打上标记
  • 原文地址:https://www.cnblogs.com/yywBlogW/p/11369376.html
Copyright © 2011-2022 走看看