搜索
bottom↓
回复: 20

C8051F120关于bootloader地址设置请教

[复制链接]

出0入0汤圆

发表于 2022-1-12 13:56:24 | 显示全部楼层 |阅读模式
头一次做C8051F120bootloader , 其Flash 地址 如图,一共128Kb ,我想把boot放在高地址区域0x1E201 - 0x1FBFD
从0-0x1E000 放写入的APP,每次上电需要后跳转到boot区,看是否需要更新。

我在设置 off-chip 时候写入0x1e000 显示无效的地址

请问下keil应该如何设置。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入475汤圆

发表于 2022-1-12 14:12:16 来自手机 | 显示全部楼层
晕,我刚折腾了一周,刚刚可以了,走了不少弯路,移植了那么多芯片的boot loader就他家的遇坑了

出0入0汤圆

 楼主| 发表于 2022-1-12 16:05:01 | 显示全部楼层
1a2b3c 发表于 2022-1-12 14:12
晕,我刚折腾了一周,刚刚可以了,走了不少弯路,移植了那么多芯片的boot loader就他家的遇坑了 ...

给点建议把,我这也是出现问题了,擦除用的官方的函数,
for(page=0x1000;page<0x1FBFD;page++ )
      {
        Page_Erase(page,0);
       page+=1023;
      }         
就这一段函数 ,page加到 1400就跳出去了。  我跟踪了一下,发现程在擦除函数中如下: 他竟然把if   if else  else中的内容挨着执行。这什么情况呢
        if( addr < 0x10000)                                          
        {
                pwrite = (char xdata *)addr;  
        } else if(addr < 0x18000)      
        {
                addr |= 0x8000;
                pwrite = (char xdata *)addr;
                PSBANK &= ~0x30;
                PSBANK |= 0X20;
        }else {                          //bank 3
                pwrite = (char xdata *)addr;   
                PSBANK &= ~0x30;
                PSBANK |= 0X30;
        }

出0入0汤圆

发表于 2022-1-12 17:02:51 | 显示全部楼层
1a2b3c 发表于 2022-1-12 14:12
晕,我刚折腾了一周,刚刚可以了,走了不少弯路,移植了那么多芯片的boot loader就他家的遇坑了 ...

放高地址必须注意, APP 不能写0地址, 0地址要固定为BOOTLOADER的入口, BOOTLOADER 截取 应用0 地址内容,  作为跳转到APP的入口。   BOOTLAODER不要使用中断。

好处就是不用中断重映射, 效率高。  

出0入0汤圆

 楼主| 发表于 2022-1-13 09:29:41 | 显示全部楼层
继续顶起来,有没有做过F120的朋友,擦除64K以上的flash,有什么特殊要求呢?

出0入475汤圆

发表于 2022-1-13 10:32:18 来自手机 | 显示全部楼层
你先按64k以下的做吧,这样避免多个问题。
然后就是boot放前面和后面的问题自己知道怎么处理跳转地址,然后就是app验证时候就用一个最简单的,比如点一个灯就好,这样甚至代码和boot一起写进去都行,反正就那么几个字节的flash代码,这样好查找问题

出0入18汤圆

发表于 2022-1-13 19:30:59 来自手机 | 显示全部楼层
c8051也能中断向量重映射吗?

出0入0汤圆

发表于 2022-1-13 20:38:20 | 显示全部楼层
tang_qianfeng 发表于 2022-1-13 19:30
c8051也能中断向量重映射吗?

软件做映射, 基本上是单片机都能做。 就是跳转指令。

出0入18汤圆

发表于 2022-1-13 21:03:11 来自手机 | 显示全部楼层
跳转的地址就是在app里要严格定义好了

出0入0汤圆

 楼主| 发表于 2022-1-13 21:55:32 | 显示全部楼层
tang_qianfeng 发表于 2022-1-13 21:03
跳转的地址就是在app里要严格定义好了

跳转就是在启动文件里面使用偏移量的

出0入0汤圆

发表于 2022-1-14 09:07:33 | 显示全部楼层
现在还有用C8051F120的呀,好多年前用过!那时看到SFRPAGE就头大,经常忘记切换。

出0入0汤圆

 楼主| 发表于 2022-1-14 10:24:40 | 显示全部楼层
wurst 发表于 2022-1-14 09:07
现在还有用C8051F120的呀,好多年前用过!那时看到SFRPAGE就头大,经常忘记切换。 ...

用呀,都是公司习惯用的片子。又贵又古老

出0入0汤圆

 楼主| 发表于 2022-1-14 10:28:50 | 显示全部楼层
astankvai 发表于 2022-1-12 17:02
放高地址必须注意, APP 不能写0地址, 0地址要固定为BOOTLOADER的入口, BOOTLOADER 截取 应用0 地址内 ...

我看其他人例子。先将0地址处的内容读出来,然后在擦除0地址。擦除完成又写回去。 0地址存放boot入口, 是不是这样做:如果我定义boot 区域为   0xBFFF-0xFFF ,那么0地址是不是写成0xBFFF,以便跳转到boot。

出0入0汤圆

发表于 2022-1-14 10:35:36 | 显示全部楼层
本帖最后由 孤独飞行 于 2022-1-14 10:37 编辑

BOOT放在空间的最后面位置。烧录的时候先烧 BOOT, 后面升级的时候跳过前面两个字节0x00 0x01 0X02,这几个字节是跳转到BOOT的绝对跳转指令。因为是整页擦除的,所以你可以读出这几个字节覆盖你即将要写入这一页这个位置的BUFF.

出0入0汤圆

发表于 2022-1-14 10:52:52 | 显示全部楼层
anshaoyuan 发表于 2022-1-14 10:28
我看其他人例子。先将0地址处的内容读出来,然后在擦除0地址。擦除完成又写回去。 0地址存放boot入口,  ...

不是,  你只要将0地址写BOOT入口, 其他和文件一样写入。 首PAGE一般都有中断向量表, 你要用应用的中断向量表。  

出0入0汤圆

 楼主| 发表于 2022-1-14 12:59:13 | 显示全部楼层
astankvai 发表于 2022-1-14 10:52
不是,  你只要将0地址写BOOT入口, 其他和文件一样写入。 首PAGE一般都有中断向量表, 你要用应用的中断 ...

我理解如下:大概思路

1、首先对FLASH内存进行划分 (FLASK空间0-FFFF)

   App区域   
          APP-START-Addr                      0x0000
          APP-END -Addr                           0xEB00

            
   Boot区域 4kb               
           Boot -  START-Addr                  0xED01
           Boot -  END-Addr                     0xFFFF  

2 Keil设置
(a) 因为boot存储在最后面。上电需要跳转到 ED01处开始执行,
需要设置 如下: Target-BL51 Locate -Code 为:  ?C_C51STARTUP(ED01H)
表示上电后从ED01处开始执行。
  (b) Target-BL51 Locate -Code 这个设置为 ED01 -  FFFF  表示boot烧写到这个FLASH区域中。

3 程序实现
   
   (a)首先保存地址0x0000   0x0001   0x0002 的值
              rst_addr[0] = FLASH_ByteRead(0x0);
        rst_addr[1] =  FLASH_ByteRead(0x0001);
        rst_addr[2] =  FLASH_ByteRead(0x0002);
   
(b)擦除 0x0000 -  0xEB00 的FLASH区域 ,因为F120每次都是擦除一页,而一页为1024节

         for (page=0; page<0xEB00; page+=0x400)
        {
            Page_Erase(page);
        }
   (c)  回写保存的首地址内容
            for(i=0;i<3;i++)
        {       
           FLASH_ByteWrite(i,rst_addr);
               
        }
   
(d)写入下载App后跳转到下载的App中(我没有理解透这个跳转)
          下载完成后 或者规定时间内没有检测到下载 都需要跳转到 App执行
           跳转到App执行代码,下载的代码是从0x0003以后开始写的吗?   
             跳转的话应该跳转到App程序处开始执行,是不是从0x0003开始执行App程序
       这样就是定义一个函数指针  地址赋值0x0003?我理解不来

以上是我的理解,不知道是否正确,请给予指导下。谢谢啦!!!
           
            
           
         
   

  
  
   

  
  

出0入0汤圆

发表于 2022-1-14 13:45:00 | 显示全部楼层
anshaoyuan 发表于 2022-1-14 12:59
我理解如下:大概思路

1、首先对FLASH内存进行划分 (FLASK空间0-FFFF)

应用里不需要刻意去设置BOOT的入口地址,这样会导致把应用的部分代码放到BOOT区中, 而空间实际到不了而出错。

应用应该怎么写就怎么写。 完全不会管BOOT在什么地方(当然, FLASH范围不能超)。  



在BOOTLOADER中,  写PAGE0时, 把0地址的跳转改为BOOT的入口地址, 把原来应用的入口地址写到另外的地方(  如BOOTENTRYADDR-2).   BOOT启动后, 查是否需要跳转到应用, 如果需要, 就去   BOOTENTRYADDR-2 查应用入口,  查到后跳转到应用就可以。

需要注意的是, 擦除完PAGE0,  要立即写BOOT入口地址, 不然此时意外断电就砖了。  BOOT 需要判断一些FLAG来确保应用是否完整, 如CHECKSUM,  不完整时, 停留在BOOT, 等待升级。

出0入0汤圆

 楼主| 发表于 2022-1-15 09:50:37 | 显示全部楼层
1a2b3c 发表于 2022-1-12 14:12
晕,我刚折腾了一周,刚刚可以了,走了不少弯路,移植了那么多芯片的boot loader就他家的遇坑了 ...

你看我的思路对不对,给予指导下

出0入475汤圆

发表于 2022-1-16 11:18:50 | 显示全部楼层
如果你只是想先验证整个流程,建议按我说的简单方案试试,将整个流程搞定了,后面针对具体的芯片作一些特殊的处理就容易一百倍了,所以我说你可以先不管特殊的128K的情况,先按64K以内来处理,而且那个芯片他默认情况下就是64K来着好像.

出0入0汤圆

 楼主| 发表于 2022-1-18 11:36:28 | 显示全部楼层
f120擦除FLASH发现,从0开始的地址只能擦除64KB空间,而如果从0x1000处开始擦除就可以擦除120KB空间。这还不理解了?

出0入0汤圆

发表于 2022-2-7 08:29:54 | 显示全部楼层
学习学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 04:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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