Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 5180|回復: 1
打印 上一主題 下一主題

如何對ARM內部Flash編程?

[複製鏈接]
跳轉到指定樓層
1#
發表於 2006-11-13 12:11:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
3Chipcoin
[轉貼] 第一次使用ARM,遇到以下問題,望各位大大為我指條明路:
1 y; Q0 y; e7 O2 @/ `- o" z% _* Q* K$ i3 |
    寫Flash函數如下:1 r7 f9 p% I+ K: n; w4 N* g3 Q$ P
int Write_Page(int *Buffer/*數據源指標*/)
' I! W& i% Q: M7 r{
% c5 ]4 X, r: A2 D6 ~  unsigned int  *Flash_Address;
7 X5 ?3 M% B0 j  int i;  " l; W  h$ x4 I% ]+ C* j- `6 ?
  
& J6 U3 l! ^# Y) x. V% l  # Q/ j( T/ P  R$ F
  if(AT91C_BASE_MC->MC_FSR & 0x01)) N- l4 i5 b. w1 p, G; P
  {- C( @1 o6 N9 r% H+ j
  * V1 }) R/ j4 k+ e2 ^* K! N
  }
5 s. |8 a8 t% T  else: A. X- d+ L6 Y" V* @0 D) l. j
  {% H- s$ h' _4 Z" I. a
      return 1;
3 p" q1 P$ X% b6 @0 i2 d! ^  }8 W( ?4 T/ Q6 j- Z# \! h, i7 V
  //) X9 a/ S( m6 q& c
  Flash_Address = (unsigned int *)(0x100000+FLASH_SAVE_PAGE_ADD*256);3 I* r. V6 E) n) \* z; Z
    7 L; a+ f' x+ X" A. R& @
  //0 H. O- k: e3 U; [8 J
  for(i=0;i<64;i++)8 }1 V! i8 U: B2 F" C# A$ s0 @3 S
  {" z7 v9 }% `0 h1 P2 c: w
    *(Flash_Address + i) = Buffer;! U1 Q; _0 x1 p+ l4 K
  }6 v8 k9 ]3 o: y, _0 J
  
7 B/ J5 B! u- v: w9 N# \9 _; \- p  if( ( AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY) != 1 )' |' t1 ]. {7 ]; R7 |
  {  2 n1 X0 O5 e; c, ]6 S
    return 1;
- u8 z% `  t+ J( x' ?$ I# K; Z  }
4 X( m5 e, I% k2 r* K- R0 W  $ ?! t; ?5 l( T; C6 t) `
  AT91C_BASE_MC->MC_FMR = ((0x48)<<16) | 91C_MC_FWS_1FWS  ;  # j$ |( f! {" _$ k0 ~& W4 `, {' V
//108us  ,wait state 2 cycles1 J, N+ i% u0 w' A" R( o- O! K
% Y6 t9 e8 D. F# T8 G5 F
  AT91C_BASE_MC->MC_FCR = ( 0x5A <<24) | ((FLASH_SAVE_PAGE_ADD<<8)&AT91C_MC_PAGEN) | AT91C_MC_FCMD_START_PROG ;//write page
" i9 u  o6 e- k8 S+ X) Z7 c  
3 ]" X  W" U3 R: @- B/ d- Q: g
  M# S4 I% M+ t2 I1 I# \+ Z  while(1)
6 m, F. }* M( w" z, x6 e6 c7 r  {   
* k5 ]# ]$ b" s5 j    if(AT91C_BASE_MC->MC_FSR & 0x01)* Z0 S+ z3 v  Q9 c/ j
    { 3 `+ P2 z+ ?! b7 x
      if(AT91C_BASE_MC->MC_FSR & AT91C_MC_LOCKE)! Y( [( Q" G" L- ~' h+ y
      {
% G4 C3 q0 v5 c9 S        return 1;
( W" \1 Q# I' t& l3 g+ W- `1 ~% a      }
5 n; a: W$ Z2 n  r) \8 I# k9 B      if(AT91C_BASE_MC->MC_FSR & AT91C_MC_PROGE)
# c$ G% e% D8 h' L& c      {   
. Z' y6 r+ O; x  o        return 1;. s; A  @" i" R! x+ N
      }
5 Z( c7 W+ ^: `% p/ W      
  b0 W, ?; [2 S2 H9 G      break;: b) w  |5 ~0 r, U. z( z3 O
    }//if : X8 a9 t' N$ Y4 k0 g
  }  //while& L5 R9 [4 n6 B$ e! z
  ; ~% m! u' k# x' o( y
  return 0;
; `7 `  P& w, R8 K1 Y" R$ I} //Write_Page8 F, i) ^8 E" ~& ~% K3 U1 G: m! F
6 Q# U# r% a/ ]' u5 p) X. G
執行完這段程式以後,程式就跑飛了,不斷地進入未定義指令中斷,我把看門狗打開也不能在超時以後重定系統,但是資料確實已經寫入Flash,斷電或者是按reset以後,從指定的位址�能夠讀出寫入的資料。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2008-12-10 17:52:27 | 只看該作者
有时候程序跑飞不一定是程序本身的问题,跟调试器的设置也有关系。我碰到过这样的情况,调试器中定义的是在RAM里面跑程序,但在起始地址中我又设为绝对地址0,部分程序没问题,但是有时候不知道怎么就跑飞了。
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |新契機國際商機整合股份有限公司

GMT+8, 2024-6-15 12:46 PM , Processed in 0.124516 second(s), 15 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表