|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
高人帮我看看下面这段程序--ram中flash的擦除改写 |
作者:ddtv 栏目:单片机 |
单片机是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 于 2006/12/7 19:52:00 发布:
这个程序好象是有点麻烦的 当时搞了我不少时间,基本思路和你一样。 我去看看原码还在么。 就是我调用ram的程序好象不要汇编的,好象是这样的: void (*FlashBuf)(void) |
3楼: | >>参与讨论 |
作者: ddtv 于 2006/12/8 11:28:00 发布:
好象应该是((void *)FlashBuf)()吧? |
4楼: | >>参与讨论 |
作者: imwangyi 于 2006/12/8 15:40:00 发布:
装了CW就有参考代码的,仔细找找,肯定能找到的. |
5楼: | >>参与讨论 |
作者: imwangyi 于 2006/12/8 15:44:00 发布:
想了想,还是告诉地址吧. 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 于 2006/12/11 19:50:00 发布:
这个是HCS08的,也能用吗? 专用的上网机器,程序还没看.问下先 |
7楼: | >>参与讨论 |
作者: imwangyi 于 2006/12/11 22:21:00 发布:
Sorry,HC的不需要到RAM里运行的,可以直接调用. |
8楼: | >>参与讨论 |
作者: forthlab 于 2006/12/12 9:17:00 发布:
HC的不需要到RAM里运行的,可以直接调用??? 搞错了吧! * - 本贴最后修改时间:2006-12-12 13:25:05 修改者:forthlab |
9楼: | >>参与讨论 |
作者: imwangyi 于 2006/12/12 13:28:00 发布:
HC本身就带了ROM的程序的. http://www.freescale.com/files/microcontrollers/doc/app_note/AN2874.pdf |
10楼: | >>参与讨论 |
作者: forthlab 于 2006/12/12 16:30:00 发布:
楼上的好像是2006年的新文档 以前的HC08不是ROM内没有FLASH操作代码的。有不少要自己编写的。 现在咋有了? 有人出来解释一下么? 按照这个文档,用以前的CPU可以运行么? 从那个时间开始的芯片可以用? 这么重要的事情咋没有听说? 我当时编FLASH程序的时候和FREESCALE的技术支持交流过,我也是参考了FREESCALE的在RAM操作FLASH的文档的。 * - 本贴最后修改时间:2006-12-12 16:51:00 修改者:forthlab |
11楼: | >>参与讨论 |
作者: JerryBJ 于 2006/12/12 19:12:00 发布:
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 于 2006/12/13 9:28:00 发布:
至少以前GT16是没有这个功能的 当时搞了不少时候也和技术支持交流过,参考过FREESCALE的文档。 但现在GT16内部的ROM支持FLASH了。 奇怪哦。不过还是好事情啊,支持 |
13楼: | >>参与讨论 |
作者: ddtv 于 2006/12/13 17:06:00 发布:
这个片子datasheet也没说可用,实际上能调用ROM |
14楼: | >>参与讨论 |
作者: 张明峰 于 2006/12/13 17:19:00 发布:
只要有ROM就肯定可以调用 我没有去核实是否每一款HC908的芯片都含有片内ROM程序。但依据MON08监控调试的原理,应该是都带有这些事先写好并固化的应用程序的。用户只要找到其调用规约就可以在自己的程序中调用(主要针对FLASH擦写和编程)。 如果芯片数据手册中没有特别指明这些ROM程序的入口规约,可以看一下芯片对应的应用笔记。很多型号都合用同一个ROM程序。 |
15楼: | >>参与讨论 |
作者: JerryBJ 于 2006/12/13 22:54:00 发布:
有点糊涂 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 于 2006/12/14 10:10:00 发布:
FREESCALE要出面澄清一下 如果datasheet上面没有,而实际ROM内有,以后ROM修改了地址或功能咋办? 既然不公开,肯定有原因的,不稳定?只能在。。。条件下才能运行? |
17楼: | >>参与讨论 |
作者: 张明峰 于 2006/12/14 11:31:00 发布:
可以这样理解: 1)若数据手册中没有说明,则应用笔记中有详细描述。应用笔记也是正式文档。 2)这些ROM程序都是经过几十种芯片上千万上亿片的实际验证,作为一种标准化的模块,实在无必要经常更该; 3)908系列正逐渐淡出。新的芯片都基于S08或RS08核,S08用BDM,不需要片内ROM程序;RS08片内FLASH不支持IAP,故也没有ROM部分。 |
18楼: | >>参与讨论 |
作者: forthlab 于 2006/12/18 17:31:00 发布:
HC908淘汰了么? S08的DBM有啥特色?几个断点?仿真器价格如何? |
19楼: | >>参与讨论 |
作者: JerryBJ 于 2006/12/18 19:07:00 发布:
BDM MON08其实是利用驻留在ROM中的调试程序进行调试和下载。 而BDM依靠的是片内的调试硬件,它独立于CPU运行,可以监控CPU,存储器和总线。可以有3个断点,并且支持很多高级调试功能。我们用的BDM Debugger其实只是软件到芯片调试硬件之间的通讯协议转换。USBMULTILINKBDM是最常见的debugger,1000元左右。很快会有250元的Spider BDM。本地代理商也在准备推出更便宜的工具。也可以自己做。 |
20楼: | >>参与讨论 |
作者: forthlab 于 2006/12/18 19:42:00 发布:
如果250元,还是买个用吧。 能说说HC08和HCS08的差别么?刚才到FREESCALE去看了一会E文,有点头晕,好象没有比较。 1。CPU主要区别? 2。价格区别? 3。哪个版本的codewarrioe支持HCS08? 不好意思,要麻烦DX打字了 |
21楼: | >>参与讨论 |
作者: JerryBJ 于 2006/12/18 20:07:00 发布:
供你参考 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 于 2006/12/18 21:06:00 发布:
新版本的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 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |