把张教主的FLASH写EEPROM的移到MC9S08QG8怎么不成,哪出错了?

[复制链接]
3486|9
 楼主| FENG89 发表于 2007-12-14 17:48 | 显示全部楼层 |阅读模式
把张教主的FLASH写EEPROM的移到MC9S08QG8怎么不成,哪出错了?<br />//MC9S08QG8<br /><br />#include&nbsp;&lthidef.h&gt&nbsp;/*&nbsp;for&nbsp;EnableInterrupts&nbsp;macro&nbsp;*/<br />#include&nbsp;&quot;derivative.h&quot;&nbsp;/*&nbsp;include&nbsp;peripheral&nbsp;declarations&nbsp;*/<br /><br /><br />//自己定义一个汇编NOP指令的宏<br /><br />#define&nbsp;NOP()&nbsp;asm(nop)<br />#define&nbsp;SIZE_FUNC_RAM&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;//擦写在RAM中的空间.<br /><br />//函数类型声明<br /><br />void&nbsp;WriteEE(byte*,&nbsp;byte*,&nbsp;byte);&nbsp;&nbsp;&nbsp;//写一串数据字节到E2<br />void&nbsp;EraseEE(byte*);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//擦除E2数据页<br /><br /><br />//定义一些数据段<br />//==============================================================<br />//&nbsp;Following&nbsp;data&nbsp;are&nbsp;declared&nbsp;as&nbsp;EEPROM&nbsp;(Flash&nbsp;emulation)<br />//&nbsp;Refer&nbsp;to&nbsp;PRM&nbsp;file&nbsp;for&nbsp;address&nbsp;mapping<br />//==============================================================<br />//&nbsp;&nbsp;PRM文件定义---是EEPROM定义.*/<br />//&nbsp;&nbsp;&nbsp;&nbsp;ROM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;READ_ONLY&nbsp;&nbsp;&nbsp;&nbsp;0XE000&nbsp;TO&nbsp;0XF5FF;<br />//&nbsp;&nbsp;&nbsp;&nbsp;EPROM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;READ_ONLY&nbsp;&nbsp;&nbsp;&nbsp;0xF600&nbsp;TO&nbsp;0xFDFF;<br />//&nbsp;&nbsp;&nbsp;&nbsp;ROM1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;READ_ONLY&nbsp;&nbsp;&nbsp;&nbsp;0xFE00&nbsp;TO&nbsp;0xFFCF;<br />//&nbsp;&nbsp;&nbsp;&nbsp;END<br />//PLACEMENT&nbsp;/*&nbsp;Here&nbsp;all&nbsp;predefined&nbsp;and&nbsp;user&nbsp;segments&nbsp;are&nbsp;placed&nbsp;into&nbsp;the&nbsp;SEGMENTS&nbsp;defined&nbsp;above.&nbsp;*/<br />//&nbsp;&nbsp;&nbsp;&nbsp;EEPROM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INTO&nbsp;&nbsp;EPROM;<br /><br /><br /><br /><br /><br />#pragma&nbsp;CONST_SEG&nbsp;EEPROM<br />const&nbsp;byte&nbsp;EE_Data[2048];&nbsp;//保留一页Flash空间作为E2模拟<br />//#pragma&nbsp;CONST_SEG&nbsp;DEFALUT&nbsp;//default&nbsp;data&nbsp;segment<br />//==============================================================<br />//&nbsp;Following&nbsp;data&nbsp;are&nbsp;declared&nbsp;in&nbsp;the&nbsp;direct&nbsp;addressing&nbsp;area<br />//&nbsp;for&nbsp;fast&nbsp;access&nbsp;(address&nbsp;&lt&nbsp;0x100)<br />//==============================================================<br />#pragma&nbsp;DATA_SEG&nbsp;SHORT&nbsp;MY_ZEROPAGE&nbsp;//direct&nbsp;addressing&nbsp;data&nbsp;segment<br />byte&nbsp;testData[8]={'1',&nbsp;'2',&nbsp;'3',&nbsp;'4',&nbsp;'5',&nbsp;'6',&nbsp;'7',&nbsp;'8'};&nbsp;//测试时被写入E2的数据<br /><br />//==============================================================<br />//&nbsp;Following&nbsp;data&nbsp;are&nbsp;declared&nbsp;in&nbsp;the&nbsp;common&nbsp;data&nbsp;area<br />//&nbsp;(address&nbsp;&gt=&nbsp;0x100)<br />//==============================================================<br /><br />#pragma&nbsp;DATA_SEG&nbsp;DEFALUT&nbsp;//default&nbsp;data&nbsp;segment<br /><br /><br />void&nbsp;MCU_init(void);&nbsp;//初始化MCU<br /><br /><br />//主程序入口<br /><br />void&nbsp;main(void)&nbsp;{<br /><br />MCU_init();<br /><br />EnableInterrupts;<br />&nbsp;EraseEE((byte*)EE_Data);<br />WriteEE((byte*)EE_Data,&nbsp;testData,&nbsp;8);<br />for(;;)&nbsp;{<br />__RESET_WATCHDOG();&nbsp;//&nbsp;feeds&nbsp;the&nbsp;dog<br /><br />}<br /><br />}<br /><br /><br />//MCU初始化子程序<br /><br />void&nbsp;MCU_init(void)<br />{<br />//&nbsp;配置时钟频率<br />&nbsp;FCDIV&nbsp;=&nbsp;0x27;&nbsp;//set&nbsp;FCLK&nbsp;base&nbsp;on&nbsp;8MHz&nbsp;Fbus&nbsp;&nbsp;200K<br />}<br /><br /><br />//下面这段代码是专门为启动Flash编程命令然后查询编程结束标志<br /><br />//在执行之前必须被拷贝到RAM区(任意地址),然后从RAM中运行<br /><br />//=============================================================================<br />byte&nbsp;ExecEePrgCmd(byte&nbsp;cmd)<br />{<br />FCMD&nbsp;=&nbsp;cmd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//set&nbsp;command<br />FSTAT_FCBEF&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;//command&nbsp;launched&nbsp;and&nbsp;FCBEF&nbsp;cleared<br />NOP();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//wait&nbsp;at&nbsp;least&nbsp;4&nbsp;nop<br />NOP();<br />NOP();<br />NOP();<br />if&nbsp;(FSTAT_FPVIOL&nbsp;||&nbsp;FSTAT_FACCERR)&nbsp;{&nbsp;&nbsp;//exit&nbsp;if&nbsp;encounter&nbsp;any&nbsp;error<br />return(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//return&nbsp;with&nbsp;error&nbsp;flag<br />}<br />while(!FSTAT_FCCF)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//wait&nbsp;for&nbsp;FCCF=1<br />__RESET_WATCHDOG();&nbsp;<br />}<br />return(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//return&nbsp;with&nbsp;success<br />}<br /><br /><br />//定义上面一段代码的长度,编译后不超过50字节<br />//写一串数据到模拟E2区,大部分代码是在Flash区内运行的,只是上面关键的一小段代码必须拷贝到RAM区才能运行<br /><br />void&nbsp;WriteEE(byte*&nbsp;eeAddr,&nbsp;byte*&nbsp;datBuff,&nbsp;byte&nbsp;byteCount)<br />{<br />byte&nbsp;i;<br />byte&nbsp;*srcPtr;<br />byte&nbsp;codeBuff[SIZE_FUNC_RAM];&nbsp;//buffer&nbsp;size&nbsp;is&nbsp;slightly&nbsp;bigger&nbsp;than&nbsp;the&nbsp;length&nbsp;of&nbsp;ExecEePrgCmd&nbsp;function<br /><br />//这里示范的是将关键代码拷贝到局部变量(堆栈)区。用户可以将代码拷贝到静态数据区,一样使用<br /><br />//Copy&nbsp;ExecEePrgCmd&nbsp;code&nbsp;into&nbsp;RAM<br />srcPtr&nbsp;=&nbsp;(byte*)ExecEePrgCmd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//function&nbsp;entry&nbsp;in&nbsp;Flash<br />for&nbsp;(i=0;i&ltSIZE_FUNC_RAM;i++)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//do&nbsp;byte&nbsp;copy<br />codeBuff&nbsp;=&nbsp;srcPtr;<br />}<br /><br />FSTAT_FACCERR&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//clear&nbsp;any&nbsp;pending&nbsp;Flash&nbsp;error&nbsp;flag<br /><br />while&nbsp;(byteCount)&nbsp;{<br />*eeAddr++&nbsp;=&nbsp;*datBuff++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//latch&nbsp;data&nbsp;byte&nbsp;and&nbsp;memory&nbsp;address<br />DisableInterrupts;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//禁止任何中断,很重要!!!<br />((byte&nbsp;(*)(byte))codeBuff)(0x20);&nbsp;&nbsp;&nbsp;//编程一个字节&nbsp;在前面加&nbsp;(void)就没有了报警&nbsp;-C1420<br />EnableInterrupts;<br />byteCount--;<br />}<br />}<br /><br /><br />//擦除E2页面,原理基本同上//=============================================================================<br />//&nbsp;Erase&nbsp;a&nbsp;page&nbsp;of&nbsp;EEPROM&nbsp;(Flash&nbsp;emulated)<br />//=============================================================================<br />void&nbsp;EraseEE(byte*&nbsp;eeAddr)<br />{<br />byte&nbsp;i;<br />byte&nbsp;*srcPtr;<br />byte&nbsp;codeBuff[SIZE_FUNC_RAM];&nbsp;//buffer&nbsp;size&nbsp;is&nbsp;slightly&nbsp;bigger&nbsp;than&nbsp;the&nbsp;length&nbsp;of&nbsp;ExecEePrgCmd&nbsp;function<br /><br />//Copy&nbsp;ExecEePrgCmd&nbsp;code&nbsp;into&nbsp;RAM<br />srcPtr&nbsp;=&nbsp;(byte*)ExecEePrgCmd;&nbsp;//function&nbsp;entry&nbsp;in&nbsp;Flash<br />for&nbsp;(i=0;i&ltSIZE_FUNC_RAM;i++)&nbsp;{&nbsp;//do&nbsp;byte&nbsp;copy<br />codeBuff&nbsp;=&nbsp;srcPtr;<br />}<br /><br />FSTAT_FACCERR&nbsp;=&nbsp;1;&nbsp;//clear&nbsp;any&nbsp;pending&nbsp;Flash&nbsp;error&nbsp;flag<br /><br />*eeAddr&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//latch&nbsp;memory&nbsp;address<br />DisableInterrupts;<br />((byte&nbsp;(*)(byte))codeBuff)(0x40);&nbsp;//do&nbsp;page&nbsp;erase在前面加&nbsp;(void)就没有了报警&nbsp;-C1420<br />EnableInterrupts;<br />}<br /><br />
forthlab 发表于 2007-12-14 19:15 | 显示全部楼层

是否也是栈溢出了,放大些.

没有看你的程序<br />我也遇到过FLASH程序操作问题.是栈太小了.<br />你的程序是否也是栈溢出了,放大些.
feng89 发表于 2007-12-14 23:25 | 显示全部楼层

改大了也不行!

改大了也不行,看了好多例,大部份是用汇编的,操作流程也了解了,在汇编中,地址是放到H:X中的,但在C中,一点不了解,楼上兄弟,能否方便给你的程序我参考一下?&nbsp;
forthlab 发表于 2007-12-15 11:33 | 显示全部楼层

给个邮件,我把我的flash程序给你

  
feng89 发表于 2007-12-15 12:59 | 显示全部楼层

我的电子邮件

谢谢兄弟,<br />我的电子邮件:ttgp@21cn.com
forthlab 发表于 2007-12-15 15:41 | 显示全部楼层

邮件已经发了

建议参考这个帖子:<br />https://bbs.21ic.com/club/bbs/bbsView.asp?boardid=11<br />
feng89 发表于 2007-12-15 16:44 | 显示全部楼层

谢谢,但少了一个函数

谢谢,但少了一个函数<br />memcpy(_pgm&nbsp;+&nbsp;2,&nbsp;ROM_PGM,&nbsp;sizeof(ROM_PGM));这个少了,能给我补上来吗?
forthlab 发表于 2007-12-15 18:06 | 显示全部楼层

memcpy()是标准函数,lib库里面的

memcpy()是标准函数,lib库里面的
张明峰 发表于 2007-12-15 22:43 | 显示全部楼层

找了个QG8试了下

发现楼主的代码应该是完全可以正常工作的。但发现有一个问题:如果调试界面的memory观察窗口对准模拟EEPROM区域显示的话,程序运行后内容没有变化。难道是CW的问题?我用CW6.0版做的测试。
feng89 发表于 2007-12-16 14:05 | 显示全部楼层

原来是这样,我也是在CW6.0的,写一个显示程序看看!

原来是这样,我也是在CW6.0的,写一个显示程序看看!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

162

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部