Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

如何對ARM內部Flash編程?

[複製鏈接]
跳轉到指定樓層
1#
發表於 2006-11-13 12:11:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
3Chipcoin
[轉貼] 第一次使用ARM,遇到以下問題,望各位大大為我指條明路:6 U1 ~5 y/ X6 z% |, Z
0 N2 |7 A9 e7 x: t3 y8 z& P
    寫Flash函數如下:- R# W6 b5 ]  C! A* M* ?8 L
int Write_Page(int *Buffer/*數據源指標*/)
: Q2 j3 |, w0 K{6 N1 G1 j7 r* W; A4 h
  unsigned int  *Flash_Address;
( r: i+ _% T6 z6 ?0 B6 @  int i;  
, t7 |# A9 A. ]4 D( S, f, G& V, P! H  
9 T. N! \% Y7 i0 E6 H. d  
& Z) a  k+ s  [6 @% \. U. W! V  if(AT91C_BASE_MC->MC_FSR & 0x01)
1 d, Q) s( Y5 k- e- {$ ~8 }  {9 K2 M$ T4 ~- D0 `/ {1 v. Q6 v  t4 e
  9 d# i4 ~( g2 p) {. D- A
  }
& ~# d9 O9 X0 ^' S$ i; O  else
: _8 F2 D4 L  v6 V/ ~  s5 K  {
4 x0 b- y! g8 i- [  A3 d      return 1;0 n2 r0 i7 [. Q! J
  }
; R1 [- z9 e. U- U9 S  //
: S: Y; t: Z1 ]0 Z4 J% {7 i  Flash_Address = (unsigned int *)(0x100000+FLASH_SAVE_PAGE_ADD*256);
: r* B) Z( T7 O, [" m$ H    ) \4 S2 `+ Y" W
  //  d: [4 h, I1 v% }# f6 N9 u
  for(i=0;i<64;i++); Z, y' @- r8 T3 Z4 b
  {4 B5 `. s9 M- q+ ~( _
    *(Flash_Address + i) = Buffer;. P8 t. P0 q) y  m. [% d
  }/ u- t+ P! B2 H1 ]9 S. F
  : S' l/ d" h& z' y5 F6 Q$ n% X4 Z
  if( ( AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY) != 1 )/ y" A5 d* C' \. ]- |5 [
  {  
. `( \( Z6 g; u  G* K( I7 L    return 1;( u" v+ D( O" e
  }
% u% H; L9 W$ v& y  
( w8 k) g. p  e. B7 z  AT91C_BASE_MC->MC_FMR = ((0x48)<<16) | 91C_MC_FWS_1FWS  ;  
7 ]+ ?/ r$ e! Z& V5 q7 p//108us  ,wait state 2 cycles4 l  ]! X  Y9 R1 ^. l3 o0 U8 s; f, A

( }. T1 k- }! O% ~+ m1 k  AT91C_BASE_MC->MC_FCR = ( 0x5A <<24) | ((FLASH_SAVE_PAGE_ADD<<8)&AT91C_MC_PAGEN) | AT91C_MC_FCMD_START_PROG ;//write page0 z% [4 F/ T2 x& _) C  b: ~% ~( d
  : h  x6 v% `7 e1 c. [  i1 c

# [' s/ X; O0 r5 M  while(1)  {/ J8 i( V( i4 }$ g3 n
  {   5 W; b; T3 Y* d9 x* @7 {- u
    if(AT91C_BASE_MC->MC_FSR & 0x01)9 k7 J0 w3 a2 g, }# P4 [; S% l
    { : e8 t: t7 v- j6 O
      if(AT91C_BASE_MC->MC_FSR & AT91C_MC_LOCKE)2 D! p  M, B- }) O- f6 u5 J
      {
& P7 j/ c& L( M0 f        return 1;
, W  d% Z" h- C4 E6 U) \& ~8 Y2 ~      }% r4 ?* ]+ w2 o
      if(AT91C_BASE_MC->MC_FSR & AT91C_MC_PROGE)
$ ~  J: i% x' a+ h2 n      {    ! y9 L  G  V4 `3 a- h0 T# ?( R9 l
        return 1;; p! v/ |! u% H% T/ C/ a2 S3 x
      }
2 s8 q2 _2 Z% Q3 D9 q2 [      
" \# B; ^# v8 }9 \      break;
) N, v% h) n: m* S% l8 X    }//if 2 z+ e& D! V0 L. _' y9 F0 g# Q
  }  //while$ E/ |  O6 V/ j% p9 B9 A
  7 [0 r- U0 r/ C+ L* a
  return 0;8 ^8 x, q" v$ \
} //Write_Page  L9 B& v% q8 j7 b( X) a7 R

4 d* ], F1 v. l( h執行完這段程式以後,程式就跑飛了,不斷地進入未定義指令中斷,我把看門狗打開也不能在超時以後重定系統,但是資料確實已經寫入Flash,斷電或者是按reset以後,從指定的位址�能夠讀出寫入的資料。

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

使用道具 舉報

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

本版積分規則

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

GMT+8, 2024-6-8 12:33 AM , Processed in 0.124016 second(s), 15 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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