以前都是使用软件crc,浪费计算时间,有硬件crc不用,真是可惜。本次使用硬件crc对modbus的crc进行计算,测试时,遇到点问题,自带的库文件里面,把方法写死了,结果和modubs的对不上。
文档上说的公式和modbus是一样的,那么就有可能是初值与异或值不同造成的,先相信硬件不会出错嘛。
自带的crc库也不要用了,一共没有用到3个寄存器,直接搞。
uint16_t rt_hw_get_crc16_modbus(uint8_t *pdat, uint16_t len)
{
crc->crc16d = 0xffff; //init dat
crc->crc16ctrl = 0x0002; //lsb
while (len--)
{
crc->crc16dat = *pdat++;
}
return (crc->crc16d);
}
当然初始化时钟是要加上的啦
rcc_enableahbperiphclk(rcc_ahb_periph_crc, enable);
就是这么简单,再不用担心写错crc代码了,肯定是算错了,硬件不会错
给它上个锁,避免被抢占打断后,计算出错。
#include
#include
#include
#include
/* 指向互斥量的指针 /
static rt_mutex_t crc_mutex = rt_null;
void hw_crc_init(void)
{
rcc_enableahbperiphclk(rcc_ahb_periph_crc, enable);
/ 创建一个动态互斥量 */
crc_mutex = rt_mutex_create(crc_mutex, rt_ipc_flag_prio);
if (crc_mutex == rt_null)
{
rt_kprintf(create crc mutex failed.n);
return;
}
}
uint16_t rt_hw_get_crc16(uint8_t *pdat, uint16_t len)
{
uint16_t crc_16 = 0;
rt_mutex_take(crc_mutex, rt_waiting_forever);
/ init dat /
crc->crc16d = 0xffff;
/ lsb /
crc->crc16ctrl = 0x0002;
while (len--)
{
crc->crc16dat = *pdat++;
}
crc_16 = crc->crc16d;
rt_mutex_release(crc_mutex);
return crc_16;
}
发现问题,这个数据太迷惑了,以上代码有问题,请不要使用
终于可以正确的使用crc硬件进行modbus的crc16计算了.
uint16_t rt_reverse_16(uint16_t dat)
{
uint16_t x = dat;
x = (((x & 0xaaaa) >> 1) | ((x & 0x5555) 2) | ((x & 0x3333) 4) | ((x & 0x0f0f) 8) | (x crc16d = 0xffff;
crc->lrc = 0;
while (len--)
{
crc->crc16dat = *pdat++;
}
crc_16 = crc->crc16d;
rt_mutex_release(crc_mutex);
crc_16 = rt_reverse_16(crc_16);
return crc_16;
}
这么搞之后就是modbus的crc16啦。
5G SA商用,湖南电信助力制造企业向“智”转型
什么是NB(笔记本)国际联保
中国云游戏市场发展前景如何?
一文看懂gmsk调制工作原理_特点及应用
欧洲迎来首个5G商用网络 4/5G动态频谱共享
N32G45x硬件CRC计算Modbus的CRC16
小米MIX设计师与雷军再次合作,新产品让众人期待
如何在 AC/DC 设计中降低待机时的可闻噪声和功耗
拥抱异构集成的新机遇,芯和半导体2021用户大会成功召开
音频体验提升的关键,蓝牙芯片的音频DSP技术有哪些升级
分享微博在特征Embedding建模方向做的一些工作
智信通与妙优车签署战略合作协议,Y26智能终端谱写金融风控领域新篇章
理解功率MOSFET的RDS(ON)温度系数特性
富士康计划削减29亿美元成本 裁员是必然趋势
ADW2XX系列导轨式多回路电力仪表介绍
智能锁的使用寿命有多久?坤坤智能锁告诉你
水产养殖水质在线监测常规五参数氨氮在线监测
工业机器人飞速发展 新的市场机遇下使日本很多公司的触角进一步延伸
新能源汽车线束气密性检测的意义是什么?-海瑞思
5G由标准到商用的浪潮来得更加迅猛