C8051F120关于bootloader地址设置请教
头一次做C8051F120bootloader , 其Flash 地址 如图,一共128Kb ,我想把boot放在高地址区域0x1E201 - 0x1FBFD从0-0x1E000 放写入的APP,每次上电需要后跳转到boot区,看是否需要更新。
我在设置 off-chip 时候写入0x1e000 显示无效的地址
请问下keil应该如何设置。
晕,我刚折腾了一周,刚刚可以了,走了不少弯路,移植了那么多芯片的boot loader就他家的遇坑了 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;
} 1a2b3c 发表于 2022-1-12 14:12
晕,我刚折腾了一周,刚刚可以了,走了不少弯路,移植了那么多芯片的boot loader就他家的遇坑了 ...
放高地址必须注意, APP 不能写0地址, 0地址要固定为BOOTLOADER的入口, BOOTLOADER 截取 应用0 地址内容,作为跳转到APP的入口。 BOOTLAODER不要使用中断。
好处就是不用中断重映射, 效率高。 继续顶起来,有没有做过F120的朋友,擦除64K以上的flash,有什么特殊要求呢? 你先按64k以下的做吧,这样避免多个问题。
然后就是boot放前面和后面的问题自己知道怎么处理跳转地址,然后就是app验证时候就用一个最简单的,比如点一个灯就好,这样甚至代码和boot一起写进去都行,反正就那么几个字节的flash代码,这样好查找问题 c8051也能中断向量重映射吗? tang_qianfeng 发表于 2022-1-13 19:30
c8051也能中断向量重映射吗?
软件做映射, 基本上是单片机都能做。 就是跳转指令。 跳转的地址就是在app里要严格定义好了 tang_qianfeng 发表于 2022-1-13 21:03
跳转的地址就是在app里要严格定义好了
跳转就是在启动文件里面使用偏移量的 现在还有用C8051F120的呀,好多年前用过!那时看到SFRPAGE就头大,经常忘记切换。 wurst 发表于 2022-1-14 09:07
现在还有用C8051F120的呀,好多年前用过!那时看到SFRPAGE就头大,经常忘记切换。 ...
用呀,都是公司习惯用的片子。又贵又古老 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:37 编辑
BOOT放在空间的最后面位置。烧录的时候先烧 BOOT, 后面升级的时候跳过前面两个字节0x00 0x01 0X02,这几个字节是跳转到BOOT的绝对跳转指令。因为是整页擦除的,所以你可以读出这几个字节覆盖你即将要写入这一页这个位置的BUFF. anshaoyuan 发表于 2022-1-14 10:28
我看其他人例子。先将0地址处的内容读出来,然后在擦除0地址。擦除完成又写回去。 0地址存放boot入口,...
不是,你只要将0地址写BOOT入口, 其他和文件一样写入。 首PAGE一般都有中断向量表, 你要用应用的中断向量表。 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?我理解不来
以上是我的理解,不知道是否正确,请给予指导下。谢谢啦!!!
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, 等待升级。 1a2b3c 发表于 2022-1-12 14:12
晕,我刚折腾了一周,刚刚可以了,走了不少弯路,移植了那么多芯片的boot loader就他家的遇坑了 ...
你看我的思路对不对,给予指导下 如果你只是想先验证整个流程,建议按我说的简单方案试试,将整个流程搞定了,后面针对具体的芯片作一些特殊的处理就容易一百倍了,所以我说你可以先不管特殊的128K的情况,先按64K以内来处理,而且那个芯片他默认情况下就是64K来着好像. f120擦除FLASH发现,从0开始的地址只能擦除64KB空间,而如果从0x1000处开始擦除就可以擦除120KB空间。这还不理解了? 学习学习
页:
[1]