在线时间447 小时
UID3267972
ST金币1822
蝴蝶豆17
注册时间2016-5-3
该用户从未签到
论坛元老
- 最后登录
- 2022-5-20
|
12ST金币
芯片是stm32f103vbt6.
通过上位机计算了3组参数,通过modbus将数据发送到单片机定义的三个数据paraa[7],error[7],resRefValue[7];
同时将这三个数组写入到内部flash里;
再次上电时,先读内部flash里的数据放到这三个数组里;
然后再通过modbus读取这三个数组的数据。
modbus文件是网上搜到的(忘了是不是本论坛),感觉挺好用的。为了配合同事编写的上位机软件,自己加了个f6(写参数到板子),f8(读板子的参数)这两个功能码,后边地址是瞎编的。
现在是写参数到板子后,如果不断电,再读取(参数没有重新从flash里读取)是正常的。
如果是上电后读取,parra[]数组正常,error[]和resRefValue[]数组的后三位都是0.
写入的参数
读出的参数
stm32内部flash编程,参考的是正点原子和野火的历程。
- void FlashRead(void)
- {
- u8 i;
- STMFLASH_Read(FLASH_SAVE_ADDR, ¶a[0].u16_value[0], 14);
- STMFLASH_Read(FLASH_SAVE_ADDR+0x0400, &error[0].u16_value[0], 7);
- STMFLASH_Read(FLASH_SAVE_ADDR+0x0800, &resRefValue[0].u16_value[0], 7);
-
- for(i = 0; i < 6; i++)
- printf("\r\nparaa[%d] = %f", i, paraa[i].f_value);
- for(i = 0; i < 6; i++)
- printf("\r\nerror[%d] = %d", i, error[i].s16_value[0]);
- for(i = 0; i < 7; i++)
- printf("\r\nresRefValue[%d] = %d", i, resRefValue[i].u16_value[0]);
- }
- void FlashWrite(void)
- {
- STMFLASH_Write(FLASH_SAVE_ADDR, ¶a[0].u16_value[0], 14);
- STMFLASH_Write(FLASH_SAVE_ADDR+0x0400, &error[0].u16_value[0], 7);
- STMFLASH_Write(FLASH_SAVE_ADDR+0x0800, &resRefValue[0].u16_value[0], 7);
- }
复制代码
内部flash.zip
(423.59 KB, 下载次数: 34)
|
最佳答案
查看完整内容
楼上正解,看看有无加解锁操作。还有你说的不掉电数据读取正常,先测试测试写完之后,修改一下数据缓冲区的内容,再读,看看有无相同。如果读不成功,缓冲区的内容也是没有修改的。
|