当前位置: 首页 > wzjs >正文

pycharm网站开发优化网站怎么真实点击

pycharm网站开发,优化网站怎么真实点击,咸阳网站建设公司,网站域名解析查询需求 在项目中,需要用到MODBUS CRC16校验,也要用到CRC32的校验,出于效率的考虑,准备用硬件CRC。 CRC 16的参数模型有很多种,我这里用的是MODBUS,对于不同的参数模型,会有不同的参数设置和初值&a…

需求

在这里插入图片描述

在项目中,需要用到MODBUS CRC16校验,也要用到CRC32的校验,出于效率的考虑,准备用硬件CRC。
CRC 16的参数模型有很多种,我这里用的是MODBUS,对于不同的参数模型,会有不同的参数设置和初值,这一点需要注意。
对于CRC32,参数模型只有2种,按需设置即可。

MODBUS CRC16

开启硬件CRC,再设置如下:
在这里插入图片描述
以下是针对MODBUS CRC16生成的代码

void MX_CRC_Init_modbus(void)
{hcrc.Instance = CRC;hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_DISABLE;hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_DISABLE;hcrc.Init.GeneratingPolynomial = 32773;hcrc.Init.CRCLength = CRC_POLYLENGTH_16B;hcrc.Init.InitValue = 0xffff;hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_BYTE;hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_ENABLE;hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;if (HAL_CRC_Init(&hcrc) != HAL_OK){Error_Handler();}
}

CRC32

在这里插入图片描述
以下是针对CRC32生成的代码

void MX_CRC_Init_crc32(void)
{hcrc.Instance = CRC;hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_DISABLE;hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_DISABLE;hcrc.Init.GeneratingPolynomial = 79764919;hcrc.Init.CRCLength = CRC_POLYLENGTH_32B;hcrc.Init.InitValue = 0xffffffff;hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_WORD;hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_ENABLE;hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_WORDS;if (HAL_CRC_Init(&hcrc) != HAL_OK){Error_Handler();}
}

编程

先独立生成工程,各自安好,前面的2个设置都可以得出正确的结果。

接下来的事想的很简单,在需要切换不同的校验模式时,分别调用MX_CRC_Init_modbus()和MX_CRC_Init_crc32()这两个函数,重新初始化CRC外设,然后使用HAL_CRC_Calculate()来计算。
如果不行,再加上初始化之前再加上HAL_CRC_MspDeInit()函数,先做个禁止,再调用前面的初始化函数,应该就可以了吧。

现实是不行。重新初始化之后,CRC相关寄存器的值全部是0,无法使用。

然后尝试寄存器操作,强制重置CRC的相关寄存器,如下图
请添加图片描述
请添加图片描述
结果还是不行,工程原生校验CRC32的话,CRC32就可以正常计算,但MODBUS结果错误。反之也是类似结果。

注意我的注释,寄存器的设置是有先后顺序的,否则结果错乱。

  //CRC 32hcrc.Instance->POL  = 0;             //要先把多项式改为0,否则其他寄存器的值会乱hcrc.Instance->CR   = 0xe0;           //输出反转,输入反转,32位hcrc.Instance->INIT = 0xffffffff;   //置初值hcrc.Instance->DR   = 0xffffffff;   //置初值hcrc.Instance->IDR  = 0;hcrc.Instance->POL  = 0x04c11db7;    //多项式的值hcrc.Instance->CR  |= 0x01;          //复位,准备开始计算
  //MODBUS CRC 16hcrc.Instance->POL = 0;             //要先把多项式改为0,否则其他寄存器的值会乱hcrc.Instance->CR = 0xa8;           //输出反转,输入反转,32位hcrc.Instance->INIT = 0x0000ffff;   //置初值hcrc.Instance->DR = 0x0000ffff;     //置初值hcrc.Instance->IDR = 0;hcrc.Instance->POL = 0x8005;    //多项式的值hcrc.Instance->CR |= 0x01;          //复位,准备开始计算

CRC相关的就这么几个寄存器,我全设置一遍后,还是不能得出正确结果,这就尴尬了。

问题最终解决

在调试时,偶然发现HAL_CRC_Calculate()这个函数的调用时,第1个参数hcrc这个结构体,它还有自己的其他参数。

如果只更改CRC的5个寄存器的参数的话,hcrc结构体中的变量并未更改,这就导致在不同的设置做切换时,不能得出正确结果。

下图是CRC32时,hcrc结构体的数据
请添加图片描述
下图是MODBUS CRC16时,hcrc结构体的数据
请添加图片描述我们修改参数,一般都只在Instance中修改,但这玩意还需要修改Init,和InputDataFormat才行。
代码如下:
由于CRC32用得不是很频繁,所以将模式切换代码放在LL_hw_crc32()函数中,在MODBUS模式时,就不用模式切换了,省点执行过程。
注意CRC32时,有个取反操作

u32 LL_hw_crc32(u32* pdata, u16 len) //长度是按照字为单位,即1表示4个字节
{u32 crc32;//CRC 32hcrc.Instance->POL  = 0;             //要先把多项式改为0,否则其他寄存器的值会乱hcrc.Instance->CR   = 0xe0;           //输出反转,输入反转,32位hcrc.Instance->INIT = 0xffffffff;   //置初值hcrc.Instance->DR   = 0xffffffff;   //置初值hcrc.Instance->IDR  = 0;hcrc.Instance->POL  = 0x04c11db7;    //多项式的值hcrc.Instance->CR  |= 0x01;          //复位,准备开始计算hcrc.Init.DefaultInitValueUse     = 1;hcrc.Init.DefaultPolynomialUse    = 1;hcrc.Init.GeneratingPolynomial    = 0x04c11db7;hcrc.Init.CRCLength               = 0;hcrc.Init.InitValue               = 0xffffffff;hcrc.Init.InputDataInversionMode  = 0x60;hcrc.Init.OutputDataInversionMode = 0x80;hcrc.InputDataFormat              = 3;crc32 = ~HAL_CRC_Calculate(&hcrc, (u32*)pdata, len);//MODBUS CRC 16hcrc.Instance->POL = 0;             //要先把多项式改为0,否则其他寄存器的值会乱hcrc.Instance->CR = 0xa8;           //输出反转,输入反转,32位hcrc.Instance->INIT = 0x0000ffff;   //置初值hcrc.Instance->DR = 0x0000ffff;     //置初值hcrc.Instance->IDR = 0;hcrc.Instance->POL = 0x8005;    //多项式的值hcrc.Instance->CR |= 0x01;          //复位,准备开始计算hcrc.Init.DefaultInitValueUse     = 1;hcrc.Init.DefaultPolynomialUse    = 1;hcrc.Init.GeneratingPolynomial    = 0x8005;hcrc.Init.CRCLength               = 8;hcrc.Init.InitValue               = 0xffff;hcrc.Init.InputDataInversionMode  = 0x20;hcrc.Init.OutputDataInversionMode = 0x80;hcrc.InputDataFormat              = 1;return crc32;
}
u16 LL_hw_crc16(u8* pdata, u8 len)
{u16 crc;crc = HAL_CRC_Calculate(&hcrc, (u32*)pdata, len);return crc;
}

通过这两个函数,即可实现硬件CRC计算,在2个不同的模式之间正确切换。

其他模式请自行摸索。

http://www.dtcms.com/wzjs/115208.html

相关文章:

  • 做淘客网站需要营业执照吗制作网页用什么软件
  • 重庆潼南网站建设哪家好成人电脑基础培训班
  • 营销型网站设计难不难市场调研报告ppt
  • 点广告挣钱网站有哪些seo实战教程
  • 做静态网站的参考文献客户关系管理系统
  • 淮安市住房和城乡建设局网站首页东莞百度seo推广公司
  • 个人网站备案资料产品推广步骤
  • 深圳做网站 创同盟百度客服中心人工在线
  • 做互联网产品和运营必备的网站百度移动应用
  • 做调查赚钱靠谱的网站有哪些百度安装
  • 网易企业邮箱登入入口南京百度关键字优化价格
  • 人和动物做的网站百度推广搜索排名
  • 企业网站建设市场的另一面病毒式营销案例
  • 网站设计是什么专业发帖推广哪个平台好
  • 网站建设公司价位seo专业论坛
  • web网页是什么惠州seo快速排名
  • 厦门医院网站建设seo网站推广企业
  • 大连网站优化公司店铺推广软文案例
  • 石家庄手机网站建站店铺推广怎么做
  • 360网站做推广扬州seo推广
  • 网站建设完成推广普通话手抄报内容文字
  • 网站视频开发平台最新军事消息
  • 大连哪个公司做网站开发的百度关键词广告怎么收费
  • 北京公司排名100seo的全称是什么
  • 前端一般模仿什么网站网站标题seo外包优化
  • 成都网站建设高端搜索引擎优化的各种方法
  • 住房和城乡建设部网站预售证全国知名网站排名
  • 给 小企业 建设网站怎样才能在百度上发布信息
  • 毕业设计代做网站机械临安网站seo
  • 微网站设计企业seo技术是什么意思