你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

通过modbus向stm32内部flash里读写数据出错。

[复制链接]
any012 提问时间:2016-9-13 16:12 /
悬赏12ST金币已解决
芯片是stm32f103vbt6.
通过上位机计算了3组参数,通过modbus将数据发送到单片机定义的三个数据paraa[7],error[7],resRefValue[7];
同时将这三个数组写入到内部flash里;
再次上电时,先读内部flash里的数据放到这三个数组里;
然后再通过modbus读取这三个数组的数据。

modbus文件是网上搜到的(忘了是不是本论坛),感觉挺好用的。为了配合同事编写的上位机软件,自己加了个f6(写参数到板子),f8(读板子的参数)这两个功能码,后边地址是瞎编的。

现在是写参数到板子后,如果不断电,再读取(参数没有重新从flash里读取)是正常的。
如果是上电后读取,parra[]数组正常,error[]和resRefValue[]数组的后三位都是0.

写入的参数

写入的参数
      

读出的参数

读出的参数


stm32内部flash编程,参考的是正点原子和野火的历程。

  1. void FlashRead(void)
  2. {
  3.         u8 i;
  4.         STMFLASH_Read(FLASH_SAVE_ADDR, ¶a[0].u16_value[0], 14);                                
  5.         STMFLASH_Read(FLASH_SAVE_ADDR+0x0400, &error[0].u16_value[0], 7);               
  6.         STMFLASH_Read(FLASH_SAVE_ADDR+0x0800, &resRefValue[0].u16_value[0], 7);        
  7.         
  8.         for(i = 0; i < 6; i++)
  9.                 printf("\r\nparaa[%d] = %f", i, paraa[i].f_value);
  10.         for(i = 0; i < 6; i++)
  11.                 printf("\r\nerror[%d] = %d", i, error[i].s16_value[0]);
  12.         for(i = 0; i < 7; i++)
  13.                 printf("\r\nresRefValue[%d] = %d", i, resRefValue[i].u16_value[0]);
  14. }

  15. void FlashWrite(void)
  16. {
  17.         STMFLASH_Write(FLASH_SAVE_ADDR, ¶a[0].u16_value[0], 14);
  18.         STMFLASH_Write(FLASH_SAVE_ADDR+0x0400, &error[0].u16_value[0], 7);
  19.         STMFLASH_Write(FLASH_SAVE_ADDR+0x0800, &resRefValue[0].u16_value[0], 7);
  20. }
复制代码



内部flash.zip (423.59 KB, 下载次数: 33)

最佳答案

查看完整内容

楼上正解,看看有无加解锁操作。还有你说的不掉电数据读取正常,先测试测试写完之后,修改一下数据缓冲区的内容,再读,看看有无相同。如果读不成功,缓冲区的内容也是没有修改的。
收藏 2 评论5 发布时间:2016-9-13 16:12

举报

5个回答
高二毛 回答时间:2016-9-13 16:12:47
楼上正解,看看有无加解锁操作。还有你说的不掉电数据读取正常,先测试测试写完之后,修改一下数据缓冲区的内容,再读,看看有无相同。如果读不成功,缓冲区的内容也是没有修改的。
yklstudent-1794 回答时间:2016-9-13 17:30:36
写FLASH不用解锁加锁吗?

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

any012 回答时间:2016-9-14 09:05:00
yklstudent-1794 发表于 2016-9-13 17:30
写FLASH不用解锁加锁吗?

调用用到的这个函数,
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite){};
里面是有flash的解锁加锁的。
这部分是参考整点原子/野火例程的,就没有贴出来。
any012 回答时间:2016-9-14 09:54:04
高二毛 发表于 2016-9-14 08:44
楼上正解,看看有无加解锁操作。还有你说的不掉电数据读取正常,先测试测试写完之后,修改一下数据缓冲区的 ...

缓冲区数据读取是正常的。
问题应该是在将缓冲区数据写入到内部flash里或从内部flash里读出数据到缓冲区,出的问题。
现在也不知道是写入出的问题还是读出时出的问题。
any012 回答时间:2016-9-14 11:15:43
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite){};
这个函数引用错了,第三个参数应该是字节数。
我的三个数组,分别寸的是32位浮点数,16位符号数,16位无符号数。
7组数据,所以第三个参数,应对应为28,14,14;

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版