标题: [求助]请问如何在程序中烧写FLASH [打印本页]
作者: strongchen 时间: 2005-3-18 16:55
系统复位会不会是watchdog (COP) 的原因?可以在进入RAM运行之前将COP关掉,或者在对FLASH操作时不断喂狗。
作者: 8808beter 时间: 2005-3-21 09:09
但我在程序开头就禁止了COP。
CONFIG1 = 0x29;
CONFIG2 = 0x1;
即使COP使能了,我的外部晶振是32.768K,也不会这么快复位。
在软仿真中看到FLASH地址保护寄存器的数值还是0xFF,我总觉得是这个没有赋值正确的原因!!
该怎么赋值FLASH地址保护寄存器请指点一二。
[此贴子已经被作者于2005-3-21 9:09:22编辑过]
作者: strongchen 时间: 2005-3-21 12:19
能不能把你的完整项目文件打个包发过来?我可以帮你调试一下,看看哪有问题。
作者: strongchen 时间: 2005-3-22 16:44
收到你的邮件了。大致看了一下,觉得有这些要注意的问题:
1. FLASH的擦写程序在编译时还是要放在FLASH区,在运行时再将其调入RAM区,然后执行。否则FLASH擦写程序无法载入芯片;
2. 在FLASH的擦写过程中要有一个读FLBPR的动作;
3. 对FLBPR的赋值请参见S12编程手册中常量的赋值,或者直接嵌入汇编语句也可;
4. 对FLASH擦写操作恐怕不能仿真,必须直接在芯片中运行才能看出结果。
注意以上几点,应该可以实现。祝你好运!
作者: 8808beter 时间: 2005-3-22 17:10
S12编程手册在哪里,全名是什么?
搬运后的指针怎么用C写?难道只能用汇编完成指针的跳转和返回。
[此贴子已经被作者于2005-3-22 17:10:18编辑过]
作者: strongchen 时间: 2005-3-22 17:18
这里可以下载:
http://www.metrowerks.com/MW/Support/dev_resources/Documentation_for_HC12_3.1.htm
作者: usbmcu 时间: 2005-3-23 12:31
908GP32跟S12编程手册有什么关系?
作者: 8808beter 时间: 2005-3-23 12:50 标题: [求助]请问如何在程序中烧写FLASH
我用HC908GP32,要在程序运行中烧写一段FLASH,现在只能用C+汇编来完成(本来想全用C的,可惜)。方法如下:
1、将擦写程序(只写了一个字节)定义在一个特定的区中,ROM的0x8080开始,长度要自己计算出来(可以先定义得很长,在仿真时看看长度就OK)
#pragma CODE_SEG APLICATION_ROM
void Store_id(void)
{
unsigned char i;
//erase
FLCR1 = 0x2;
FLBPR ;
IDFlash = 0;//要擦写的ROM地址
for(i=0;i<6;i++);//10us
FLCR1 = 0xa;
for(i=0;i<250;i++);//1ms
for(i=0;i<250;i++);
FLCR1 = 0x8;
for(i=0;i<3;i++);//5us
FLCR1 = 0;
for(i=0;i<5;i++);//1us
//write
FLCR1 = 1;
FLBPR ;
IDFlash = 0;
for(i=0;i<6;i++);//10us
FLCR1 = 0x9;
for(i=0;i<3;i++);//5us
IDFlash = IDSetBuf;//要赋的值
for(i=0;i<16;i++);//30us
FLCR1 = 0x8;
for(i=0;i<3;i++);//5us
FLCR1 = 0;
for(i=0;i<2;i++);//1us
}
#pragma CODE_SEG DEFAULT
2、将汇编的搬运程序定义在默认ROM中
#define Erase1Page 0x8080//源ROM
#define Erase1PageEND 0x8102
#define P_AddressInRAM 0x01b0//目的RAM
void CopySub(void)
{
unsigned char I1;//计数
I1 = 0;
asm{
LDHX #Erase1Page
MoveToRAM1:
LDA ,X
PSHH
PSHX
CLRH
LDX I1
STA P_AddressInRAM,X
}
I1++ ;//INC I1
asm{
PULX
PULH
AIX #$1
CPHX #Erase1PageEND
BLO MoveToRAM1
//开始执行擦写程序
TPA //CCR->A
PSHA //A进栈,保护中断允许标志
SEI //关中断
JSR P_AddressInRAM //跳到擦写程序
PULA //出栈
TAP //A->CCR,即将关中断前的标志数值赋回
RTS
}
}
3、在PRM中定义了烧写程序的地址
SEGMENTS
Z_RAM = READ_WRITE 0x0040 TO 0x0067;
RAM = READ_WRITE 0x0068 TO 0x019F;
APL_ROM = READ_ONLY 0x8080 TO 0x81FF;
ROM = READ_ONLY 0x8200 TO 0xFDFF;
END
PLACEMENT
DEFAULT_ROM INTO ROM;
DEFAULT_RAM INTO RAM;
_DATA_ZEROPAGE, MY_ZEROPAGE INTO Z_RAM;
APLICATION_ROM INTO APL_ROM;
END
4、要注意编译选项中优化的参数。因为没有地方调用Store_id(),编译也许会没有任何代码,可以用条件语句加上,如if(IDSetBuf==5) Store_id();,只要if条件永不会成立即可。
5、FLBPR的赋值实在是弄不清楚了,英文书也太厚了,因为它在FDFF之后的系统ROM中,用一般CONST的赋值方法好象不行(有专家帮忙出例子吗),我直接将S19代码插入来解决的。
如:
S113FCC0500445034E4D510645034E4E52141D8AB1//程序
S104FCD080AF
S104FF7EE29C//地址保护寄存器FF7EH
S105FFE0FB958B
S105FFE4FBEB31
S105FFFAFCAE57
S105FFFEF1000C
S9030000FC
大家可以看到,基本上按地址从小到大排列的,S1指数据,04表后接的数量,E2是数值,9C是校验码。
04+FF+7E+E2=263H
FF-63=9C就完了。
另外我还想了另外一种方法,就是把擦写程序(纯C的)和主程序分开编译,再COPY到一起(就象上面5提到的ROM赋值)。在主程序中定义擦写程序的地址在RAM中,所以上电后先运行搬运程序,将擦写程序搬到RAM,以后就可以直接用了。但我自己没有试验。
另外,提一下,资料都是英文的,也没有各种功能的样例程序,实在太不方便了。象ARM就有很好的样例程序,照搬就行,真是苦呀——看英文。
[em01]
[此贴子已经被作者于2005-3-18 16:22:26编辑过]
[此贴子已经被作者于2005-3-23 12:50:45编辑过]
作者: strongchen 时间: 2005-3-23 15:23
咳,问题一下回答得太多,都弄混了!请到这里下载8位MCU的编程手册:
http://www.metrowerks.com/MW/Support/dev_resources/Documentation_for_HC08_3.0.htm
作者: 8808beter 时间: 2005-3-23 16:23
建议大家没事最好不要看版主提到的书,全英文的,想看的主题也实在不好找。强烈建议相关头们搞个中文手册出来,只将常用的几条编译选项列入即可。
-Cc,-OnCstVa
作者: forthlab 时间: 2005-6-16 20:29
请问8808beter:搞定了没有?能把结果公开一下么?
作者: 8808beter 时间: 2005-6-17 09:18
第一篇就是结果呀,我完成后编辑过,OK的
作者: 8808beter 时间: 2005-6-17 09:29
还有就是用完的RAM区只能自己使用,不能简单地定义到堆栈的位置。
你可以计算程序执行的时序,在不擦写时将这片RAM区用于他用。这个方案显然是用于比较富裕的RAM中。好的是整个擦写程序只占百个字节。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) |
Powered by Discuz! 7.0.0 |