Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

如何對ARM內部Flash編程?

[複製鏈接]
跳轉到指定樓層
1#
發表於 2006-11-13 12:11:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
3Chipcoin
[轉貼] 第一次使用ARM,遇到以下問題,望各位大大為我指條明路:
+ D( l' g1 D7 U, N3 ~9 Q2 b3 [/ }. c& {7 n' o* _
    寫Flash函數如下:5 w5 U( }. m1 y0 ~! `' L. o8 U
int Write_Page(int *Buffer/*數據源指標*/)0 Q% y/ [# L0 v/ i% h4 q
{
# ?+ o+ P6 e9 l; I7 o  unsigned int  *Flash_Address;
- w- }% f2 H2 l6 R& N: Q5 J  int i;  
' X4 G/ G' A8 f  ?* O  
8 T+ }% q) @" s' f0 Q  8 n# [2 ^' |* a( p1 C
  if(AT91C_BASE_MC->MC_FSR & 0x01)7 \* }! q, i; F6 ?# l$ b
  {, |5 E: G$ ]" C" I; m  y1 O
  ) P6 W0 D0 Z. P5 f, Y
  }
* f; Z# A6 l; V( d- c) X  else
+ O) X& W; ~  d0 x, {" c  {
+ |5 E5 ?7 |4 S: \3 t      return 1;2 J. V! a8 S- K
  }
* x4 w" M- @0 W; @3 R  //+ V& G7 A6 y6 }: `3 Q6 ?
  Flash_Address = (unsigned int *)(0x100000+FLASH_SAVE_PAGE_ADD*256);
% D- p# E0 R- L. V) H   
! R' |. Q" o7 T; [; E) v) R" s  //) \, I' _7 {7 `5 n+ G, y% d
  for(i=0;i<64;i++)
, g! y4 h5 n) ~% N! q  {  ]6 n2 H3 M5 j6 P- L2 w# V: b/ R/ B
    *(Flash_Address + i) = Buffer;
) O8 {9 e" Z2 C/ Y1 L: y% H  }+ o: H% K% @+ h0 T# h
  
8 \8 H$ i, o/ Z7 k; G' B8 v, o  if( ( AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY) != 1 )' }& n3 _' W& k3 L- ?( r
  {  - Z$ n; i8 L1 q) `# s+ _/ O; v
    return 1;- X1 A$ c# n$ D8 O3 e' {2 v
  }
) g+ e: N3 I- h3 V* a  [1 g0 a1 q  
3 w9 j2 F6 @: e) H  x$ }+ P# [! r  AT91C_BASE_MC->MC_FMR = ((0x48)<<16) | 91C_MC_FWS_1FWS  ;  . B6 U! |5 w/ P- M/ v# P
//108us  ,wait state 2 cycles
5 ^7 g/ q& x& o1 {( _  I; u0 Q$ R" ~7 g" v
  AT91C_BASE_MC->MC_FCR = ( 0x5A <<24) | ((FLASH_SAVE_PAGE_ADD<<8)&AT91C_MC_PAGEN) | AT91C_MC_FCMD_START_PROG ;//write page
% D9 {& b5 t% V4 W, \8 A  
- V# R$ G0 T" L: x( T2 d5 b& ^! X5 ^
  while(1)
( B1 ?( C% t7 q/ N  {   
4 _0 i- r: b! g  b, q' R' U: Q* K    if(AT91C_BASE_MC->MC_FSR & 0x01)( ?1 R1 i% P( X
    { + Q+ v! v6 z) O+ }1 q( q
      if(AT91C_BASE_MC->MC_FSR & AT91C_MC_LOCKE)
+ [! Y! `: ], o6 U      {
7 b$ A$ T# B) F+ ]! B4 G        return 1;6 d# P  J) P9 v
      }
9 p/ e( [6 e' L0 P3 N& b' q      if(AT91C_BASE_MC->MC_FSR & AT91C_MC_PROGE)1 [2 [6 p% U( y% `% w% O% H2 D( {' r
      {    : e" _/ l* J5 _3 {4 d& ~( [: _( l
        return 1;: K; c0 A( ]3 `/ `& j/ O" v% k
      }/ K, e9 N$ k4 @  S& X0 o
      
4 u: f. _8 ?& ]( d      break;; z3 Z& U, @( v3 w1 ?
    }//if
( f/ q. W2 {) `9 c  }  //while# b# f+ l: y5 u) a4 n
  8 M$ j1 ?# Y- T5 A6 l3 w- O
  return 0;
2 O" R8 e! ^# N5 m& s4 p( Z1 F: O0 w% u} //Write_Page9 ~7 |8 _+ G" b0 [4 r

  I. y% o# ?* g- B) ?執行完這段程式以後,程式就跑飛了,不斷地進入未定義指令中斷,我把看門狗打開也不能在超時以後重定系統,但是資料確實已經寫入Flash,斷電或者是按reset以後,從指定的位址�能夠讀出寫入的資料。

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

使用道具 舉報

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

本版積分規則

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

GMT+8, 2024-11-13 03:38 PM , Processed in 0.171010 second(s), 15 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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