Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

如何對ARM內部Flash編程?

[複製鏈接]
跳轉到指定樓層
1#
發表於 2006-11-13 12:11:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
3Chipcoin
[轉貼] 第一次使用ARM,遇到以下問題,望各位大大為我指條明路:
; q( W: c3 C' z! m9 c8 G+ [8 k; C9 @# `  }
    寫Flash函數如下:4 j  b1 h5 k6 G9 D3 d, H, e5 u6 A9 k' m
int Write_Page(int *Buffer/*數據源指標*/)
9 v0 X! [0 T2 r{1 }4 w, m/ T# o- t1 O
  unsigned int  *Flash_Address;1 {; @$ i) G; [) r2 m0 \$ E) l
  int i;  
# M! B9 V# f4 H& a: {  
0 D: S: f. z$ y( {$ c9 }3 P. [7 ^  + H. b/ R3 d) S9 j) A
  if(AT91C_BASE_MC->MC_FSR & 0x01)
" v* s. R: ^: _. O; e  {6 n) i$ I" p/ G% F5 K' F! S
  
, v( d! N+ r6 g& _4 d) }# u  }
4 b* x1 G; U# q2 Y# n  else- C, g% V: C7 Y
  {3 @/ Y% D. Y* m2 g* l3 j
      return 1;1 }0 t5 Y+ M8 n8 [1 T% ]& x# W1 @! [
  }, \* I, Q+ a5 f
  //
4 F. f; ?5 L5 a( }$ B6 q: C  Flash_Address = (unsigned int *)(0x100000+FLASH_SAVE_PAGE_ADD*256);
$ o0 ]; d0 g- s! d: r  ?   
0 a- j) [8 k" e  //  [5 ^1 F1 ~0 t7 K* E' k5 n
  for(i=0;i<64;i++)6 ~: Z  g' k( z
  {
1 ^. X- K# k3 Y  b' l, b    *(Flash_Address + i) = Buffer;; M+ k- Z9 u* ~9 B8 _- `2 C
  }
7 {; C( v: `$ ]4 ~6 Q/ J( e7 _  ! m8 W( \/ _8 h2 q
  if( ( AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY) != 1 )7 s& u! J" K4 o' L* t( `$ M
  {  
% M3 G  S  V0 C$ v6 r6 y9 ^6 q2 q    return 1;
% D$ W3 Z$ P, _2 N7 R  }7 L4 m* Y$ ^+ e5 c+ @
  $ L& P5 i- \+ D  z' x
  AT91C_BASE_MC->MC_FMR = ((0x48)<<16) | 91C_MC_FWS_1FWS  ;  ; [' N, u: {' e! B
//108us  ,wait state 2 cycles, {) L5 v4 L$ ^" Q2 X. m
7 l& w- M3 ^1 b
  AT91C_BASE_MC->MC_FCR = ( 0x5A <<24) | ((FLASH_SAVE_PAGE_ADD<<8)&AT91C_MC_PAGEN) | AT91C_MC_FCMD_START_PROG ;//write page
$ p5 i9 o  z9 b. A/ o) P3 N  
) i8 p* t  L8 K5 w- k
! Q0 ^( z5 D: \# S# ], B7 W3 E  while(1)
, L* P8 W6 e/ f* h" S$ W2 N$ H  {   . y( `% R4 B* z0 `( n! q- v
    if(AT91C_BASE_MC->MC_FSR & 0x01)
" Z2 x1 H  W/ F2 a* d* h& E1 W    { 2 K( x9 P) y6 n. L6 x$ O( u; [0 w& |: o$ J: u
      if(AT91C_BASE_MC->MC_FSR & AT91C_MC_LOCKE)
5 t3 m7 ]% t5 b4 Z' c" Q      {! N7 R& S3 ]' I9 O' M4 [' @) A
        return 1;. C8 Q& t8 q4 U( c9 K& r
      }6 {2 _" u! f+ e9 r. ?  \
      if(AT91C_BASE_MC->MC_FSR & AT91C_MC_PROGE)+ N) a8 d# u/ n* U* q* c
      {    1 T1 r9 X& N, L2 X/ i2 ]
        return 1;: {" T7 N, H5 s
      }& {  s: X3 ~$ I  o5 m
      : x+ z1 j) E1 p& }8 j
      break;1 q. J; {0 j/ J8 Z. [9 O2 r( Z" T
    }//if
1 J: r9 b' `! I9 V8 `# k  }  //while+ Y- s% m0 |( {" A9 j
  
  D' \, |  e8 |+ b1 u  return 0;
# y1 {2 z4 I; f- g* i  f} //Write_Page
" M7 ^! a9 v) V+ G9 R
2 M. u4 K4 V6 P% c$ v  x執行完這段程式以後,程式就跑飛了,不斷地進入未定義指令中斷,我把看門狗打開也不能在超時以後重定系統,但是資料確實已經寫入Flash,斷電或者是按reset以後,從指定的位址�能夠讀出寫入的資料。

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

使用道具 舉報

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

本版積分規則

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

GMT+8, 2024-6-17 06:26 AM , Processed in 0.126517 second(s), 15 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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