at91sam7s64可以读写自己的flash麽?

[复制链接]
6971|18
 楼主| soulmate 发表于 2008-1-2 16:58 | 显示全部楼层 |阅读模式
RT~有人做过麽~
 楼主| soulmate 发表于 2008-1-2 17:01 | 显示全部楼层

ddd

我想把串口采集来的数据保存在at91sam7s64内部的flash里面,有人做过麽<br />~
阿南 发表于 2008-1-2 17:49 | 显示全部楼层

没有做过,我想应该是不可以的

您可以这样去考虑(或是说寻找答案,实验):<br />1.先将程序复制到RAM(或映射的方法),然后在RAM中运行.<br />2.找到读写Flash的方法
 楼主| soulmate 发表于 2008-1-2 18:55 | 显示全部楼层

但是下面这篇文章中好像提出了这个解决办法啊~

http://www.diybl.com/course/3_program/jdkf/20071215/92214.html<br /><br />因为没有使用过,面临要不要制pcb版~很着急~<br /><br />文章中的意思和阿南所说的意思类似~但没有详细一些的例子或结论~<br />一、AT91SAM7S系列芯片简介<br /><br />AT91SAM7S系列控制器芯片是ATMEL公司推出的基于ARM内核的Flash闪存控制器芯片。其集成了ARM7TDMI&nbsp;ARM&nbsp;Thumb处理器,片内高速Flash存储器,片内高速SRAM,丰富的外设资源,包括一个USB2.0设备,使外部器件数目减至最低的完整系统功能集。这个芯片是那些正在寻求额外处理能力和更大存储器的8位处理器用户的理想选择。<br /><br />AT91SAM7S系列芯片主要有AT91SAM7S64/AT91SAM7S128/AT91SAM7S256/AT91SAM7S512几种型号。它们之间主要的区别在于Flash和SRAM空间大小的不同,以适应不同产品应用的需要。<br /><br /><br />二、目标平台介绍和要实现的功能<br /><br />平台主要实现一个移动电视USB&nbsp;Dongle的功能。外观类似于一个U盘,直接接到电脑或其它支持USB传输的移动设备上,配合视音频解码播放器即可实现移动电视的接收、播放功能。USB&nbsp;Dongle由Tuner、Demodulator和AT91SAM7S64三个主芯片组成。Tuner实现空中高频信号到中频信号的转换,Demodulator实现信号的基带解调功能,AT91SAM7S64主要完成程序的控制以及将解调出的视音频数据向PC端传输。AT91SAM7S64包含一个64K的片内Flash和一个16K的片内SRAM。<br /><br />目前平台使用了一块EEPROM用于存储CA(Conditional&nbsp;Access)的一些信息。主程序在Flash上运行,除去主程序占用的空间外,Flash上还留有较大的空间。目标是用实现用剩下的Flash空间替换原来的EEPROM,以节省产品的成本。<br /><br />三、分散加载程序的实现<br /><br />AT91SAM7S64的内部Flash只有一个Plane(目前该系列芯片只有AT91SAM7S512是Dual&nbsp;Plane的),在对其编程时不能在其上运行程序,所以对Flash进行编程时,程序必须调入RAM中运行。ATMEL网站上描述如下:<br /><br />The&nbsp;AT91SAM7S&nbsp;device&nbsp;has&nbsp;only&nbsp;one&nbsp;flash&nbsp;memory&nbsp;plane,&nbsp;thus&nbsp;making&nbsp;impossible&nbsp;read-while-write&nbsp;operations.&nbsp;<br /><br />All&nbsp;write/erase&nbsp;flash&nbsp;routines&nbsp;must&nbsp;be&nbsp;run&nbsp;from&nbsp;the&nbsp;internal&nbsp;SRAM.&nbsp;Depending&nbsp;on&nbsp;the&nbsp;memory&nbsp;layout&nbsp;of&nbsp;the&nbsp;application,&nbsp;it&nbsp;will&nbsp;be&nbsp;preferable&nbsp;to&nbsp;disable&nbsp;all&nbsp;interrupts&nbsp;during&nbsp;write&nbsp;and&nbsp;erase&nbsp;operations.<br /><br />If&nbsp;the&nbsp;exception&nbsp;vectors&nbsp;(and&nbsp;also&nbsp;ISR's)&nbsp;are&nbsp;kept&nbsp;in&nbsp;flash&nbsp;memory,&nbsp;and&nbsp;if&nbsp;IRQs&nbsp;are&nbsp;not&nbsp;disabled,&nbsp;the&nbsp;ARM&nbsp;core&nbsp;will&nbsp;make&nbsp;an&nbsp;access&nbsp;to&nbsp;the&nbsp;vector&nbsp;table&nbsp;located&nbsp;in&nbsp;the&nbsp;flash&nbsp;memory&nbsp;when&nbsp;an&nbsp;IRQ&nbsp;appears.&nbsp;If&nbsp;a&nbsp;write&nbsp;or&nbsp;an&nbsp;erase&nbsp;sequence&nbsp;is&nbsp;on-going&nbsp;at&nbsp;that&nbsp;time,&nbsp;it&nbsp;may&nbsp;lead&nbsp;to&nbsp;an&nbsp;unsuccessfull&nbsp;write&nbsp;or&nbsp;erase&nbsp;operation.<br /><br />要实现这样的功能在IAR编译器上比较容易实现,只需要在函数定义之前用关键字__ramfunc声明即可。但在ADS上相对要麻烦很多,实现的方法有多种,这里只介绍其中两种。<br />第一、在启动代码中用汇编实现将存储在Flash上的程序全部Copy到SRAM中,然后再跳转到SRAM上运行。以下代码实现程序拷贝和地址重映射功能:<br /><br />;------------------------------------------------<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;copy&nbsp;bootloader&nbsp;in&nbsp;RAM<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;r0,&nbsp;=ramstart<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;r1,&nbsp;=bootsize<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;r2,&nbsp;=0<br /><br />&nbsp;<br /><br />copy<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;r3,&nbsp;[r2]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STR&nbsp;r3,&nbsp;[r2,&nbsp;r0]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ADD&nbsp;r2,&nbsp;r2,&nbsp;#4<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUBS&nbsp;r1,&nbsp;r1,&nbsp;#1<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BNE&nbsp;copy<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;perform&nbsp;a&nbsp;RAM&nbsp;remap&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;r0,&nbsp;=AT91C_BASE_MC<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;r1,&nbsp;=AT91C_MC_RCB<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STR&nbsp;r1,&nbsp;[r0,&nbsp;#MC_RCR]<br /><br />;------------------------------------------------<br /><br />第二、利用ADS分散加载程序的方法实现不同程序加载到不同的地址空间上运行。<br /><br />由于AT91SAM7S64的片内SRAM只有16K的存储空间,而程序超过了16K,不能满足平台要求,所以用了第二种方法。要实现分散加载必须对AT91SAM7S64地址空间的分配比较清楚。下图列出了AT91SAM7S64的片内存储器映射关系,地址0x00000000在AT91SAM7S64的Remap之前是Flash的访问地址,Remap之后是SRAM的访问地址。<br /><br /><br /><br /><br />&nbsp;<br /><br />&nbsp;了解AT91SAM7S64的片内存储器空间分配之后需要对自己的程序存放位置进行规划,以下是自定义的Scf文件(关于Scf文件格式参考另一篇文章“ADS下的分散加载文件应用实例”)。<br /><br />ROM_LOAD&nbsp;0x00100000<br /><br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ROM_EXEC&nbsp;0x00100000<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cstartup.o&nbsp;(reset,&nbsp;+First)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(+RO)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;RAM1&nbsp;0x00200800<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(+RW,+ZI)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;RAM2&nbsp;0x00202800<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flash.o&nbsp;(ramfunc)&nbsp;&nbsp;;&nbsp;对Flash编程的函数定义在该文件中<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}<br /><br />利用分散加载方法需要自定义一个函数__user_initial_stackheap,否则编译器编译时会报错。__user_initial_stackheap定义如下:<br /><br />#include&nbsp;&ltrt_misc.h&gt<br /><br />__value_in_regs&nbsp;struct&nbsp;__initial_stackheap&nbsp;__user_initial_stackheap(<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;R0,&nbsp;unsigned&nbsp;SP,&nbsp;unsigned&nbsp;R2,&nbsp;unsigned&nbsp;SL)<br /><br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;__initial_stackheap&nbsp;config;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//config.heap_base&nbsp;=&nbsp;(unsigned&nbsp;int)&bottom_of_heap;&nbsp;//&nbsp;defined&nbsp;in&nbsp;heap.s<br /><br />&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;&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;placed&nbsp;by&nbsp;scatterfile&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;config.stack_base&nbsp;=&nbsp;SP;&nbsp;&nbsp;&nbsp;//&nbsp;inherit&nbsp;SP&nbsp;from&nbsp;the&nbsp;execution&nbsp;environment<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;config;<br /><br />}<br /><br />在&ltrt_misc.h&gt文件中你可以找到结构体__initial_stackheap的定义&nbsp;<br />struct&nbsp;__initial_stackheap&nbsp;{&nbsp;<br />unsigned&nbsp;heap_base;&nbsp;/*&nbsp;low-address&nbsp;end&nbsp;of&nbsp;initial&nbsp;heap&nbsp;*/&nbsp;<br />unsigned&nbsp;stack_base;&nbsp;/*&nbsp;high-address&nbsp;end&nbsp;of&nbsp;initial&nbsp;stack&nbsp;*/&nbsp;<br />unsigned&nbsp;heap_limit;&nbsp;/*&nbsp;high-address&nbsp;end&nbsp;of&nbsp;initial&nbsp;heap&nbsp;*/&nbsp;<br />unsigned&nbsp;stack_limit;&nbsp;/*&nbsp;low-address&nbsp;end&nbsp;of&nbsp;initial&nbsp;stack&nbsp;*/&nbsp;<br />};<br /><br />设置编译器的链接方式为Scattered,选择自定义的scf文件,make成功。通过打印函数地址显示,Flash.c文件中定义的函数在SRAM里面运行,其它函数在Flash的地址空间中运行,在Flash中运行的函数调用SRAM中编程Flash的函数,读写正常。<br /><br />&nbsp;<br /><br />&nbsp;<br /><br /><br />
 楼主| soulmate 发表于 2008-1-2 19:00 | 显示全部楼层

阿南~我拜读了您的at91san7s64调试笔记~

&nbsp;&nbsp;第一次使用这颗芯片~pcb板子已经制了~现在发现就是遇到这个头大的问题了~也就是他能不能在flash中保存数据~<br />&nbsp;&nbsp;我有大量的数据要想动态保存到flash里面~很是心急~
mr.king 发表于 2008-1-2 20:39 | 显示全部楼层

能放,但速度不快,象所有FLASH写都要时间一样,大量是不合适的

  
 楼主| soulmate 发表于 2008-1-2 21:02 | 显示全部楼层

呵呵~看到希望了~谢谢~

  
mohanwei 发表于 2008-1-2 21:16 | 显示全部楼层

挂一块AT24CXX啦……这么便宜

  
阿南 发表于 2008-1-3 18:59 | 显示全部楼层

如果是应用到产品,楼主可以找ATMEL原长或代理商的技术支持,

你的想法是否可行,及他们有没有这方面的资料.他们的几句话,可能让楼主忙好几天
Swd21ic 发表于 2008-1-3 20:30 | 显示全部楼层

!!!!

告诉你肯定能写..因为我就写了..&nbsp;&nbsp;<br /><br />不过你要老写就不好了..<br /><br />一般Flash编程都要判忙的..几十ms.<br /><br />DATASHEET上说了内部FLASH每页只能编程1万次...所以不安全的.
 楼主| soulmate 发表于 2008-1-3 20:43 | 显示全部楼层

唉~

&nbsp;&nbsp;唉~都找过了~他们自己都没有用过~有的说不知道~有得翻翻书说不行~有的说没有这样用过~英贝德~英蓓特~atmel的代理等等我都问了~&nbsp;还是自己想办法解决吧~我只要知道别人能实现就可以了`
chunk 发表于 2008-1-4 11:19 | 显示全部楼层

可以写FLASH,

但是向AT91C_BASE_MC-&gtMC_FCR写入命令的代码要放在RAM中,且此代码执行时不能有中断,除非中断服务程序也在RAM中。也就是说FLASH在写入时是不允许同时读取的。<br /><br />好象IAR的编译器支持__ramfunc这样的扩展,ADS可以使用分散加载,或者你用C编写好WriteFlash函数,编译成汇编源码,把其中的一行处理一下:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AREA&nbsp;||.text||,&nbsp;CODE,&nbsp;READONLY&nbsp;&nbsp;&nbsp;&nbsp;改为<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AREA&nbsp;||.text||,&nbsp;CODE,&nbsp;READWRITE<br /><br />以后直接使用这个汇编源码就行了。
wenchang 发表于 2008-1-6 12:37 | 显示全部楼层

可以,我就这么做的!

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RSEG&nbsp;ICODE:CODE<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CODE32<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PUBLIC&nbsp;&nbsp;IFlash_Write_Page<br /><br />;--------------------------------------------------------------------;BOOL&nbsp;IFlash_Write_Page(unsigned&nbsp;int&nbsp;page,&nbsp;unsigned&nbsp;int&nbsp;*buff)<br />IFlash_Write_Page:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp,sp,#4<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STMFD&nbsp;&nbsp;&nbsp;&nbsp;sp!,{r0-r3,lr}<br />L0_16:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,=L1_00<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,=L1_88<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ADD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,r2,#4<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r2,r1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,sp,r0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[sp,#20]<br />L0_36:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDMIA&nbsp;&nbsp;&nbsp;&nbsp;r1!,{r3}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STMIA&nbsp;&nbsp;&nbsp;&nbsp;r0!,{r3}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,r2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;L0_36<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDMFD&nbsp;&nbsp;&nbsp;&nbsp;sp!,{r0-r3,lr}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDMFD&nbsp;&nbsp;&nbsp;&nbsp;sp!,{pc}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;Goto&nbsp;ram&nbsp;for&nbsp;write&nbsp;IFLASH<br /><br />L1_00:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,#0x100000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;IFLASH_ADDR_START:&nbsp;0x100000<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ADD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r3,r2,r0,LSL&nbsp;#8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;IFLASH_PAGE_SIZE:&nbsp;64dword&nbsp;=&nbsp;256byte<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,#0<br />L1_12:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r12,[r1],#4<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ADD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,r2,#1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,#0x40<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r12,[r3],#4<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;L1_12<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,#0x00480000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;MCLK&nbsp;=&nbsp;48M,&nbsp;FMCN&nbsp;=&nbsp;72<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,r1,#0x100<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,#0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,[r1,#-0xa0]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,L1_88<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r1,r0,LSL&nbsp;#8<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r0,#1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,r0,#0x5a000000<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,#0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r1,#-0x9c]<br />L1_56:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r1,#-0x98]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,#1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BEQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;L1_56<br /><br />;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,[r1,#-0x98]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,#0xc<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MVNEQ&nbsp;&nbsp;&nbsp;&nbsp;r0,#0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVNE&nbsp;&nbsp;&nbsp;&nbsp;r0,#1<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lr<br />L1_88:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0003ff00<br /><br />;--------------------------------------------------------------------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PUBLIC&nbsp;&nbsp;ARMDisableInt<br />ARMDisableInt:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STMFD&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MRS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;CPSR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r0,&nbsp;#0x80<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPSR_cxsf,&nbsp;r0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDMFD&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lr<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PUBLIC&nbsp;&nbsp;ARMEnableInt<br />ARMEnableInt:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STMFD&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MRS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;CPSR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BIC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r0,&nbsp;#0x80<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPSR_cxsf,&nbsp;r0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDMFD&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lr<br /><br />;--------------------------------------------------------------------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;END<br /><br /><br />根据你使用的编译工具和芯片做简单修改吧,这里提供思想方法!
hotpower 发表于 2008-1-6 12:39 | 显示全部楼层

IAP现在的ARM估计都有此功能~~~

  
janusz 发表于 2008-1-18 16:19 | 显示全部楼层

at91sam7s64可以读写自己的flash麽?

LZ如果不介意的话,可以发个EMAIL过来.janus@baite-group.com.<br />我们是ATMEL&nbsp;ARM产品线最强的代理.有相当的技术支持及研发能力.<br />
 楼主| soulmate 发表于 2008-1-25 14:07 | 显示全部楼层

我已经做成功了~

&nbsp;贴上来~给有需要的人~<br />&nbsp;NND~几句破代码,被搞得神神秘秘的~鄙视一下~<br />&nbsp;__ramfunc&nbsp;void&nbsp;Read_Page(int&nbsp;Page_Number,int&nbsp;*Buffer,int&nbsp;len)<br />{<br />&nbsp;&nbsp;unsigned&nbsp;int&nbsp;&nbsp;*Flash_Address;<br />&nbsp;&nbsp;int&nbsp;i;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;Flash_Address&nbsp;=&nbsp;(&nbsp;unsigned&nbsp;int&nbsp;&nbsp;*&nbsp;)(&nbsp;0x100000+Page_Number*256&nbsp;);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;//每次读是一个字,四个字节<br />&nbsp;&nbsp;for(&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;len;&nbsp;i++&nbsp;)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Buffer[&nbsp;i&nbsp;]&nbsp;=&nbsp;*(&nbsp;Flash_Address&nbsp;+&nbsp;i&nbsp;)&nbsp;&nbsp;;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />}&nbsp;&nbsp;<br /><br />__ramfunc&nbsp;int&nbsp;Write_Page(&nbsp;int&nbsp;Page_Number,int&nbsp;*Buffer,int&nbsp;len)<br />{<br />&nbsp;&nbsp;unsigned&nbsp;int&nbsp;&nbsp;*Flash_Address;<br />&nbsp;&nbsp;int&nbsp;i;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;AT91C_BASE_MC-&gtMC_FMR&nbsp;=&nbsp;(&nbsp;(&nbsp;72&nbsp;)&nbsp;&lt&lt&nbsp;16&nbsp;)&nbsp;|&nbsp;AT91C_MC_FWS_1FWS&nbsp;&nbsp;;&nbsp;&nbsp;//编程前页擦除<br />&nbsp;&nbsp;AT91C_BASE_MC-&gtMC_FCR&nbsp;=&nbsp;(&nbsp;0x5A&nbsp;&lt&lt&nbsp;24&nbsp;)&nbsp;|&nbsp;(&nbsp;(&nbsp;Page_Number&nbsp;&lt&lt&nbsp;8&nbsp;)&nbsp;&&nbsp;AT91C_MC_PAGEN)&nbsp;|&nbsp;AT91C_MC_FCMD_UNLOCK&nbsp;;//解锁&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;while&nbsp;(&nbsp;(&nbsp;AT91C_BASE_MC-&gtMC_FSR&nbsp;&&nbsp;AT91C_MC_FRDY)&nbsp;!=&nbsp;1&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;Flash_Address&nbsp;=&nbsp;(&nbsp;unsigned&nbsp;int&nbsp;&nbsp;*&nbsp;)(&nbsp;0x100000+Page_Number*256&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;//每次写是一个字,四个字节<br />&nbsp;&nbsp;for(&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;len;&nbsp;i++&nbsp;)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;*(&nbsp;Flash_Address&nbsp;+&nbsp;i&nbsp;)&nbsp;=&nbsp;Buffer[&nbsp;i&nbsp;];<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;if(&nbsp;(&nbsp;AT91C_BASE_MC-&gtMC_FSR&nbsp;&&nbsp;AT91C_MC_FRDY)&nbsp;!=&nbsp;1&nbsp;)<br />&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br />&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;AT91C_BASE_MC-&gtMC_FCR&nbsp;=&nbsp;(&nbsp;0x5A&nbsp;&lt&lt&nbsp;24&nbsp;)&nbsp;|&nbsp;(&nbsp;(&nbsp;Page_Number&nbsp;&lt&lt&nbsp;8&nbsp;)&nbsp;&&nbsp;AT91C_MC_PAGEN)&nbsp;|&nbsp;AT91C_MC_FCMD_PROG_AND_LOCK&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;//编程及锁定<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;while(&nbsp;1&nbsp;)<br />&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;AT91C_BASE_MC-&gtMC_FSR&nbsp;&&nbsp;0x01&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;AT91C_BASE_MC-&gtMC_FSR&nbsp;&&nbsp;AT91C_MC_LOCKE&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;AT91C_BASE_MC-&gtMC_FSR&nbsp;&&nbsp;AT91C_MC_PROGE&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;return&nbsp;1;<br />}&nbsp;//Write_Page
mxh0506 发表于 2008-1-26 22:27 | 显示全部楼层

楼上是个爽快人,佩服!

  
Swd21ic 发表于 2008-1-27 18:54 | 显示全部楼层

Re

楼主,太搞笑.<br />我已经告诉你可以了..<br />还问来问去的..<br /><br />如果Atmel的技术支持说不可以的话我严重怀疑是不是沟通有问题.<br />
numlong 发表于 2008-1-27 19:24 | 显示全部楼层

soulmate 顶!赞一个1

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

145

帖子

1

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