登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

高人帮我看看下面这段程序--ram中flash的擦除改写

作者:ddtv 栏目:单片机
高人帮我看看下面这段程序--ram中FLASH.html">FLASH的擦除改写
单片机是QB8,时钟=8m,编译通过但是就是写不了数据,地址0XDE00--0xdeff保留做数据存储器用。现在经张真人指点可以用on chip上的子程序调用,可以不用这么麻烦。但是没调出来毕竟遗憾,请高人指点~~

uchar FlashBuf[80];
uchar page_data;
uchar TEMP;
uint page_addr;

void delayms(uint t);
void delayus1(void);
void do_write(void);
void page_erase(void);
void do_erase(void);
//页写,最大32B
void page_write(void)
{
    FLCR_PGM = 1;   //编程位
    (void)(FLBPR == 0); //读FLASH保护寄存器
    *(volatile uchar *)page_addr = 0x01; //向目标页写任意数
    delayus1(); //tnvs>10us
    memcpy((void *)FlashBuf,(void *)do_write,(uint)page_erase-(uint)do_write); //FLASH.html">FLASH程序考到RAM中
    asm("ldhx FlashBuf");     //加载擦除程序在RAM区的首地址
    asm("jsr ,X");          //执行RAM区域的擦除程序
}

//要在RAM中执行的页写程序
void do_write(void)
{
    uchar i,j;
    
    FLCR_HVEN = 1;  //高压位
    delayus1(); //tpgs>5us

    for(i=0;i<20;i++)   //写20B
    {                   //数据送入FLASH.html">FLASH地址
        *((volatile uchar *)page_addr+i)= i;
        for (j=0;j<22;j++); //延时30us--40us,据说不能调用延时程序
    }

    FLCR_PGM = 0; //编程位
    delayus1(); //tnvh>5us
    FLCR_HVEN = 0; //高压位
    delayus1();// trcv>1us
}

void delayus1(void)
{
    TEMP = 60;
    while(--TEMP){}
}

//页擦除程序,最小64B
void page_erase(void)
{
    FLCR_ERASE = 1;     //擦除位
    FLCR_MASS  = 0;     //整体擦除位
    (void)(FLBPR == 0); //读FLASH保护寄存器

    *(volatile uchar *)page_addr = 0; //写任意数
    TEMP = 20;
    while(--TEMP){};    //延时
    memcpy((void *)FlashBuf,(void *)do_erase,(uint)delay100us-(uint)do_erase); //FLASH.html">FLASH程序考到RAM中
    asm("ldhx FlashBuf");     //加载擦除程序在RAM区的首地址
    asm("jsr ,X");          //执行RAM区域的擦除程序
}    

void do_erase(void)
{
    FLCR_HVEN = 1;  //高压
    delayms(4);     //terase>4ms
    FLCR_ERASE = 0;
    TEMP = 20;
    while(--TEMP){}; //tnvh>5us
    
    FLCR_HVEN = 0;
    TEMP = 10;
    while(--TEMP){};     //Trcv>1us
}
    
void delayms(uint t) {
    uchar i;
      
    do
    {
        for(i=255; i>0; i--)
        {asm nop; asm nop;}
    }while(--t);
}

void main(void)
{
    page_addr = 0xde00;
    page_data = 0;
    page_erase();
    
    page_write();
}

* - 本贴最后修改时间:2006-12-7 19:48:02 修改者:ddtv

2楼: >>参与讨论
forthlab
这个程序好象是有点麻烦的
当时搞了我不少时间,基本思路和你一样。
我去看看原码还在么。
就是我调用ram的程序好象不要汇编的,好象是这样的:
void (*FlashBuf)(void)


3楼: >>参与讨论
ddtv
好象应该是((void *)FlashBuf)()吧?
 
4楼: >>参与讨论
imwangyi
装了CW就有参考代码的,仔细找找,肯定能找到的.
 
5楼: >>参与讨论
imwangyi
想了想,还是告诉地址吧.
C:\Program Files\FREESCALE\CodeWarrior for HC08 V5.1\(CodeWarrior_Examples)\HCS08\DEVICE Initialization C Examples\GB60_Modules\Sources\Flash_GB60

另外,C:\Program Files\FREESCALE\CodeWarrior for HC08 V5.1\(CodeWarrior_Examples)\HCS08\DEVICE Initialization C Examples\GB60_Modules\Sources  目录下有很多参考代码,只是很多兄弟没耐心多看资料,所以,隐蔽了些.

6楼: >>参与讨论
xzliu
这个是HCS08的,也能用吗?
专用的上网机器,程序还没看.问下先

7楼: >>参与讨论
imwangyi
Sorry,HC的不需要到RAM里运行的,可以直接调用.
 
8楼: >>参与讨论
forthlab
HC的不需要到RAM里运行的,可以直接调用???
搞错了吧!

* - 本贴最后修改时间:2006-12-12 13:25:05 修改者:forthlab

9楼: >>参与讨论
imwangyi
HC本身就带了ROM的程序的.
http://www.freescale.com/files/microcontrollers/doc/app_note/AN2874.pdf

10楼: >>参与讨论
forthlab
楼上的好像是2006年的新文档
以前的HC08不是ROM内没有FLASH操作代码的。有不少要自己编写的。
现在咋有了?
有人出来解释一下么?
按照这个文档,用以前的CPU可以运行么?
从那个时间开始的芯片可以用?
这么重要的事情咋没有听说?
我当时编FLASH程序的时候和FREESCALE的技术支持交流过,我也是参考了FREESCALE的在RAM操作FLASH的文档的。

* - 本贴最后修改时间:2006-12-12 16:51:00 修改者:forthlab

11楼: >>参与讨论
JerryBJ
It depends
要看具体的型号。HC08中有些型号在MONITOR ROM里边已经包含了几个非常有用的函数,比如说FLASH的擦写。具体看该型号的数据手册。一般在Developement SUPPORT或者MONITOR ROM这一章中说明,看有没有ROM-Resident Routines。
函数PRGRNGE为编程一段FLASH,而函数ERARNGE为擦除一段FLASH。调用这几个函数之前需要正确设置几个"虚拟寄存器"的值,其实是地址固定的RAM单元。在datasheet中都有说。
有些型号甚至提供EE_WRITE和EE_READ这样的函数,可以直接用来模拟EEPROM。最喜欢的是JB16,干脆提供从USB下载程序的bootloader在监控程序中。

12楼: >>参与讨论
forthlab
至少以前GT16是没有这个功能的
当时搞了不少时候也和技术支持交流过,参考过FREESCALE的文档。
但现在GT16内部的ROM支持FLASH了。
奇怪哦。不过还是好事情啊,支持

13楼: >>参与讨论
ddtv
这个片子datasheet也没说可用,实际上能调用ROM
 
14楼: >>参与讨论
张明峰
只要有ROM就肯定可以调用
我没有去核实是否每一款HC908的芯片都含有片内ROM程序。但依据MON08监控调试的原理,应该是都带有这些事先写好并固化的应用程序的。用户只要找到其调用规约就可以在自己的程序中调用(主要针对FLASH擦写和编程)。

如果芯片数据手册中没有特别指明这些ROM程序的入口规约,可以看一下芯片对应的应用笔记。很多型号都合用同一个ROM程序。

15楼: >>参与讨论
JerryBJ
有点糊涂
GT16是有这些函数的。PRGRNGE在$1B59,ERARNGE在$1B56。
QB8也是有的。PRGRNGE在$2809,ERARNGE在$2806

我碰到过JB8的ERARNGE的问题,它在擦除的时候有些单元擦不干净,会擦成FD,FE,F7等结果而不是FF,因此需要自己编写JB8的擦除程序。

ROM Resident函数在HC08 MCU上的实现有两种,它们需要的参数和调用不同。使用的时候要注意。(LK/LJ,JK/JL,JW,AP这几种MCU的ROM Resident函数和其它的不一样。)

看到过说GR8的Rom Resident函数只能在MONITOR Mode下被调用,不能在User Mode下调用。但是GR8没见过朋友们用,自己也没有试过。

我一直没有找出证据表明GP/MR/SR也具有这样的函数。但是所有的HC08 MCU都提供这些操作:
READ (read MEMORY)       
WRITE (write MEMORY)     
IREAD (indexed read)     
IWRITE (indexed write)   
等。这些操作是在监控模式下通过命令代码执行的,也是MON08调试的根本。我猜想在ROM的监控程序通过接受这些命令代码跳转到不同的程序段。想了想能否直接调用,觉得不能。

16楼: >>参与讨论
forthlab
FREESCALE要出面澄清一下
如果datasheet上面没有,而实际ROM内有,以后ROM修改了地址或功能咋办?
既然不公开,肯定有原因的,不稳定?只能在。。。条件下才能运行?

17楼: >>参与讨论
张明峰
可以这样理解:
1)若数据手册中没有说明,则应用笔记中有详细描述。应用笔记也是正式文档。
2)这些ROM程序都是经过几十种芯片上千万上亿片的实际验证,作为一种标准化的模块,实在无必要经常更该;
3)908系列正逐渐淡出。新的芯片都基于S08或RS08核,S08用BDM,不需要片内ROM程序;RS08片内FLASH不支持IAP,故也没有ROM部分。

18楼: >>参与讨论
forthlab
HC908淘汰了么?
S08的DBM有啥特色?几个断点?仿真器价格如何?

19楼: >>参与讨论
JerryBJ
BDM
MON08其实是利用驻留在ROM中的调试程序进行调试和下载。
而BDM依靠的是片内的调试硬件,它独立于CPU运行,可以监控CPU,存储器和总线。可以有3个断点,并且支持很多高级调试功能。我们用的BDM Debugger其实只是软件到芯片调试硬件之间的通讯协议转换。USBMULTILINKBDM是最常见的debugger,1000元左右。很快会有250元的Spider BDM。本地代理商也在准备推出更便宜的工具。也可以自己做。

20楼: >>参与讨论
forthlab
如果250元,还是买个用吧。
能说说HC08和HCS08的差别么?刚才到FREESCALE去看了一会E文,有点头晕,好象没有比较。
1。CPU主要区别?
2。价格区别?
3。哪个版本的codewarrioe支持HCS08?
不好意思,要麻烦DX打字了

21楼: >>参与讨论
JerryBJ
供你参考
CPU的基本架构和指令集是一样的,只不过HCS08在一些指令(操作HX的指令如LDHX,STHX和CPHX等)上多了几种寻址模式。最重要的差别在于:
a) HCS08的性能有很大提高,总线频率可以到20MHZ(指令周期50ns);外设功能增强(尤其是FLASH,ADC,TIM,SCI等外设)。
b) 低功耗。现有HCS08典型的电流参数:3V\1MHZ总线频率下低于500uA。4种低功耗模式。STOP1休眠功耗为nA级。
c)性价比增加。由于采用0.25um半导体制造工艺,可以用更少的钱买到更多的功能。
d) 创新的调试途径(BKGD),就是刚才所说的BDM了。

其实很简单,在现有HCS08里边能找到合适你用的单片机,就不要回去用HC08。如果找不到,可以选一个HC08的。

CW3.1,5.0,5.1都可以支持HCS08(安装相应补丁)。不过建议使用5.1版本。


22楼: >>参与讨论
ddtv
新版本的CODEWARRIOR都支持,最新的好象是5.7吧?
 


冷若寒 发表于 2006-12-8 19:43 飞思卡尔 单片机 ←返回版面    

High-performance and low POWER, the HCS08 does not sacrifice performance to provide low POWER 1.8 V operation. HCS08 Features - Multiple POWER management modes, including a 20 nanoamp (nA) POWER-down mode

A zero-component auto-wakeup from "stop" to help reduce costs and reduce POWER to 0.7 MICROamp (uA) - Up to 40 MHz CPU/20 MHz bus at 2.1 V and 16 MHz CPU/8 MHz bus at 1.8 V
A programmable internal clock generator with temperature and voltage compensation (typical drift < 2%) designed for reliable communications, FAST start up and reduced SYSTEM cost
In-application reprogramming and data storage via third-generation 0.25&MICRO; FLASH TECHNOLOGY
High integration including four serial communication ports, up to 8 timer/PWMs, and an 8-channel 10-bit ANALOG-to-digital converter specified down to 1.8 V.


  HCS08AW Family
Mid-range S08 with 8KB-60KB FLASH, 768B-2KB RAM, up to 2xSCI, 1xSPI, 1xI2C, 40MHZ CPU, on-chip emulation and debug, market focus is LIN/J2602 Slave, High I/O  


  HCS08G Family
High performance, general purpose, low voltage devices with A/D suitable for a wide range of industrial and consumer applications.  


  HCS08Q Family
Small, general purpose, low-POWER, feature rich. Highly integrated, general purpose devices with ADC, ANALOG comparator, multiple communications options, timers, and on-chip ICE.  


  HCS08R Family
Low POWER, high performance devices targeted to BATTERY POWERed applications.  


* - 本贴最后修改时间:2006-12-18 21:09:38 修改者:ddtv

参与讨论
昵称:
讨论内容:
 
 
相关帖子
编译时老提示RAM OVERLAP,是怎么回事?
如何实现hdlc协议?搜到的片子太贵了,有便宜点的方法吗?
求mc9328mxl最小系统电路图
关于CODEWARRIOR 的ID 文件
coldfire系列是不是都没有MMU?
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号