Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

如何對ARM內部Flash編程?

[複製鏈接]
跳轉到指定樓層
1#
發表於 2006-11-13 12:11:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
3Chipcoin
[轉貼] 第一次使用ARM,遇到以下問題,望各位大大為我指條明路:4 K6 d; s; b6 H9 y

% j5 ^6 X" e- [: a    寫Flash函數如下:
( Q; q5 V/ A7 L: i$ ?int Write_Page(int *Buffer/*數據源指標*/)9 V: r4 y' v6 Q+ ~: l
{' F" R* `0 n: r: V. d8 X8 h: L* D
  unsigned int  *Flash_Address;
' ]9 [2 c5 {/ R& S# Y  int i;  . y3 T& v! `& f- [
  . ~( p1 ]- X/ M7 N
  
' q  a1 s) G* j/ ^$ V: d  if(AT91C_BASE_MC->MC_FSR & 0x01)  }  [; X( @# A& _( r/ N% ~
  {9 k( `/ ]" j5 s6 [2 _- `: h2 P1 Y
  
8 Y+ X  G  n0 q4 p) }. W8 x/ L  }' t1 G8 l$ g% X9 M
  else. I, }( c+ x1 r  x9 d/ l: ]: Y1 G
  {
9 {( v6 U+ u7 \( K: U4 q      return 1;
, Q( L/ ~; P  w% C& z, f$ v$ s. i  }  Y6 h% ^/ @  T; |3 ~( s
  //4 p7 ?% z# \" R/ E$ b% o1 X
  Flash_Address = (unsigned int *)(0x100000+FLASH_SAVE_PAGE_ADD*256);/ |2 Q" ]0 a- e' p* r
   
, ]7 m6 A9 _' n' f( _: ]5 y; r  //9 l! @, G% y& f5 K/ e& X
  for(i=0;i<64;i++)
9 T) t4 g3 K% p# ?3 E/ j2 k( I  {
5 h  q$ @! m6 m5 }: |1 j    *(Flash_Address + i) = Buffer;/ R2 J4 H; d  f- ~
  }. L1 S$ u9 J. ]  j% U
  
6 d- }& [; ~% s  if( ( AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY) != 1 )
1 H9 `, r, e+ C2 T' k; o" r6 W  {  
3 I, Y: c3 t; B7 v" D( i    return 1;
; }* O- c% U1 j3 p# q8 t/ q1 S  }4 Y- h3 Z3 |$ |6 A0 C
  . w+ W/ q4 A4 W
  AT91C_BASE_MC->MC_FMR = ((0x48)<<16) | 91C_MC_FWS_1FWS  ;  
0 Y1 ]4 B* Q' g0 U//108us  ,wait state 2 cycles) {$ m3 H* F5 g' j' r; \
) _8 z6 b# j" D  X
  AT91C_BASE_MC->MC_FCR = ( 0x5A <<24) | ((FLASH_SAVE_PAGE_ADD<<8)&AT91C_MC_PAGEN) | AT91C_MC_FCMD_START_PROG ;//write page
) q; ~: l$ l9 X3 }% Q: \$ G  
8 H" M4 i* T* `  X! B8 W: V, U6 W  ]$ B& w
  while(1)
0 j6 X5 W# B0 p) f+ w, u) C  {   " n. v. s: L1 Y9 _% A) {
    if(AT91C_BASE_MC->MC_FSR & 0x01)/ L6 P4 _& ]* i# o* o( {8 s% J7 N
    {
/ ?2 ]) r- |- Q% U. ]( q3 T9 f      if(AT91C_BASE_MC->MC_FSR & AT91C_MC_LOCKE)
0 z. |' Y6 U" M4 |      {* Q( l0 g! @' {2 f0 x+ Q5 E! f" F
        return 1;
8 p! I" s0 m; W8 R7 V+ X      }
: L$ y: L; P. ~) e      if(AT91C_BASE_MC->MC_FSR & AT91C_MC_PROGE)8 Z( ]) Y1 D( }( T2 A% X9 M3 X
      {   
& Y7 F! R# }" i4 _( `        return 1;: h6 w$ a1 N8 j4 ?
      }/ u$ Q. P) _7 }" G) G4 ?) x  v; z- H
      
/ p$ t6 ~8 K; }      break;
0 C% w4 |. R) f/ N: V    }//if
7 L0 s( [  G, y% g/ ?/ Y# d  }  //while/ l" K" F2 C7 {/ u  Y, `* J* E
  
6 r: `' n: y2 W7 T# n: l1 ?  return 0;6 u. o- z: \7 f; ?* H+ J6 @. l
} //Write_Page
! n: f: I: R* n1 @5 }
) S8 B  i% w4 h" t執行完這段程式以後,程式就跑飛了,不斷地進入未定義指令中斷,我把看門狗打開也不能在超時以後重定系統,但是資料確實已經寫入Flash,斷電或者是按reset以後,從指定的位址�能夠讀出寫入的資料。

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

使用道具 舉報

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

本版積分規則

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

GMT+8, 2024-6-15 11:30 AM , Processed in 0.122015 second(s), 15 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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