搜索
查看: 6760|回复: 5

[已解决] 通过modbus向stm32内部flash里读写数据出错。

[复制链接]

该用户从未签到

76

主题

759

帖子

17

蝴蝶豆

论坛元老

最后登录
2022-5-20
发表于 2016-9-13 16:12:46 | 显示全部楼层 |阅读模式
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, 下载次数: 34)

最佳答案

查看完整内容

楼上正解,看看有无加解锁操作。还有你说的不掉电数据读取正常,先测试测试写完之后,修改一下数据缓冲区的内容,再读,看看有无相同。如果读不成功,缓冲区的内容也是没有修改的。
回复

使用道具 举报

该用户从未签到

4

主题

578

帖子

3

蝴蝶豆

高级会员

最后登录
2020-12-10
发表于 2016-9-13 16:12:47 | 显示全部楼层
楼上正解,看看有无加解锁操作。还有你说的不掉电数据读取正常,先测试测试写完之后,修改一下数据缓冲区的内容,再读,看看有无相同。如果读不成功,缓冲区的内容也是没有修改的。
回复

使用道具 举报

该用户从未签到

6

主题

547

帖子

62

蝴蝶豆

金牌会员

最后登录
2021-12-18
发表于 2016-9-13 17:30:36 | 显示全部楼层
写FLASH不用解锁加锁吗?

评分

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

查看全部评分

回复

使用道具 举报

该用户从未签到

76

主题

759

帖子

17

蝴蝶豆

论坛元老

最后登录
2022-5-20
 楼主| 发表于 2016-9-14 09:05:00 | 显示全部楼层
yklstudent-1794 发表于 2016-9-13 17:30
写FLASH不用解锁加锁吗?

调用用到的这个函数,
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite){};
里面是有flash的解锁加锁的。
这部分是参考整点原子/野火例程的,就没有贴出来。
回复

使用道具 举报

该用户从未签到

76

主题

759

帖子

17

蝴蝶豆

论坛元老

最后登录
2022-5-20
 楼主| 发表于 2016-9-14 09:54:04 | 显示全部楼层
高二毛 发表于 2016-9-14 08:44
楼上正解,看看有无加解锁操作。还有你说的不掉电数据读取正常,先测试测试写完之后,修改一下数据缓冲区的 ...

缓冲区数据读取是正常的。
问题应该是在将缓冲区数据写入到内部flash里或从内部flash里读出数据到缓冲区,出的问题。
现在也不知道是写入出的问题还是读出时出的问题。
回复

使用道具 举报

该用户从未签到

76

主题

759

帖子

17

蝴蝶豆

论坛元老

最后登录
2022-5-20
 楼主| 发表于 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

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-28 01:47 , Processed in 0.181891 second(s), 41 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表