OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6945|回复: 2

为什么STM8 IAP 升级 写入不了APP数据

[复制链接]

19

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2012-11-12
在线时间
36 小时
发表于 2018-3-23 22:59:40 | 显示全部楼层 |阅读模式
file:///C:\Users\xg\AppData\Roaming\Tencent\Users\764017114\QQ\WinTemp\RichOle\GJM}NW1~QCP]0UYXM4S@$OT.pngfile:///C:\Users\xg\AppData\Roaming\Tencent\Users\764017114\QQ\WinTemp\RichOle\GJM}NW1~QCP]0UYXM4S@$OT.png写入不成功,读出来的全是空的

#define MAIN_USER_RESET_ADDR  0x9A00ul   // app 地址


u16  McuDataStartAddressValue =MAIN_USER_RESET_ADDR;

                                                        Iap_To_Write_AppBin(McuDataStartAddressValue,RecCartVaildDataBuffer,RecFileVaildDataTotalLength);
                                                        McuDataStartAddressValue+=1024;



void  Iap_To_Write_AppBin(u16 Faddress, u8 *pufdata,u16 puflength)
{
                u16 ubBuffPtr =0;       

        FLASH_Unlock(FLASH_MEMTYPE_PROG);

        for(ubBuffPtr = 0; ubBuffPtr < puflength; ubBuffPtr++)
        {
                FLASH_EraseByte(Faddress+ubBuffPtr);
               
            FLASH_ProgramByte((u32)(Faddress+ubBuffPtr),  pufdata[ubBuffPtr]);
        }

       
      FLASH_Lock(FLASH_MEMTYPE_PROG);               
}



void FLASH_ProgramByte(u32 Address, u8 Data)
{
    /* Check parameters */
    assert_param(IS_FLASH_ADDRESS_OK(Address));
    *((PointerAttr u8*) Address) = Data;
}
void FLASH_EraseByte(u32 Address)
{
    /* Check parameter */
    //assert_param(IS_FLASH_ADDRESS_OK(Address));

    /* Erase byte */
   *(PointerAttr u8*) (u16)Address = FLASH_CLEAR_BYTE;

}
/**
  * @}


为什么请大神指导   ,STTOOL 工具读出来的9A00之后都没有数据。

R@AI0ACK]]KR}8C{P{AZJ}A.png
I$4XV_REO$JR`0QI[H3[YKF.png
GJM}NW1~QCP]0UYXM4S@$OT.png
D$OU[CP}J37L{PL@]_1PENU.png
GG`ZZF]`0EU69HC%U1$Y8LE.png
}Q4GZO`PKY~VN_J@C9X4K43.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

4

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1637
金钱
1637
注册时间
2017-1-3
在线时间
132 小时
发表于 2018-4-1 23:42:47 | 显示全部楼层

回帖奖励 +12 金钱

愚人节,我来胡说两句

你这放几张图,没有源码工程,给了80%的代码,
谁也不晓得你其他部分有问题?还是本身这段代码的问题?

Iap_To_Write_AppBin(McuDataStartAddressValue,RecCartVaildDataBuffer,RecFileVaildDataTotalLength);
这个函数,3个参数,你只给出了第1个参数,其他2个什么情况,也不知道呀

再说了
Flash原来的数据,是有还是没有?
原本有其他数据的话,那么至少你擦除成功;如果原本就是0x00,那就说明不了什么

再者用库函数的话,至少你得说一下用的是哪个版本的库,老一点的库,本身就有bug

回复 支持 反对

使用道具 举报

0

主题

43

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1713
金钱
1713
注册时间
2017-2-22
在线时间
296 小时
发表于 2018-7-15 02:30:29 | 显示全部楼层
首先你那个写入Flash的函数是用什么编程模式?
stm8本身支持3种Flash编程模式
1.字编程模式,可以按一个字来写入,写入前自动执行擦除无需写代码处理的。
2.块编程模式,也是硬件自动擦除,但是以块为单位写入(具体块大小要按型号容量不同有区分,其实主要是影响写入速度而已),关键是块编程模式时不能执行Flash内的代码,写入相关的函数代码必须全部加载到RAM来执行。
3.快块编程模式写入时不自动执行擦除动作,需要写入前执行你写的擦除指定块代码,所以写入速度比块编程模式更快(但同一地址如果没有擦除执行两次写入不同数据将导致数据错误),执行时对Flash操作的代码也必须先加载到RAM来执行。

看你上面的代码里并没发现有设置Flash编程模式的语句命令。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 19:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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