OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32/FPGA开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 1195|回复: 5

原子哥串口IAP例程的小问题。

[复制链接]

  离线 

2

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2017-8-21
在线时间
45 小时
发表于 2018-6-11 16:38:39 | 显示全部楼层 |阅读模式
30金钱
最近在做bootloader的在线升级,设备芯片是K60的芯片,但是K60没找到例程,就借用了原子个串口IAP的历程。
if(Anyindex == 1 | UPnum==0)
    {
            if(((*(__IO uint32_t*)(0X20001000+4))&0xFF000000)==0x0)
        {
              iap_write_appbin(FLASH_APP1_ADDR + (wirtindex)*2048,UPdata,2048);//更新FLASH代码
              wirtindex++;
              UART_printf(2,"success \r\n");
              memset(UPdata,0,2048);
            }
            Anyindex=0;
            if(UPnum == 0)
            {
               if(((*(__IO uint32_t*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x00000000)//判断是否为0X000000
        {
              iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
        }
              wirtindex=0;
            UPnum=0x00ff;
    }
}


自己的函数就是这个,大致是通过协议下发到设备上每2k的数据进行一次写入,但是在最后Upnum=0 也就是升级数据下发完成以后开始跳转APP的时候  那句if判断是错误的,
得到FLAS_APP1_ADDR+4这个地址上的数值是0xffffffff   打断点调试的时候,第一次2k写入后,数据政策 判断也是对的,但是第二次写入2k数据的时候就变成了0xfffffff  有没有大佬
告诉一下,这句话判断的意义在哪里,附图是原子哥的历程,我也很想不明白判断是为什么。。。。
3Y%`OTJU%R]@JR@U3KI}4KY.png

最佳答案

查看完整内容[请看2#楼]

已解决。是写Flash的时候写重复了。
回复

使用道具 举报

  离线 

2

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2017-8-21
在线时间
45 小时
 楼主| 发表于 2018-6-11 16:38:40 | 显示全部楼层
已解决。是写Flash的时候写重复了。
回复

使用道具 举报

  离线 

11

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2018-4-26
在线时间
18 小时
发表于 2018-6-11 22:37:21 | 显示全部楼层
FLAS_APP1_ADDR+4 这是说你APP的复位地址 也就是确保你的程序是flash程序 位置对, FLAS_APP1_ADDR开头是堆栈地址
回复

使用道具 举报

  离线 

2

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2017-8-21
在线时间
45 小时
 楼主| 发表于 2018-6-12 17:28:52 | 显示全部楼层
有一个新问题,是我进行Flash擦写的时候,(擦写程序用的原子哥的代码修改的)。擦写都是成功但是擦写会影响到别的扇区。

大概是这样:
第一次进行flash擦写是从地址0x10000,进行2k字节的写入,因为k60的班子扇区是2k,所以进行2k的擦写。 擦写完成后我查0x10000+4地址上的数据是正确的,是我写入的数据。
第二次进行flash擦写是从地址0x10000+2048 ,因为前面都写入了数据,开始进行擦写,但是擦写完成后,再去读0x10000+4地址上的数据就变成了0xfffffff全部置1 应该是擦写的时候擦除了(怀疑)
第三次进行flash擦写是从地址0x10000+4096,擦写完成后,我去读0x10000+2048---0x10000+4095地址上的个别数据,都是跟之前写入的一样,未发生擦写错误什么的(这样测试时因为,我觉得每次擦去falsh会多擦)
第四次进行flash擦写是从地址0x10000+6144,擦写完成后,我再去读0x10000+2048---0x10000+4095地址的数据是正确的,但是0x10000+4096---0x10000+6143地址之前的数据都变成了oxfffffff

往后进行测试也是这样,奇数次擦写第一次正确,偶数次擦写完成后,奇数的数据都会被擦除变成
0xffffffff。但是顺序进行擦写后,偶数次擦写的片区数据不会被擦除。有没有大佬可以解释一下,指导一下!!!!!!!!!!!!!!
回复

使用道具 举报

  离线 

519

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
135595
金钱
135595
注册时间
2010-12-1
在线时间
1346 小时
发表于 2018-6-13 00:28:24 | 显示全部楼层
路人曦 发表于 2018-6-12 17:28
有一个新问题,是我进行Flash擦写的时候,(擦写程序用的原子哥的代码修改的)。擦写都是成功但是擦写会影 ...

是不是你对它内部FLASH的处理机制理解有误?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

  离线 

2

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2017-8-21
在线时间
45 小时
 楼主| 发表于 2018-6-14 08:47:05 | 显示全部楼层
正点原子 发表于 2018-6-13 00:28
是不是你对它内部FLASH的处理机制理解有误?

原子哥,呃。。。。指点一下
回复

使用道具 举报

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

本版积分规则




关闭

正点原子STM32/FPGA资料免费洗澡上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-12-10 13:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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