搜索
bottom↓
回复: 74

共享我做的瑞萨M16C/62P的bootloader

[复制链接]
(347087076)

出0入0汤圆

发表于 2010-5-17 11:32:37 | 显示全部楼层 |阅读模式
功能有:
通过超级终端send txt...直接下载mot(s-recorder)格式的firmware
该bootloader初始化后,就完全在RAM中运行,因此可以自己升级自己,即bootloader也可以随时更新
bootloader占用ROM空间小于8KB

测试平台:
MCU : M30627FHP(384KB)
CLOCK : 7MHz(需根据实际硬件平台,设置CLOCK)

集成开发环境 : HEW 5.45.00

另外附带基于IAR和HEW的应用程序例子。

欢迎大家使用。

M16C bootloader已经登录到google SVN
http://code.google.com/p/m16c-bootloader/


点击此处下载 ourdev_554782.rar(文件大小:86K) (原文件名:BootloaderMOT.rar)
点击此处下载 ourdev_554783.rar(文件大小:93K) (原文件名:Userprogram.rar)
点击此处下载 ourdev_554784.rar(文件大小:580K) (原文件名:usr_program_IAR.rar)
(347082159)

出0入0汤圆

发表于 2010-5-17 12:54:34 | 显示全部楼层
mark!
(346824342)

出0入0汤圆

 楼主| 发表于 2010-5-20 12:31:31 | 显示全部楼层
更新一下M16C的bootloader:

串口接收使用中断来处理,避免Xon发送后,丢失开始的几个字节

点击此处下载 ourdev_555455.rar(文件大小:83K) (原文件名:BootloaderMOT.rar)

强烈建议使用tera term,作为PC端的 terminal emulator。

PS:最新版的M16C bootloader已经更新至google SVN
http://code.google.com/p/m16c-bootloader/
(346820348)

出0入0汤圆

发表于 2010-5-20 13:38:05 | 显示全部楼层
支持一下
(346290095)

出0入0汤圆

 楼主| 发表于 2010-5-26 16:55:38 | 显示全部楼层
发布最新稳定版
changelog
-在发送Xoff后,增加了5ms的延时,原因是PC端串口接收到xoff后,不会立即停止,而是要发送完Tx buffer里的数据后,才停止
为保证正确接收Tx buffer的数据,故延时5ms。

点击此处下载 ourdev_557163.rar(文件大小:278K) (原文件名:BootloaderMOT.rar)
(346288414)

出0入0汤圆

 楼主| 发表于 2010-5-26 17:23:39 | 显示全部楼层
自己感觉标题有点错误,不应该说是我做的,而应该说是我修改的,特此更正吧

注:参考的是renesas 网站的 APP NOTE 《Examples Serial Flash Bootloader With Xmodem Data Transfer》
(345946146)

出0入0汤圆

发表于 2010-5-30 16:28:07 | 显示全部楼层
回复【5楼】lgnq
-----------------------------------------------------------------------

  最近也在试着玩M16C28的BOOTLOADER,参考的也是这个APP。而我的升级程序现在已经有80K左右了,划分ROM的时候要小心一点了
请问lgnq 能讲一下你应用的情况吗,1)怎样划分BOOT区和APPLICATION区,能详细讲下地址分配吗。
                                 2)进入BOOT的判断条件是什么呢,
                                 3)按照APP说的用终端时他并不是通过SEND TEXT来完成任务的,能截几个图给大伙参考下吗?
                                 4) 还有讲到在BOOT程序中使用接收中断,是否要移动中断向量表的位置
不知lgnq是不是可以分享更多。


一口气提了那么多问题,休息下,
等待回复,谢谢
(345926485)

出0入0汤圆

发表于 2010-5-30 21:55:48 | 显示全部楼层
没用过瑞萨
mark
(345865043)

出0入0汤圆

 楼主| 发表于 2010-5-31 14:59:50 | 显示全部楼层
回复【6楼】xianting77
回复【5楼】lgnq  
-----------------------------------------------------------------------
  最近也在试着玩m16c28的bootloader,参考的也是这个app。而我的升级程序现在已经有80k左右了,划分rom的时候要小心一点了
请问lgnq 能讲一下你应用的情况吗,

                                 1)怎样划分boot区和application区,能详细讲下地址分配吗。
                                    地址空间最高的8KB用来存放bootloader,剩下的ROM空间都可以用于user application

                                 2)进入boot的判断条件是什么呢,
                                    上电就运行bootloader,三秒内串口没有输入,就跳转到0x80020,执行用户程序

                                 3)按照app说的用终端时他并不是通过send text来完成任务的,能截几个图给大伙参考下吗?
                                    官方的app是通过xmodem下载binary,我的bootloader是通过sent txt,直接下载mot文件
                                    HEW编译环境不能直接生成binary,需要将mot转换成binary,这样太麻烦。

                                 4)还有讲到在BOOT程序中使用接收中断,是否要移动中断向量表的位置
                                    bootloader初始化后,bootloader的中断向量表已经copy到RAM中

------------------------------------------------

PS:bootloader怎么可能要80KB,太大了吧。
(345855432)

出0入0汤圆

发表于 2010-5-31 17:40:01 | 显示全部楼层
十分感谢lgnq的热心帮助。
昨天提的问题现在已经豁然开朗了 ,还有你有用过E8A仿真吗,有时候总能发现怪怪的问题,
1)监控RAM中的U0RB已经接收了数据,但是总进不了串口接收中断,后来我在TA0中设了断点发现也是进中断。是中断向量表没有移动过来的原因吗?
2)有时候全速跑的时候,也会莫名奇妙的跑飞,不知道你是否有过这样的问题?
3)要是真正要用到生产中,你考虑过将BOOT和APP合并再烧录吗?
4) 你做的直接烧录MOT文件的方式觉得蛮有用的,能讲讲你的思路吗,

呵呵。现在准备仔细看看你的程序。
另我的bootloader 没有80K,是应用程序80K,我用的是M16C28,128K ROM +4K RAM

还有就是你有兴趣为这个BOOTLOADER做一个上位机程序吗,我开始有这个打算了,呵呵,多多交流拉
(345845277)

出0入0汤圆

 楼主| 发表于 2010-5-31 20:29:16 | 显示全部楼层
回复【9楼】xianting77
十分感谢lgnq的热心帮助。
昨天提的问题现在已经豁然开朗了 ,还有你有用过e8a仿真吗,有时候总能发现怪怪的问题,

我就是用的E8A,挺好用,断电前,先断开仿真,要不然IDE容易死掉。

1)监控ram中的u0rb已经接收了数据,但是总进不了串口接收中断,后来我在ta0中设了断点发现也是进中断。是中断向量表没有移动过来的原因吗?

这个要把你程序贴上来看看问题出在什么地方。

2)有时候全速跑的时候,也会莫名奇妙的跑飞,不知道你是否有过这样的问题?

没遇到过,程序跑飞肯定是有原因的

3)要是真正要用到生产中,你考虑过将boot和app合并再烧录吗?

对啊,生产时,将boot文件mot和app文件mot合并就可以,MOT文件合并很简单(一个文件去头,一个文件去尾合并就可以了)

4) 你做的直接烧录mot文件的方式觉得蛮有用的,能讲讲你的思路吗,

基本思想就是:
1 通过串口读一行s-record记录
2 发送XOFF
3 然后program flash
4 发送XON
5 goto 1

呵呵。现在准备仔细看看你的程序。
另我的bootloader 没有80k,是应用程序80k,我用的是m16c28,128k rom +4k ram
还有就是你有兴趣为这个bootloader做一个上位机程序吗,我开始有这个打算了,呵呵,多多交流拉

暂时还没打算做上位机,如果你有这个打算,那就不妨动手做吧。有问题,再交流。

-----------------------------------------------------------------------


PS:欢迎使用M16C bootloader,大家一起来完善它。
(345758181)

出0入0汤圆

发表于 2010-6-1 20:40:52 | 显示全部楼层
呵呵,还有一些问题

1)由于是使用M16C28,ROM只有128K 所以我改FIRST_USER_FLASH_ADDR 改为E0000 ,
2)还有为什么要分 512kb 和 384KB 大小不同的SIZE
3), 还有Block_Address[12][2]中没有用到的地址范围可以去掉吗?
还有在LINK 中添加这样语句

-ORDER FirmRam_NE=0400,data_SE,bss_SE,data_SO,bss_SO,data_NE,bss_NE,data_NO,bss_NO,stack,istack,heap_NE,rom_NE,rom_NO,ram_based_rom_FE=03000,ram_based_prg=03060,data_FE=010000,bss_FE,data_FO,bss_FO,vector=0FC000,rom_FE,rom_FO,data_SEI,data_SOI,data_NEI,data_NOI,data_FEI,data_FOI,switch_table,program,interrupt,program_S,FirmArea_FE=0FF600 -LOC ram_based_rom_FE=0fd800,ram_based_prg=0fd860

反映出地址,见下图 /

说内存不够 溢出了怎么回事?ourdev_558841.zip(文件大小:409K) (原文件名:bootm16.zip)

地址映射 (原文件名:MAP.JPG)
附件是改后你的代码,但是有问题,能帮着看看吗?
(345754638)

出0入0汤圆

 楼主| 发表于 2010-6-1 21:39:55 | 显示全部楼层
回复【11楼】xianting77
呵呵,还有一些问题
1)由于是使用m16c28,rom只有128k 所以我改first_user_flash_addr 改为e0000 ,
修改正确,first_user_flash_addr要根据实际ROM大小来设置,384KB的话设置为0xA0000,512KB的话设置为0x80000

2)还有为什么要分 512kb 和 384kb 大小不同的size
这样的目的就是要做一个通用的bootloader,手头只有 M16C62P的平台384KB 和 M16C64的平台512KB,所以目前为止只预定义了这两个SIZE

3), 还有block_address[12][2]中没有用到的地址范围可以去掉吗?
关于block_address要根据实际使用的MCU的datasheet来设置

还有在link 中添加这样语句
以下这些设置也要根据实际ROM,RAM大小分配,由于我没有m16c28的平台,所以也不方便调试,你还是多多尝试吧
ROM空间分配应该没什么问题,bootloader放在ROM的最高地址空间8KB
RAM空间要重新调整下,0x3000已经超出了4KB的范围了。

-order firmram_ne=0400,data_se,bss_se,data_so,bss_so,data_ne,bss_ne,data_no,bss_no,stack,istack,heap_ne,rom_ne,rom_no,ram_based_rom_fe=03000,ram_based_prg=03060,data_fe=010000,bss_fe,data_fo,bss_fo,vector=0fc000,rom_fe,rom_fo,data_s......
-----------------------------------------------------------------------
(345673757)

出0入0汤圆

发表于 2010-6-2 20:07:56 | 显示全部楼层
回复【12楼】lgnq
-----------------------------------------------------------------------

今天把地址又理了下,这个样子更能配合程序
m16c28  128k rom + 12k ram

-ORDER FirmRam_NE=0400,data_SE,bss_SE,data_SO,bss_SO,data_NE,bss_NE,data_NO,bss_NO,stack,istack,heap_NE,rom_NE,rom_NO,ram_based_rom_FE=02300,ram_based_prg=02500,data_FE=0E0000,bss_FE,data_FO,bss_FO,vector=0FC000,rom_FE,rom_FO,data_SEI,data_SOI,data_NEI,data_NOI,data_FEI,data_FOI,switch_table,program,interrupt,program_S -LOC ram_based_rom_FE=0fd400,ram_based_prg=0fd600

void InitCommandHandler (void)
{
        InitSci();
        InitDelayTimer();
       
        // copy all RAM based code to RAM
        memcpy( (void *) INT_RAM_BASE_ADDRESS, (void *) RAM_BASED_ROM_ADDRESS, SIZE_OF_RAM_BASED_ROM );

           memcpy( (void *) 0x2000, (void *) 0xFC000, 0x100 ); //fify 20100119 copy VECTOR to RAM
        _asm("        ldc        #0,INTBH");
        _asm("        ldc        #02000h,INTBL");

    CommInit();
}

将boot区    fd400----0fd600 的ram based rom  copy 到 RAM的 02300 -----02500
boot 区的vector起始于FC000
APP区的最小地址是EC000 mcu决定的

由于是用E8a仿真,所以RAM 区从 800H 的128 byte  ROM区从 FF000的2K个地址被其占用

在调试过程中还是有问题

1)在RAM_BASED_PRG后的程序的反编译汇编都是  BRK ,程序没有实质的执行内容,怎么会这样
2)如果将#PRAGMA SECTION PROGRAM 注释掉,会报错 ,是不是你在用E8A时也做些设置呢
3)上面LINK 的内容可以简化掉部分吗,

现在用E8A仿正,执行到RAM_BASED_PRG后就乱跑 ,郁闷-------======+++++++

#PRAGMA SECTION PROGRAM 注释掉,出错了 (原文件名:2010-06-02_195547.jpg)
(345673478)

出0入0汤圆

发表于 2010-6-2 20:12:35 | 显示全部楼层
还有就是拷贝的中断memcpy( (void *) 0x2000, (void *) 0xFC000, 0x100 ); //fify 20100119 copy VECTOR to RAM
不是固定中断吧!
(345625560)

出0入0汤圆

 楼主| 发表于 2010-6-3 09:31:13 | 显示全部楼层
回复【13楼】xianting77
回复【12楼】lgnq  
-----------------------------------------------------------------------
今天把地址又理了下,这个样子更能配合程序
m16c28  128k rom + 12k ram
-order firmram_ne=0400,data_se,bss_se,data_so,bss_so,data_ne,bss_ne,data_no,bss_no,stack,istack,heap_ne,rom_ne,rom_no,ram_based_rom_fe=02300,ram_based_prg=02500,data_fe=0e0000,bss_fe,data_fo,bss_fo,vector=0fc000,rom_fe,rom_fo,data_sei,data_soi,data_nei,data_noi,d......
-----------------------------------------------------------------------

将boot区    fd400----0fd600 的ram based rom  copy 到 RAM的 02300 -----02500  
boot 区的vector起始于FC000
APP区的最小地址是EC000 mcu决定的

问题出在copy ram based rom,没有把全部的RAM_BASED_PRG拷贝到RAM中,请用工具map viewer打开看看RAM_BASED_PRG的大小。
(345625526)

出0入0汤圆

 楼主| 发表于 2010-6-3 09:31:47 | 显示全部楼层
回复【14楼】xianting77
还有就是拷贝的中断memcpy( (void *) 0x2000, (void *) 0xfc000, 0x100 ); //fify 20100119 copy vector to ram  
不是固定中断吧!
-----------------------------------------------------------------------

对拷贝的是relocatable vector
(345625419)

出0入0汤圆

 楼主| 发表于 2010-6-3 09:33:34 | 显示全部楼层
bootloader这么小的程序,没必要用E8A仿真吧

用E8A仿真有个坏处就是要占用一点ROM和RAM
(345600582)

出0入0汤圆

发表于 2010-6-3 16:27:31 | 显示全部楼层
lgnq
对内存重新定位还是有疑问?

上面讲的两个步骤,1)先在LINK 时通过 loc 或者 order 语句分在别定位rom 和 ram起始地址
                  2)通过MEMCPY拷贝来自ROM的内容,由于中断又复制了中断向量表,如下
{
memcpy( (void *) INT_RAM_BASE_ADDRESS, (void *) RAM_BASED_ROM_ADDRESS, SIZE_OF_RAM_BASED_ROM );

    memcpy( (void *) 0x2000, (void *) 0xFC000, 0x100 ); //fify 20100119 copy VECTOR to RAM
_asm(" ldc #0,INTBH");
_asm(" ldc #02000h,INTBL");

    CommInit();
}
然后我在仿真的时候发现,只用步骤一就可以,从反汇编可以看到程序已经对应到指定的地址,程序也能正常的使用单步
仿真、  相反,如果加上 步骤2) ,反汇编后看到的代码都是UND.怎么样解释才合理呢?

在使用步骤1)后不管有没有拷贝VECTOR 到RAM
一启动TIMER0 就转跳到BRK的地方,所以我想是不是单单拷贝中断向量表还不够,还需要拷贝中断服务子程序?


还有你程序中的string_in_ram_f0 定位到了RAM 的4000的?看了你的工程,没有看到你使用LOC 和order语句,
你是单单用了步骤2吗?

这是结合我仿真的时候产生的问题,如你说的不用仿真直接看效果,我也想试试、

继续顶起来
(345600154)

出0入0汤圆

 楼主| 发表于 2010-6-3 16:34:39 | 显示全部楼层
回复【18楼】xianting77
lgnq  
对内存重新定位还是有疑问?
上面讲的两个步骤,1)先在link 时通过 loc 或者 order 语句分在别定位rom 和 ram起始地址
                  2)通过memcpy拷贝来自rom的内容,由于中断又复制了中断向量表,如下
{
memcpy( (void *) int_ram_base_address, (void *) ram_based_rom_address, size_of_ram_based_rom );  
    memcpy( (void *) 0x2000, (void *) 0xfc000, 0x100 ); //fify 20100119 copy vector to ram  
_asm(" ldc #0,intbh");  
_asm(" ldc #02000h,intbl");  
    comminit();......
-----------------------------------------------------------------------

请仔细看代码吧!!!

大部分函数都是定义在ram_based_prg里面的
#pragma SECTION program ram_based_prg

初始化过后,bootloader就在RAM里面运行了。

为保证RAM中正确运行,所有常量字符串都定义在string_in_ram段。
//make sure the const string message is in the RAM area
#pragma SECTION rom string_in_ram
(345543442)

出0入0汤圆

发表于 2010-6-4 08:19:51 | 显示全部楼层
调整了地址分配,程序能仿真了

-ORDER
data_SE=0400,bss_SE,data_SO,bss_SO,data_NE,bss_NE,data_NO,bss_NO,stack,istack,heap_NE,rom_NE,rom_NO,ram_based_rom_FE=01500,ram_based_prg=01600,string_in_ram_FO=02800,data_FE=0FC000,bss_FE,data_FO,bss_FO,vector=0FD000,rom_FE,rom_FO,data_SEI,data_SOI,data_NEI,data_NOI,data_FEI,data_FOI,switch_table,program,interrupt,program_S -LOC ram_based_rom_FE=0FDF00,ram_based_prg=0FE000,string_in_ram_FO=0FF100

但是进不了中断,看MOT文件发现FD00开始的100个地址是OXFF的值,可以推断中断向量表在这个位置,当然 用memcpy copy vector to ram  ,不可能有作用,

难道在 -ORDER中定义了vector=0FD000,还需要做其他的设置,才能将relocatable vector表生成到0FD000/

还有一个问题,要是应用的时候是不是要准备两个文件,一个是API的MOT文件,一个是使用烧录工具的MOT文件。
谢谢
(345525371)

出0入0汤圆

 楼主| 发表于 2010-6-4 13:21:02 | 显示全部楼层
回复【20楼】xianting77
调整了地址分配,程序能仿真了
-order
data_se=0400,bss_se,data_so,bss_so,data_ne,bss_ne,data_no,bss_no,stack,istack,heap_ne,rom_ne,rom_no,ram_based_rom_fe=01500,ram_based_prg=01600,string_in_ram_fo=02800,data_fe=0fc000,bss_fe,data_fo,bss_fo,vector=0fd000,rom_fe,rom_fo,data_sei,data_soi,data_nei,data_noi,data_fei,data_foi,switch_table,program,interrupt,program_s -loc ram_based_rom_fe=0fdf00,ram_based_prg=0fe000,......
-----------------------------------------------------------------------

请用memory map viewer截图给我看吧

还有一个问题,要是应用的时候是不是要准备两个文件,一个是API的MOT文件,一个是使用烧录工具的MOT文件。

常理是要有app的mot和boot的mot,但是mot文件合并也很简单
(345519814)

出0入0汤圆

发表于 2010-6-4 14:53:39 | 显示全部楼层

map view (原文件名:map view0.jpg)

看得出来已经把VECTOR的地址绑定到0FC000 了,但是是看MOT中0fc000后的100个地址都是0XFF,很奇怪/、/、/
(345432987)

出0入0汤圆

发表于 2010-6-5 15:00:46 | 显示全部楼层
到现在地址没有问题了,移植的没有使用中断的例程可以运行了,但是只要带中断的工程,始终无法进中断,请问
lgnq  在C工程里是怎样注册中断的,在汇编工程里,只要把 "if 0" 去掉然后用 .GLB作外部声明 就可以了。
C工程里只看到了函数声明。
(345254615)

出0入0汤圆

 楼主| 发表于 2010-6-7 16:33:38 | 显示全部楼层
请仔细看bootloader源程序里就有串口的C语言中断处理函数定义

#pragma INTERRUPT u0rec_handler(vect=18);

void  u0rec_handler (void)
{
        unsigned short   c;
        while(ri_u0c1 == 0)
                ;
        c = u0rb;
        CommPutRxChar(c);
}
(345179396)

出0入0汤圆

发表于 2010-6-8 13:27:17 | 显示全部楼层
最近用M16C28调程序的时候总发现不能进中断,定时器模式,中断优先级,开启中断,处理器模式一一设置了,可是就是有问题,等高手帮忙

1 (原文件名:1.JPG)
上面是建C工程后编译生成的MAP,明明看到有中断向量表定位到0FFD00, 但是查看.mot文件发现都是FF,当然前提目前没有在中断向量中添加任何代码,但是这不影响向量表的生成的吧

2 (原文件名:2.JPG)

同样的另一个工程里,时用汇编建工程的,在sect30.inc 中注册了中断,MAP中表明中断向量表定位到 FFD00了


3 (原文件名:3.JPG)


但是明显其中已经不是FF 了,

4 (原文件名:4.JPG)


现在的问题是我C工程里哪里出了问题,才使得中断不能使用。谢谢。
(345174751)

出0入0汤圆

 楼主| 发表于 2010-6-8 14:44:42 | 显示全部楼层
回复【25楼】xianting77
最近用m16c28调程序的时候总发现不能进中断,定时器模式,中断优先级,开启中断,处理器模式一一设置了,可是就是有问题,等高手帮忙


1 (原文件名:1.jpg)
上面是建c工程后编译生成的map,明明看到有中断向量表定位到0ffd00, 但是查看.mot文件发现都是ff,当然前提目前没有在中断向量中添加任何代码,但是这不影响向量表的生成的吧


2 (原文件名:2.jpg)
同样的另一个工程里,时用汇编建工程的,在sect30.inc 中注册了中断,map中表明中断向量表定位到 ffd00了

<center>
3 (原文件名:3.jpg) </c......
-----------------------------------------------------------------------



有几个问题先要弄清楚:
1,你这个是应用程序吧?是独立的还是基于bootloader的?

2,如果是基于bootloader的,那么就应该把fvector和vector放在flash的最低地址空间,M16C28,128KB的话也就是放在0xE0000
(345148297)

出0入0汤圆

发表于 2010-6-8 22:05:36 | 显示全部楼层
基于BOOTLOADER的有这样的问题 ,就是应用程序也有啊,下面是一个简单的例子 也有问题

#include <stdlib.h>
#include "sfr28.h"
#define ONE_MSEC                                 600
static unsigned char DelayTimerUnderFlowFlag = 0;
//#define MS_PER_TIMER_COMPARE_MATCH        1
// function prototypes
void InitDelayTimer (void);
void StartDelayTimer (void);
void StopDelayTimer (void);

void SystemInitial()
{
        ifsr2a=0x01;//need to watch
        prc1 = 1;
        pm20 = 0;                       
        prc1 = 0;
        prc0 = 1;
                     /* set to hi-drive Xin, divide by 1 */           
        cm1 = 0x20;
                     /* set to main clock using divide by 1 */      
        cm0 = 0x08;
                     /* switch to Xin */                     
        cm21 = 0;
                    /* disable access to clock registers */                       
        prc0 = 0;      
                    /* choose 010:64 pin  */
        prc2=1;
        pacr=0x02;
        prc2=0;

}
void InitDelayTimer (void)
{
                      // stop the timer channel
        ta0s = 0;                                                                                                                                                 
                                                                               
        tmod0_ta0mr = 0;                                                                       
        tmod1_ta0mr = 0;                                               
                                                                                                       
        mr0_ta0mr = 0;                                                        //         0 - pulse not output
                                                                                //        gate
        mr1_ta0mr = 0;                                                        //        0        0        0                       
                                                                                       
        mr2_ta0mr = 0;                                // "
        mr3_ta0mr = 0;                                // must be '0' in timer mode
        tck0_ta0mr = 0;                                // clock = f32
        tck1_ta0mr = 1;                                // "
       
        udf = 0x00;
        ta0ic = 5;
}


void StartDelayTimer (void)
{
        ta0 = ONE_MSEC - 1;                                // set initial count value
        asm("fset i");
        ta0s = 1;                                                 // start timer
}


void StopDelayTimer (void)
{
        ta0s = 0;                                                // stop timer
}


#pragma INTERRUPT TimerA0Interrupt(vect=21);
void TimerA0Interrupt(void)
{
   DelayTimerUnderFlowFlag = 1;
}

void main(void)
{
   
   SystemInitial();
   InitDelayTimer();
   StartDelayTimer();
   asm("FSET I") ;
   while(1)
   {};       
}
(345088893)

出0入0汤圆

 楼主| 发表于 2010-6-9 14:35:40 | 显示全部楼层
如果是独立的应用程序,请看看例程吧,和bootloader没有关系,不用用bootloader下载mot

如果是基于bootloader的应用程序,请把fvector和vector弄到0xE0000
要不然会覆盖bootloader或者无法正常启动。
(344367657)

出0入0汤圆

发表于 2010-6-17 22:56:16 | 显示全部楼层
还是要先谢谢LGNQ耐心的分析和帮助 ,现在我基本上能在M16C28上运行,但是到发送文件这一步,始终没有将数据发出去
在28这个平台上还是要修改满多东西的,等过几天我总结一下,贴上来,希望到时目前的问题也能解决!
现在图上不了,
(344305520)

出0入0汤圆

发表于 2010-6-18 16:11:53 | 显示全部楼层

无法响应 (原文件名:2010-06-17_164933.jpg)

  就是选择了文件也无法发送,搞不明白是什么原因
(344297983)

出0入0汤圆

 楼主| 发表于 2010-6-18 18:17:30 | 显示全部楼层
回复【30楼】xianting77
<center>
无法响应
-----------------------------------------------------------------------

请确认flow control有没有选择
Xon/Xoff?
(344034251)

出0入0汤圆

发表于 2010-6-21 19:33:02 | 显示全部楼层
lgnq 大侠,我试过了使用Xon/Xoff 效果还是一样,。MOT文件发送不出去。我把自己的工程上传在后面,相信有高手
会帮我解决文件发送的问题。

下面是我移值时修改的地方,
1,        地址分配
-ORDER data_SE=0400,bss_SE,data_SO,bss_SO,data_NE,bss_NE,data_NO,bss_NO,stack,istack,heap_NE,rom_NE,rom_NO,ram_based_rom_FE=01500,ram_based_prg=01600,string_in_ram_FO=02800,data_FE=0EC000,bss_FE,data_FO,bss_FO,vector=0FC000,rom_FE,rom_FO,data_SEI,data_SOI,data_NEI,data_NOI,data_FEI,data_FOI,switch_table,program,interrupt,program_S -LOC ram_based_rom_FE=0fdd00,ram_based_prg=0fde00,string_in_ram_FO=0ff000

#define INT_RAM_BASE_ADDRESS        0x1500
#define        RAM_BASED_ROM_ADDRESS                        0x000FDD00
#define        RAM_BASED_ROM_STOPPER_ADDRESS        0x000FF400

由于在RAM中运行BOOTLOADER,要复制部分代码到RAM,要拷贝多少代码到RAM中?需要打开.MOT文件查看STRING IN RAM 段在ROM中的最大地址,应该要将这个地址定做RAM-STOPPER-ADDRESS ,这样才不会少复制代码而显示乱码。

memcpy( (void *) INT_RAM_BASE_ADDRESS, (void *) RAM_BASED_ROM_ADDRESS, SIZE_OF_RAM_BASED_ROM );

并把中断定位到RAM中
memcpy( (void *) 0x1200, (void *) 0xFc000, 0x100 );
        _asm("        ldc        #0,INTBH");
        _asm("        ldc        #01200h,INTBL");

注意:如果要用E8A等工具仿真,应该将RAM定位到400H之后,将ROM定位到FF700之后,在选项卡中设置一下就可以了。

2 ROM Flash 地址划分,根据28的 flash 区块划分,定义修改如下
const unsigned long Block_Address[7][2] = {
//        { 0xFF000, 0xFFFFE },        //引导用户区  4KB
        { 0xFE000, 0xFFFFE },    //Block 0     8KB FOR BOOT
        { 0xFC000, 0xFDFFE },    //Block 1     8KB
        { 0xF8000, 0xFBFFE },     //Block 2    16KB  
        { 0xF0000, 0xF7FFE },     //Block 3     32KB
        { 0xE8000, 0xEFFFE },     //Block 4    32KB
  { 0xE0000, 0xE7FFE },      //Block 5   32KB   //128k
   { 0x0F000, 0x0FFFE }      //块A 块B   4K

};

3 中断接收串口接收,在C工程中始终不行,所以还是建议使用建汇编工程的方法,在SECT30.INC中注册中断后,在INTERRUPT段中编写中断服务子程序。
                .glb    _u0rec_handler
                .lword  _u0rec_handler
;                .lword        dummy_int                ; vector 18  (for user) uart0 receive
                .lword        dummy_int                ; vector 19  (for user) uart1 transmit
                .lword        dummy_int                ; vector 20  (for user) uart1 receive
                .glb        _TimerA0Interrupt
                .lword        _TimerA0Interrupt
4系统初始化 和串口初始化和I/O口初始化,9600是实验的波特率。
   void InitSci ( void )
{
    //pclk1 = 1;   /// seleck F1SIO,using default setting
    /* UART Transmit/Receive Control Register 2 */
    ucon = 0x00;
        u0c0 = 0x10;
        u0brg = 5;
    u0mr = 0x05;
        s0ric = 0x04;
    u0c1 = 0x05;
        pd6_3 = 1 ;
        pd6_2 = 0 ;
        p6 = 0x00 ;

}

5 对flash的擦除按照数据手册其中M16C28特别用到的寄存器是FRM16 在擦除前同样要对其先写0 在写1
        fmr01 = 0;                                // first write 0 then write 1
        fmr01 = 1;
        fmr11 = 0;
                // disable all lock bit protection to allow programming and erase operations
        fmr02 = 0;                                // first write 0 then write 1
        fmr02 = 1;
        fmr16 = 0;          // Must write a 0 then a 1 in succession to SET
        fmr16 = 1;
(344034108)

出0入0汤圆

发表于 2010-6-21 19:35:25 | 显示全部楼层
汇编工程文件ourdev_562996JOF0MR.zip(文件大小:403K) (原文件名:bootasm.zip)

我还会继续调试,争取发现问题。呵呵
(343894620)

出0入0汤圆

发表于 2010-6-23 10:20:13 | 显示全部楼层
回复【楼主位】lgnq
-----------------------------------------------------------------------

你做的Bootloader是替换原厂固化在MCU里的Bootloader吗?

另外,原厂的Bootloader是通过UART0还是UART1下载的呢,还是都可以?
(343882236)

出0入0汤圆

发表于 2010-6-23 13:46:37 | 显示全部楼层
你的Bootloader是怎么烧写进MCU的,写在什么地址呢
(343861528)

出0入0汤圆

 楼主| 发表于 2010-6-23 19:31:45 | 显示全部楼层
回复【34楼】csest
回复【楼主位】lgnq  
-----------------------------------------------------------------------
你做的bootloader是替换原厂固化在mcu里的bootloader吗?
另外,原厂的bootloader是通过uart0还是uart1下载的呢,还是都可以?

原厂用的是uart1
-----------------------------------------------------------------------

没有替换原厂的bootloader,原厂的bootloader是写在boot区的,要进入原厂的bootloader模式,需要设置几个pin

我的bootloader是放在普通的ROM区,启动前三秒,uart0有输入就进入bootloader,否则运行application
(343861348)

出0入0汤圆

 楼主| 发表于 2010-6-23 19:34:45 | 显示全部楼层
回复【35楼】csest
你的bootloader是怎么烧写进mcu的,写在什么地址呢
-----------------------------------------------------------------------

用E8A写啊,bootloader是放在FE000 - FFFFF
(343861201)

出0入0汤圆

发表于 2010-6-23 19:37:12 | 显示全部楼层
MARK
(343595058)

出0入0汤圆

发表于 2010-6-26 21:32:55 | 显示全部楼层
你有原厂的Bootloader协议资料吗
(343462330)

出0入0汤圆

发表于 2010-6-28 10:25:03 | 显示全部楼层
学习中,感觉与AVR等其它MCU区别很大
(343272952)

出0入0汤圆

发表于 2010-6-30 15:01:21 | 显示全部楼层
使用瑞萨提供的工程 ,下载BIN文件时, 超级终端有响应,不过总是超过允许出错的次数 ,后来发现是接收溢出错误了.
应该怎样解决呢?

   lgnq 在你的工程中 有一个2K的环行缓冲区,能起到作用吗 , 我添加的这部分代码 其实无法正常工作.

   希望你来指点下 ,
(343265895)

出0入0汤圆

 楼主| 发表于 2010-6-30 16:58:58 | 显示全部楼层
回复【41楼】xianting77
   使用瑞萨提供的工程 ,下载bin文件时, 超级终端有响应,不过总是超过允许出错的次数 ,后来发现是接收溢出错误了.
应该怎样解决呢?
   lgnq 在你的工程中 有一个2k的环行缓冲区,能起到作用吗 , 我添加的这部分代码 其实无法正常工作.
   希望你来指点下 ,
-----------------------------------------------------------------------

串口接收中断函数运行正常吗?
2K是接收buffer,bootloader运行期间,RAM空间都可以利用,所以我尽量设大了一点
(343215005)

出0入0汤圆

发表于 2010-7-1 07:07:08 | 显示全部楼层
感谢lgnq 一直以来耐心的指点

移植这个BOOTLOADER碰到了不少的问题,目前上下位机通讯都正常,只是用到 超级终端发送文件时出现文件无法接收的问题 。
昨天也也用上环行队列,我在超级终端中发送文件时,没有进入到中断接收函数,但是发送字符时一切正常,而且发送字符时
数据流控制只能设 “无” 按照lgnq的建议在发送文件时将数据流控制设为 “xon/xoff”,还是不能工作。


串口接收中断函数运行正常吗?
  发送文件确认后,没有进入中断 ,应该有设置吗
(343210536)

出0入0汤圆

 楼主| 发表于 2010-7-1 08:21:37 | 显示全部楼层
回复【43楼】xianting77
感谢lgnq 一直以来耐心的指点  
移植这个bootloader碰到了不少的问题,目前上下位机通讯都正常,只是用到 超级终端发送文件时出现文件无法接收的问题 。
昨天也也用上环行队列,我在超级终端中发送文件时,没有进入到中断接收函数,但是发送字符时一切正常,而且发送字符时
数据流控制只能设 “无” 按照lgnq的建议在发送文件时将数据流控制设为 “xon/xoff”,还是不能工作。
串口接收中断函数运行正常吗?
  发送文件确认后,没有进入中断 ,应该有设置吗

-----------------------------------------------------------------------

先搞定串口接收中断吧,这是必须的
(343203815)

出0入0汤圆

发表于 2010-7-1 10:13:38 | 显示全部楼层
发送字符 都是能进中断的 ,为啥发送文件不会进去呢,难道进去后要使能总中断 .
(343198434)

出0入0汤圆

 楼主| 发表于 2010-7-1 11:43:19 | 显示全部楼层
用tera term代替超级终端试试看

强烈建议使用tera term,作为PC端的 terminal emulator。

Xon/Xoff一定要打开
(342946767)

出0入0汤圆

发表于 2010-7-4 09:37:46 | 显示全部楼层
mark!!!!!!!!!!
(342945901)

出0入0汤圆

发表于 2010-7-4 09:52:12 | 显示全部楼层
从来不玩瑞萨的飘过
(341900717)

出0入0汤圆

发表于 2010-7-16 12:11:56 | 显示全部楼层
好帖,学习了。顺便帮顶,必须的!
(329255652)

出0入0汤圆

发表于 2010-12-9 20:43:01 | 显示全部楼层
学习,顺便帮顶。
(328946457)

出0入0汤圆

发表于 2010-12-13 10:36:16 | 显示全部楼层
正在做这方面,谢谢大侠提供N多资料
(328938456)

出0入0汤圆

发表于 2010-12-13 12:49:37 | 显示全部楼层
回复【51楼】superzj
正在做这方面,谢谢大侠提供n多资料
-----------------------------------------------------------------------

做好了!我向你学习下!呵呵
(327033071)

出0入0汤圆

发表于 2011-1-4 14:06:02 | 显示全部楼层
好久没来看过,仍旧希望高手帮忙 ,问题是无法传送文件
有教程就好了
(299034633)

出0入0汤圆

发表于 2011-11-24 15:26:40 | 显示全部楼层
都是高手啊,学习了
(298690880)

出0入0汤圆

发表于 2011-11-28 14:55:53 | 显示全部楼层
mark!
(296105275)

出0入0汤圆

发表于 2011-12-28 13:09:18 | 显示全部楼层
这个对我很有帮助啊,谢谢了
(295935925)

出0入0汤圆

发表于 2011-12-30 12:11:48 | 显示全部楼层
mark, 这贴慢慢学习。
(292471981)

出0入0汤圆

发表于 2012-2-8 14:24:12 | 显示全部楼层
回复【楼主位】lgnq
-----------------------------------------------------------------------
lgnq  
高手你好!我也是用M16C M30622LGPGP 256K的,想做个BootLoader 我下载了你的 ourdev_557163.rar(文件大小:278K) (原文件名:BootloaderMOT.rar 4楼发布的文件)因为直接打开项目无法进行仿真把所有的文件考备到一个新建的项目内.可是一仿真,过一会儿就自动停止运行且提示非法语法提示,不知道是不是工程在新建时是否需要什么设置吗?以前做软件都是单做用户程序,就从头编到尾,所以对这些地址方面的定义,及程序地址的定义了解很少,所以现在出问题了,有点找不到方向,但这功能实在太有用了,又想学,只好求助于高手的指导了.谢谢!
(292471799)

出0入0汤圆

发表于 2012-2-8 14:27:14 | 显示全部楼层
回复【43楼】xianting77
-----------------------------------------------------------------------

xianting77
你好!你说你已经搞定那个BootLoader程序了,能不能分享一下经验呢?我现在有点学得云里雾里面的,希望高手们能提点提点,谢谢!
(292469701)

出0入0汤圆

发表于 2012-2-8 15:02:12 | 显示全部楼层
回复【58楼】arrvin1
-----------------------------------------------------------------------
问题的主要不懂的地方是在,如何分配地址,设置,BootLoader程序的地址,如文件所提的FE000到FFFFF  BootLoader 程序地址,可是我看了半天也不知道在哪里设置的
(292466261)

出0入0汤圆

发表于 2012-2-8 15:59:32 | 显示全部楼层
回复【楼主位】lgnq
-----------------------------------------------------------------------
lgnq
再补充一点,为什么有的函数前要加#pragma SECTION program ram_based_prg,而且的却不用呢?
(292464482)

出0入0汤圆

发表于 2012-2-8 16:29:11 | 显示全部楼层
回复【32楼】xianting77
-----------------------------------------------------------------------
请问Xianting77

注意:如果要用E8A等工具仿真,应该将RAM定位到400H之后,将ROM定位到FF700之后,在选项卡中设置一下就可以了。
这个选项在哪里啊没找到呵,能否告诉一下,谢谢!
(292357417)

出0入0汤圆

发表于 2012-2-9 22:13:36 | 显示全部楼层
遇到类似的问题,标记一下。
(288512704)

出0入0汤圆

发表于 2012-3-25 10:12:09 | 显示全部楼层
高手  mark一下
(288511357)

出0入0汤圆

发表于 2012-3-25 10:34:36 | 显示全部楼层
lgnq 发表于 2010-7-1 11:43
用tera term代替超级终端试试看

强烈建议使用tera term,作为PC端的 terminal emulator。

M16c与m8c有什么区别????m8c可以用么??
(288511122)

出0入0汤圆

发表于 2012-3-25 10:38:31 | 显示全部楼层
支持一下

尽快不要算数
(288146665)

出0入0汤圆

发表于 2012-3-29 15:52:48 | 显示全部楼层
能否改写bootloader通过U盘的USB完成程序的自我更新?(U盘内存有程序的HEX文件)也就是说单片机识别到有U盘连接时即开始更新程序……
(288077763)

出0入0汤圆

发表于 2012-3-30 11:01:10 | 显示全部楼层
MARK下        
(284995995)

出0入0汤圆

发表于 2012-5-5 03:03:58 | 显示全部楼层
mark 支持一下
(284782880)

出0入0汤圆

发表于 2012-5-7 14:15:53 | 显示全部楼层
高手了,暂时还没涉及到bootloader
(284587057)

出0入0汤圆

发表于 2012-5-9 20:39:36 | 显示全部楼层
,很高兴看到这个文档,很强大,支持
(284153948)

出0入0汤圆

发表于 2012-5-14 20:58:05 | 显示全部楼层
多谢LZ分享!MARK!
(273197481)

出0入0汤圆

发表于 2012-9-18 16:25:52 | 显示全部楼层
Mark一下
(273183509)

出0入0汤圆

发表于 2012-9-18 20:18:44 | 显示全部楼层
菜鸟向大侠请教:M16R5/3562或M16R5/3650可以用你这个bootloader么?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2021-5-16 16:37

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

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