Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

如何對ARM內部Flash編程?

[複製鏈接]
跳轉到指定樓層
1#
發表於 2006-11-13 12:11:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
3Chipcoin
[轉貼] 第一次使用ARM,遇到以下問題,望各位大大為我指條明路:$ K2 m& e- f7 \0 t! p( Y& I
5 K9 L8 b- q* c, H. r/ N
    寫Flash函數如下:
" W* }3 @- Y6 Q9 Qint Write_Page(int *Buffer/*數據源指標*/)
0 j$ c$ R+ r( x  {' W) k# v7 g7 u{* t5 [. M7 X$ d; K3 @
  unsigned int  *Flash_Address;
. `( T9 t* S: L! ]7 {8 w  int i;  
, v# |+ A  W! H! e$ O  2 O! L# o7 d! g8 M  o
  + a+ L5 k1 W$ u# W
  if(AT91C_BASE_MC->MC_FSR & 0x01)7 a( I) j. o$ q+ {* [5 o; f7 I3 w
  {: n! ~/ O4 z' A9 \( t- c) W" L8 i6 y
  5 z/ u9 b5 D; V( {5 @* \
  }
" c- q2 Q+ n& @) H0 V, G" E  else
8 W% ^3 q% f$ H# S# d( b) N$ r7 c  {/ n: {# k0 v% O
      return 1;7 `/ u) A9 R( W7 t1 ~& B; |) u
  }5 [# o: `& P5 f% F+ Q7 l' t- b
  //2 m# K! ?. f, J( K
  Flash_Address = (unsigned int *)(0x100000+FLASH_SAVE_PAGE_ADD*256);
& }; I9 i' n# W( b& s8 l0 G: X: }+ M   
+ H0 h/ B9 ]0 v4 r; `, ]' L% I  //
! R( G1 ?# f9 ?1 p5 p0 J  for(i=0;i<64;i++)$ q5 I$ i8 W4 d# ~8 S& |
  {$ A" t+ j$ F3 }% c
    *(Flash_Address + i) = Buffer;
! ^2 D+ K3 k/ W% I" Y+ g2 @  }& P9 v% M; B" q. V6 f( y- ^3 d
  
' G, {9 D- J0 T! k6 P  if( ( AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY) != 1 )
; g4 M3 u; a5 v/ A( M  {  ! ]9 v% P, Z3 k5 e7 Q! c7 _- C
    return 1;7 s% W/ I' ]6 t1 c
  }7 V! Z" E6 ]# y
  
& z$ {7 U5 p! C  AT91C_BASE_MC->MC_FMR = ((0x48)<<16) | 91C_MC_FWS_1FWS  ;  
# Y; k2 S4 \- B2 u//108us  ,wait state 2 cycles( G' A. E  c' C( j
. B1 `5 a+ a, m, v2 p
  AT91C_BASE_MC->MC_FCR = ( 0x5A <<24) | ((FLASH_SAVE_PAGE_ADD<<8)&AT91C_MC_PAGEN) | AT91C_MC_FCMD_START_PROG ;//write page4 i9 F' e* G2 v1 f8 {
  
3 c3 c8 [6 Q% n* E5 O0 ?( Y- R, ~% U2 x1 n+ t
  while(1)9 [7 f' `* j4 Y8 h: b% F7 l  C  E8 `8 r
  {   ; _, N* s: |  ?; w) k
    if(AT91C_BASE_MC->MC_FSR & 0x01)
8 Y0 p9 L# W! @- u8 A  o    { $ b5 Q9 q$ d  z# F
      if(AT91C_BASE_MC->MC_FSR & AT91C_MC_LOCKE)
- i/ h& T8 U7 c* D      {6 ~0 ^, z) l0 C( M+ T
        return 1;
5 N" j( L7 e$ }% x& H! g      }
' j) \0 _, I$ t  P0 n9 M- q      if(AT91C_BASE_MC->MC_FSR & AT91C_MC_PROGE)
3 H1 ^1 G$ I" f8 e- c      {   
& p( V, r7 _" |2 l* B$ \7 b! X8 K! p        return 1;. J0 n" v2 p/ q
      }
! l" y! F9 X( j" d* t* m9 |" A      8 Q# o! P2 B0 F6 c$ j
      break;
! S: h6 z: E0 p. p    }//if
# z9 t9 p0 y2 }  }  //while
5 c! Y7 H. t0 P9 C" C6 U( ]8 l  
. Y% w- ^  n+ H2 d! E  ]  return 0;
) c. {" c  d7 V" r1 K1 j} //Write_Page
% s4 L. Z2 _5 p3 [8 L2 s/ T; ?5 R" C& c$ l# C+ A- c
執行完這段程式以後,程式就跑飛了,不斷地進入未定義指令中斷,我把看門狗打開也不能在超時以後重定系統,但是資料確實已經寫入Flash,斷電或者是按reset以後,從指定的位址�能夠讀出寫入的資料。

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

使用道具 舉報

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

本版積分規則

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

GMT+8, 2024-9-21 11:28 AM , Processed in 0.164010 second(s), 16 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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