码迷,mamicode.com
首页 > 其他好文 > 详细

【HC89S003F4开发板】 6crc校验

时间:2019-08-17 17:34:55      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:rtc   0x03   系统   ***   dtc   alt   inter   amp   选择   

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;
}

实现效果

  • 打印信息

技术图片

  • 比较结果和工具相同

技术图片

【HC89S003F4开发板】 6crc校验

标签:rtc   0x03   系统   ***   dtc   alt   inter   amp   选择   

原文地址:https://www.cnblogs.com/yywBlogW/p/11369376.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!