anshaoyuan 发表于 2022-1-12 13:56:24

C8051F120关于bootloader地址设置请教

头一次做C8051F120bootloader , 其Flash 地址 如图,一共128Kb ,我想把boot放在高地址区域0x1E201 - 0x1FBFD
从0-0x1E000 放写入的APP,每次上电需要后跳转到boot区,看是否需要更新。

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

请问下keil应该如何设置。





1a2b3c 发表于 2022-1-12 14:12:16

晕,我刚折腾了一周,刚刚可以了,走了不少弯路,移植了那么多芯片的boot loader就他家的遇坑了

anshaoyuan 发表于 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 elseelse中的内容挨着执行。这什么情况呢
        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;
        }

astankvai 发表于 2022-1-12 17:02:51

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

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

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

anshaoyuan 发表于 2022-1-13 09:29:41

继续顶起来,有没有做过F120的朋友,擦除64K以上的flash,有什么特殊要求呢?

1a2b3c 发表于 2022-1-13 10:32:18

你先按64k以下的做吧,这样避免多个问题。
然后就是boot放前面和后面的问题自己知道怎么处理跳转地址,然后就是app验证时候就用一个最简单的,比如点一个灯就好,这样甚至代码和boot一起写进去都行,反正就那么几个字节的flash代码,这样好查找问题

tang_qianfeng 发表于 2022-1-13 19:30:59

c8051也能中断向量重映射吗?

astankvai 发表于 2022-1-13 20:38:20

tang_qianfeng 发表于 2022-1-13 19:30
c8051也能中断向量重映射吗?

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

tang_qianfeng 发表于 2022-1-13 21:03:11

跳转的地址就是在app里要严格定义好了

anshaoyuan 发表于 2022-1-13 21:55:32

tang_qianfeng 发表于 2022-1-13 21:03
跳转的地址就是在app里要严格定义好了

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

wurst 发表于 2022-1-14 09:07:33

现在还有用C8051F120的呀,好多年前用过!那时看到SFRPAGE就头大,经常忘记切换。

anshaoyuan 发表于 2022-1-14 10:24:40

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

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

anshaoyuan 发表于 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。

孤独飞行 发表于 2022-1-14 10:35:36

本帖最后由 孤独飞行 于 2022-1-14 10:37 编辑

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

astankvai 发表于 2022-1-14 10:52:52

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

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

anshaoyuan 发表于 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 = FLASH_ByteRead(0x0);
        rst_addr =FLASH_ByteRead(0x0001);
        rst_addr =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?我理解不来

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



   



astankvai 发表于 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, 等待升级。

anshaoyuan 发表于 2022-1-15 09:50:37

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

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

1a2b3c 发表于 2022-1-16 11:18:50

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

anshaoyuan 发表于 2022-1-18 11:36:28

f120擦除FLASH发现,从0开始的地址只能擦除64KB空间,而如果从0x1000处开始擦除就可以擦除120KB空间。这还不理解了?

yiyinzhudan 发表于 2022-2-7 08:29:54

学习学习
页: [1]
查看完整版本: C8051F120关于bootloader地址设置请教