STM32L053 CRC16-Modbus配置

发布者:丹青妙手最新更新时间:2019-07-22 来源: eefocus关键字:STM32L053  CRC16-Modbus  配置 手机看文章 扫描二维码
随时随地手机看文章

STM32L053 CRC16-Modbus配置

一切为了实用,直接上代码

const uint8_t auchCRCHi[] =

{

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,

0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,

0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,

0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

0x80, 0x41, 0x00, 0xC1, 0x81, 0x40

} ;

/* CRCLo */

const uint8_t auchCRCLo[] =

{

0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,

0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,

0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,

0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,

0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,

0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,

0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,

0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,

0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,

0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,

0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,

0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,

0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,

0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,

0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,

0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,

0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,

0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,

0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,

0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,

0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,

0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,

0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,

0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,

0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,

0x43, 0x83, 0x41, 0x81, 0x80, 0x40

} ;

uint16_t crc16(uint8_t * frame, uint16_t len )

{

unsigned char uchCRCHi = 0xFF ;

unsigned char uchCRCLo = 0xFF ;


unsigned uIndex ;


while (len--)

{

    uIndex = uchCRCHi ^ *frame++ ;

    uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;

    uchCRCLo = auchCRCLo[uIndex] ;

}


return (uchCRCHi << 8 | uchCRCLo);

1

2

3

4

5

6

7

8

9

10

}


以上是查表法算CRC16/modbus

CRC_HandleTypeDef CrcHandle;

CrcHandle.Instance = CRC;


CrcHandle.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_DISABLE;

CrcHandle.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_DISABLE;

CrcHandle.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_BYTE;

CrcHandle.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_ENABLE;

CrcHandle.Init.InitValue = 0xFFFF;

CrcHandle.Init.GeneratingPolynomial = 0x8005;

CrcHandle.Init.CRCLength = CRC_POLYLENGTH_16B;

CrcHandle.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;


/* DeInitializes the CRC peripheral */

HAL_CRC_DeInit(&CrcHandle);


/* Initialise CRC */

HAL_CRC_Init(&CrcHandle);


if(HAL_CRC_Init(&CrcHandle) != HAL_OK)

{

/* Initialization Error */

Error_Handler();

}


以上是STM32L053CRC配置记得把crc时钟打开

uint8_t data[10] = {5,2,3,4,5,6,7,8,9,10};

这是需要计算的数据

uwCRCValue = HAL_CRC_Accumulate(&CrcHandle, (uint32_t *)data, 10);

crc = crc16(data,10);

以上是两种算法

uwCRCValue = 0x000016F2

crc = F216

大小端需要转换一下

crc = __REV16(crc);

由于手头只有STM32L053板子所以只测试了STML053,ST家族的芯片估计都是这样配置,用的是HAL库。



关键字:STM32L053  CRC16-Modbus  配置 引用地址:STM32L053 CRC16-Modbus配置

上一篇:STM32下一次程序后J-link不能识别问题解决
下一篇:STM32CubeMX学习笔记——STM32H743窗口看门狗WWDG

推荐阅读最新更新时间:2024-11-13 15:11

STM32L051上使用RT-Th (二、CubeMX配置)
前言 上篇文章我们仅仅是开了个头,使用 RT-Thread Studio 新建了一个基于 STM32L051 的 RT-Thread Nano 工程,本文我们就在在这个工程的基础上使用 STM32CubeMX 做STM32的基本配置。 ❤️ 本 RT-Thread 专栏记录的开发环境: RT-Thread记录(一、RT-Thread 版本、RT-Thread Studio开发环境 及 配合CubeMX开发快速上手) RT-Thread记录(二、RT-Thread内核启动流程 — 启动文件和源码分析) ❤️ RT-Thread 内核篇系列博文链接: RT-Thread记录(三、RT-Thread 线程操作函数及线程管理与 FreeR
[单片机]
STM32L051上使用RT-Th (二、CubeMX<font color='red'>配置</font>)
STM32F1系列基本定时器HAL库配置
时钟的概念了解完就趁热打铁进行定时器的简单讲解,定时器的操作是十分重要的,他不仅可以用于计数/定时(两者其实一个道理),还可以生成PWM,输入捕获等等,高级定时器可以用于工业电机上的有关操作。所以,我们专门讲解一波基本定时器,并用它做一个闪烁灯小实验。 定时器简介 在STM32F1上,常规定时器分为三种定时器:高级,通用,基本; 高级定时器的功能涵盖通用定时器,通用定时器功能涵盖基本定时器 以基本定时器实现计数功能,这里说的并不准确,应该说是定时功能, 定时是对周期固定的脉冲信号进行计数如APB(MCU的外设时钟APB),而计数是对周期不确定(可能固定也可能不固定)的脉冲信号进行计数。 更为深入的比喻:就是水杯中装水的
[单片机]
STM32F1系列基本定时器HAL库<font color='red'>配置</font>
LPC1768 CPU 时钟配置
调试LPC1768, NXP的库好像不如Luminary的好用(大家都这么说,也就跟着人云亦云了)。对照LPC1768的手册看了看Keil例程的PLL0配置过程,记录如下: #if (CLOCK_SETUP) LPC_SC- SCS = SCS_Val; // 启用外部主时钟 if (SCS_Val & (1 5)) { while ((LPC_SC- SCS & (1 6)) == 0); } //PLL倍频出来的时钟送给CPU前的分频,CCLKCFG_Val=3,为4分频
[单片机]
LPC1768 CPU 时钟<font color='red'>配置</font>
STM32 DMA通道外设基地址的配置
简介:看了许多资料都没有讲如何配置DMA通道外设基地址 ADC 规则数据寄存器(ADC_DR)的地址偏移:4Ch #define ADC1_DR_Address ((u32)0x4001244C) 就是ADC1的外设基地址(0x4001 2400)加上ADC数据寄存器(ADC_DR)的偏移地址(0x4c)计算得到的。 Example: /************************************************************************************ * 文件名 :main.c * 描述 :串口1(USART1)向电脑发送当前ADC1的转换电压值 * 库版本 :ST3.5.0
[单片机]
中兴AXON天机2配置全曝光 太让人意外
    4月26日消息,进入2016年,手机拍照再次被诸多手机厂商作为主打功能之一而大力宣传,其中双镜头随华为P9的发布也成为近期一个热词。今日,又一款新机中兴AXON天机2现身工信部,配置信息全被曝光,但昔日成双成对的后置摄像头如今却是形单影只,让人颇感意外。 中兴XON天机2   中兴AXON天机2机身尺寸为154×77×9.8mm,重175克(比之前更具分量感),保留了正面额头和下巴上标志性的云纹设计,大体和中兴 AXON天机设计风格一致,但细节处却有多处不同。正面前置镜头上移到了额头边缘,背部似乎没了皮纹工艺,双镜头也变成了一个,方形指纹识别区变成了圆 形,补光灯也从侧面移到了中部。 中兴AXON天机2
[手机便携]
工业以太网网络配置_工业以太网组网方式
  工业以太网网络配置   工业以太网的网络配置主要包括以下几个方面:   设备接入:需要将工业设备连接到工业以太网中,通常采用交换机实现设备间的连接和通信。设备可以通过网线或光纤连接到交换机上,形成一个局域网络。   IP地址配置:需要为工业设备和交换机配置IP地址,以确保它们之间可以互相通信。通常采用静态IP地址分配方式,也可以采用动态主机配置协议(DHCP)实现自动分配IP地址。   子网掩码配置:需要为工业以太网配置子网掩码,以划分不同的子网,并且规定子网之间的通信方式。通常采用标准的子网掩码,如255.255.255.0等。   网关配置:需要为工业以太网配置网关,以实现不同子网之间的通信。网关通常是一个路由器或者交换机
[嵌入式]
三星Note20+相机配置解密:一亿像素主摄/激光对焦
近日有关三星 Galaxy Note 20 系列手机的信息逐渐增多,昨日下午博主 @冰宇宙 也发布了三星 Galaxy Note20 + 相机配置的爆料信息。   从博主曝光的信息来看,三星 Galaxy Note20 + 将采用 108MP HM1 1/1.33 主摄 + 13MP 3M5 1/3.4 潜望式摄像头 + 12MP 2L3 1/2.55 超广角摄像头 + 激光对焦传感器 + 最高 50X 变焦潜望长焦镜头。同时激光对焦模块将辅助 HM1 主摄进行对焦。同时三星 Galaxy Note20 系列有望首发自家适合 5G 手机的节能 / 护眼屏幕,其有害蓝光低于 6.5%。 IT之家汇总报道,根据现
[手机便携]
越来越多车厂将主动安全升级为一项标准配置
在目前的汽车电子主动安全市场上,主要还是欧美一些国际品牌车厂在引导整个市场需求,并制定相关的行业标准,特别是在欧洲、北美地区的一些国家均对汽车主动安全系统提出了相应的法规或强制要求等,例如之前的IEC61508,以及目前的ISO-26262等均是欧美市场的标准。据了解,2015年欧洲车厂可能将全面导入符合ISO26262标准的车用元件。 德州仪器(TI)半导体事业部汽车电子中国业务拓展经理姜辉 ISO 26262标准根据安全风险程度对系统或系统某组成部分确定划分由A到D的安全需求等级(Automotive Safety Integrity Level 汽车安全完整性等级ASIL),其中D级为最高等级,需要最严苛的安全需求
[汽车电子]
越来越多车厂将主动安全升级为一项标准<font color='red'>配置</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved