|
发表于 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; |
|