Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

如何對ARM內部Flash編程?

[複製鏈接]
跳轉到指定樓層
1#
發表於 2006-11-13 12:11:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
3Chipcoin
[轉貼] 第一次使用ARM,遇到以下問題,望各位大大為我指條明路:
+ z1 b) M! }( V- m8 ]) c- ?
8 |0 ]4 b; H7 g+ ]; E; p    寫Flash函數如下:- ^6 w: M/ J- ~- q, R
int Write_Page(int *Buffer/*數據源指標*/)9 u9 v: S; X7 F
{- h) e5 h7 y9 m6 H# {3 l
  unsigned int  *Flash_Address;4 K% z2 A: L  N6 i
  int i;  - k6 ]9 ?- O1 w9 s7 W3 M( }
  ( R: d0 N( ^' b+ ^$ y
  
; h+ s- w/ D" `* q2 t  if(AT91C_BASE_MC->MC_FSR & 0x01)
/ C1 h) N5 f/ b% J  {
5 U$ {9 s8 R+ A& @; o1 q. @* Z  
' {  i6 \8 V6 I8 E9 }* a9 b  }( a3 v, n  _' C, ?3 B2 O
  else2 o, R- F5 v* [$ i
  {
# h1 N3 ~7 K  y/ q, @; Z      return 1;/ D! d: `/ V8 `; X, C
  }% Q! T+ C" ~5 x3 W# b+ g" d* a
  //
1 s* e* }- z' T' {2 q& k6 @9 Q  Flash_Address = (unsigned int *)(0x100000+FLASH_SAVE_PAGE_ADD*256);# d& l& m7 v2 w* A$ g
    8 u* b* Z: ]( ?" s/ y+ [. o
  //: A7 s, Q: o, g; q$ m
  for(i=0;i<64;i++)
7 n" S' c6 x! ^. O0 N8 X  {6 k; A$ t) ~' u0 s% G0 {0 Z  P) ]
    *(Flash_Address + i) = Buffer;
4 r* n$ o9 O& k5 g  }
" f$ Q3 E4 `3 T7 n6 ?  ' d2 h: z" a) u' S0 P1 n. Q
  if( ( AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY) != 1 )
7 P7 H/ U/ e% G/ s* P6 {  {  
0 t) S6 _% A) m/ K, k; x7 C- |    return 1;
. S7 B  S* d2 O# y/ t+ c, x  }: d9 n1 P4 {! z# A
  
/ a5 x- F+ b& K; _  AT91C_BASE_MC->MC_FMR = ((0x48)<<16) | 91C_MC_FWS_1FWS  ;  
. l- R+ j! l2 @, r" _3 h. y. f. P//108us  ,wait state 2 cycles& Y2 w" Z$ F9 L4 `7 y8 o

$ e& [5 W. h( h8 l+ ?' R- p2 ?  AT91C_BASE_MC->MC_FCR = ( 0x5A <<24) | ((FLASH_SAVE_PAGE_ADD<<8)&AT91C_MC_PAGEN) | AT91C_MC_FCMD_START_PROG ;//write page% h# z& [( C/ t
  ) K& B6 W- M" j

0 r3 u, z8 l4 y, N% E/ b3 c  while(1)
' q5 }2 |  B" }% d* P6 z' J( `, f9 A  {   4 _6 S* h5 L0 Z' J( W
    if(AT91C_BASE_MC->MC_FSR & 0x01)
& N; n+ \- ]4 ?9 S# k    {
! s% |/ {, \* V      if(AT91C_BASE_MC->MC_FSR & AT91C_MC_LOCKE)+ q5 t# P, d9 M' A% B* v5 U
      {
9 ~2 j6 l( y# _4 [2 p- `        return 1;
" f8 B; m1 y/ X" q0 f      }) C% `. F; p% Z8 r4 }. l/ {
      if(AT91C_BASE_MC->MC_FSR & AT91C_MC_PROGE)
3 z- J1 j! h2 X0 B( i  k2 U      {    6 t& E- S2 B% W- u- V6 Z
        return 1;3 f+ u$ F4 C( _6 s! {
      }
; q" e; {! R2 P1 d; R      
+ t& e3 L/ c5 |5 J0 I      break;
7 l1 ]4 w6 v) i0 O4 ]  o5 C    }//if
" t7 d5 N6 W& i/ v5 F7 _5 S3 A) i  }  //while9 ~: u# Y. @$ g' V  m0 c
  1 X: w6 u$ G% l  g& v& M/ I
  return 0;5 D' G+ ]8 D; F) h+ @* f8 g  f
} //Write_Page
% e5 l$ a. W# X, L- M; d* P1 f
執行完這段程式以後,程式就跑飛了,不斷地進入未定義指令中斷,我把看門狗打開也不能在超時以後重定系統,但是資料確實已經寫入Flash,斷電或者是按reset以後,從指定的位址�能夠讀出寫入的資料。

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

使用道具 舉報

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

本版積分規則

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

GMT+8, 2024-6-7 04:30 AM , Processed in 0.126016 second(s), 16 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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