首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]请问如何在程序中烧写FLASH

系统复位会不会是watchdog (COP) 的原因?可以在进入RAM运行之前将COP关掉,或者在对FLASH操作时不断喂狗。
海纳百川  有容乃大
但我在程序开头就禁止了COP。   
CONFIG1 = 0x29;
CONFIG2 = 0x1;
即使COP使能了,我的外部晶振是32.768K,也不会这么快复位。
在软仿真中看到FLASH地址保护寄存器的数值还是0xFF,我总觉得是这个没有赋值正确的原因!!
该怎么赋值FLASH地址保护寄存器请指点一二。


[此贴子已经被作者于2005-3-21 9:09:22编辑过]

学后而问
能不能把你的完整项目文件打个包发过来?我可以帮你调试一下,看看哪有问题。
海纳百川  有容乃大
收到你的邮件了。大致看了一下,觉得有这些要注意的问题:
1. FLASH的擦写程序在编译时还是要放在FLASH区,在运行时再将其调入RAM区,然后执行。否则FLASH擦写程序无法载入芯片;
2. 在FLASH的擦写过程中要有一个读FLBPR的动作;
3. 对FLBPR的赋值请参见S12编程手册中常量的赋值,或者直接嵌入汇编语句也可;
4. 对FLASH擦写操作恐怕不能仿真,必须直接在芯片中运行才能看出结果。
注意以上几点,应该可以实现。祝你好运!
海纳百川  有容乃大
S12编程手册在哪里,全名是什么?
搬运后的指针怎么用C写?难道只能用汇编完成指针的跳转和返回。


[此贴子已经被作者于2005-3-22 17:10:18编辑过]

学后而问
这里可以下载:

http://www.metrowerks.com/MW/Support/dev_resources/Documentation_for_HC12_3.1.htm
海纳百川  有容乃大
908GP32跟S12编程手册有什么关系?

[求助]请问如何在程序中烧写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编辑过]

学后而问
咳,问题一下回答得太多,都弄混了!请到这里下载8位MCU的编程手册:

http://www.metrowerks.com/MW/Support/dev_resources/Documentation_for_HC08_3.0.htm
海纳百川  有容乃大
建议大家没事最好不要看版主提到的书,全英文的,想看的主题也实在不好找。强烈建议相关头们搞个中文手册出来,只将常用的几条编译选项列入即可。
-Cc,-OnCstVa
学后而问
请问8808beter:搞定了没有?能把结果公开一下么?
第一篇就是结果呀,我完成后编辑过,OK的
学后而问
还有就是用完的RAM区只能自己使用,不能简单地定义到堆栈的位置。
你可以计算程序执行的时序,在不擦写时将这片RAM区用于他用。这个方案显然是用于比较富裕的RAM中。好的是整个擦写程序只占百个字节。
学后而问
返回列表