发新帖本帖赏金 1.00元(功能说明)我要提问
12下一页
返回列表
打印

一些函数的使用问题

[复制链接]
2889|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
djz1992|  楼主 | 2016-5-16 10:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.CRC检验函数:uint16_t Crc16(uint16_t ui16Crc, //CRC校验值的初始值,如果缓冲区都是需要校验的数,写0即可const uint8_t * pui8Data, //缓冲区
uint32_t ui32Count)//缓冲区有多少个字节
uint8_t buf[6]={0x01,0x02,0x03,0x04,0x05,0x06};
uint16_t crc,crc1;
        crc = GetCRC16(buf,6);          //计算CRC校验值,自己写的查表法函数
        crc1=Crc16(0,buf,6);      //TIVA自带的函数

程序运行结果

CRC计算软件结果(高低相反)

问题:为什么TIVA自带的函数计算出来不一样?问题在哪呢


相关帖子

沙发
dirtwillfly| | 2016-5-16 14:03 | 只看该作者
1、因为算法不一样
crc16有很多种算法,要使用一样的多项式才能得到相同的结果

使用特权

评论回复
板凳
dirtwillfly| | 2016-5-16 14:10 | 只看该作者

使用特权

评论回复
地板
xyz549040622| | 2016-5-16 15:22 | 只看该作者
CRC校验只是一个算法,里面的CRC值是需要自己填充的,你不知道TIVA 里面的校验值是哪些,出来不一样很正常。

使用特权

评论回复
5
xyz549040622| | 2016-5-16 15:26 | 只看该作者
djz1992 发表于 2016-5-16 10:20
@xyz549040622 @dirtwillfly 二位大神,又是我
另外那个仿真时候run》clock》enable和查看函数运行时间为什 ...

这个没用过,我试试看。

使用特权

评论回复
6
djz1992|  楼主 | 2016-5-16 15:40 | 只看该作者
本帖最后由 djz1992 于 2016-5-16 16:40 编辑
xyz549040622 发表于 2016-5-16 15:22
CRC校验只是一个算法,里面的CRC值是需要自己填充的,你不知道TIVA 里面的校验值是哪些,出来不一样很正常 ...

看来我照抄来的校验程序跟那个CRC计算器居然还是同一个算法。。。也是运气
另外systick函数来看程序运行时间,这个计数是递减的吗?我用了一下好像是递减
我写成这样,count在定时器里累加,进函数时清零,在出函数加断点,SysTickValueGet也在进出函数时取值并求差
结果计算出来num对应的时间值很小,十几微秒,而count对应的时间值比较大,有几十微秒,相差很大,这是为什么?
我写了一个五秒的delay,count计算是五秒无误,那到底哪个准确?
函数a()

   SysTickPeriodSet(10000000);
   SysTickEnable();
   count=0;
   ui32Value1 = SysTickValueGet();
   。。函数主体。。
   ui32Value2 = SysTickValueGet();

   num=ui32Value1 -ui32Value2;
(断点)



使用特权

评论回复
7
djz1992|  楼主 | 2016-5-16 15:45 | 只看该作者
dirtwillfly 发表于 2016-5-16 14:03
1、因为算法不一样
crc16有很多种算法,要使用一样的多项式才能得到相同的结果
...

我配置80Mhz,7路采样,12800hz的采样频率,主函数计算abc三相电流电压的有效值,我发现主函数内再加串口发送,运行会出错
表现为看门狗一直复位,想看看各函数运行时间,查看是不是运行不过来了

使用特权

评论回复
8
gbbfbaa| | 2016-5-16 16:02 | 只看该作者
本帖最后由 dirtwillfly 于 2016-5-16 21:36 编辑

~~~~
(出处: 21ic电子技术论坛)

使用特权

评论回复
9
dirtwillfly| | 2016-5-16 21:34 | 只看该作者
gbbfbaa 发表于 2016-5-16 16:02
扒一扒 chipon 的芯片能应用到哪些产品中
https://bbs.21ic.com/forum.php?mod=viewthread&tid=1591378&from ...

大哥,你越界了

使用特权

评论回复
10
angerbird| | 2016-5-16 21:41 | 只看该作者
crc16校验的是最常见的校验方法的。

使用特权

评论回复
11
djz1992|  楼主 | 2016-5-17 14:17 | 只看该作者
extern _CODE_ACCESS int sprintf(char *_string, const char *_format, ...)
               __ATTRIBUTE ((__format__ (__printf__, 2, 3)));
程序运行到这个函数里的sprintf函数,就会出错,进startup里的FaultISR(void)或者ResetISR(void)
我是要把六个float值参杂在控制指令组成的字符串里发到一个显示屏显示,这么使用是不是有什么问题?
一直跑死

@dirtwillfly @xyz549040622 大神

使用特权

评论回复
12
dirtwillfly| | 2016-5-17 14:56 | 只看该作者
djz1992 发表于 2016-5-17 14:17
extern _CODE_ACCESS int sprintf(char *_string, const char *_format, ...)
               __ATTRIBUTE  ...

sprintf函数还是比较耗资源的,堆栈空间不够就经常跑飞

使用特权

评论回复
13
djz1992|  楼主 | 2016-5-17 15:09 | 只看该作者
dirtwillfly 发表于 2016-5-17 14:56
sprintf函数还是比较耗资源的,堆栈空间不够就经常跑飞

是嘛,我把sprintf函数注释掉,发送固定的一长串就可以的,这个函数是不是用错了?还是有什么要求?或者我把一长串字符串分段,需要float转字符串的再用sprintf

使用特权

评论回复
14
djz1992|  楼主 | 2016-5-17 15:46 | 只看该作者
dirtwillfly 发表于 2016-5-17 14:56
sprintf函数还是比较耗资源的,堆栈空间不够就经常跑飞

ADCSequenceConfigure(ADC0_BASE,0,ADC_TRIGGER_TIMER, 0);
IntPrioritySet(INT_ADC0SS0,0);//优先级0。。。       
。。。
IntPrioritySet(INT_TIMER0A,1);//优先级1


我设置ADC采样为定时器触发,ADC中断优先级0,定时器中断优先级1.
我在ADC中断和定时器中断里加断点,发现先进的定时器中断。是不是优先级设置没有生效呢?该怎么判断?

使用特权

评论回复
15
dirtwillfly| | 2016-5-17 17:06 | 只看该作者
djz1992 发表于 2016-5-17 15:46
ADCSequenceConfigure(ADC0_BASE,0,ADC_TRIGGER_TIMER, 0);
IntPrioritySet(INT_ADC0SS0,0);//优先级0。 ...

这样判断不出的。你使能中断嵌套,在低优先级的中断服务程序里等待一个很长的时间,在这个时间里去触发高优先级中断源,看能不能正确触发。

使用特权

评论回复

打赏榜单

djz1992 打赏了 1.00 元 2016-05-18
理由:有道理!多谢大神指点

16
1988020566| | 2016-5-17 22:23 | 只看该作者
CRC的程序哪来的?

使用特权

评论回复
17
1988020566| | 2016-5-17 22:24 | 只看该作者
没用过别人的CRC,自己写一个试试

使用特权

评论回复
18
smilingangel| | 2016-5-17 22:49 | 只看该作者
crc16校验的比较常用的。

使用特权

评论回复
19
djz1992|  楼主 | 2016-5-18 08:42 | 只看该作者
dirtwillfly 发表于 2016-5-17 17:06
这样判断不出的。你使能中断嵌套,在低优先级的中断服务程序里等待一个很长的时间,在这个时间里去触发高 ...

那个sprintf一直用不对,我该怎么把float a,变成一个字符串,然后跟前后其他字符串一起发出去呢

使用特权

评论回复
20
dirtwillfly| | 2016-5-18 09:57 | 只看该作者
djz1992 发表于 2016-5-18 08:42
那个sprintf一直用不对,我该怎么把float a,变成一个字符串,然后跟前后其他字符串一起发出去呢 ...

你把堆栈改大一点试试。
或者自己写个float转字符串的函数。
那个sprintf占用堆栈比较大

使用特权

评论回复
发新帖 本帖赏金 1.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:人生苦短,冬日苦长,正是青葱,却无骄阳

115

主题

620

帖子

5

粉丝