Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

如何對ARM內部Flash編程?

[複製鏈接]
跳轉到指定樓層
#
發表於 2006-11-13 12:11:02 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
3Chipcoin
[轉貼] 第一次使用ARM,遇到以下問題,望各位大大為我指條明路:
  H: O. C& x: s7 A- \8 p7 m+ T" ]. v8 U3 R
    寫Flash函數如下:
9 ^: f- i( C2 d( `: y7 {$ Y3 _! A+ Lint Write_Page(int *Buffer/*數據源指標*/)
- g0 P' p" w* m* S{
& U6 h7 O9 y/ S7 x+ d- I  unsigned int  *Flash_Address;
. d  G3 P' \- k+ H% J9 t  int i;  3 V3 I/ _( y% z" h
  
/ h6 a* U; u" S2 o  
6 U, k* p* R6 J4 v; ]/ V" Y9 _  if(AT91C_BASE_MC->MC_FSR & 0x01). n, m$ E0 A6 {3 A
  {  \% P7 v! s3 Y, O) e4 B
  
, I4 y% G0 K5 V& X3 w7 b$ F  }) L* O$ P  J8 U9 l
  else& `+ }& g! b' p) F! j% T) n; Q- _
  {- g9 S: x% l9 h2 u8 R9 ]) b
      return 1;
+ f# s6 v+ O, j- O* \* \% D- G; N  }
9 e/ d0 y! }- Z2 v+ U  /// V' |6 r( V3 t% q, W# K
  Flash_Address = (unsigned int *)(0x100000+FLASH_SAVE_PAGE_ADD*256);
7 J7 `, j& ?. t. v   
. y2 z8 f# @2 b* w4 e  //3 j' {! N4 P3 F8 [
  for(i=0;i<64;i++)
; L+ F" a" U% j  M! X, V: o0 |" }  {+ ]* f8 Z/ e. }9 ^0 J5 B+ L
    *(Flash_Address + i) = Buffer;
$ X3 X3 {3 |" G8 ?% N1 x  }
& \& p* G# c0 A& k& T7 P  5 U# m+ A: K1 g# C
  if( ( AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY) != 1 )
( \, [9 U+ P5 a$ S8 q; ~) R4 `0 y2 i1 ]( N  {  
* S6 @6 J+ a" P8 [6 m. t' x# |5 {: }    return 1;1 k: v/ r9 M* [8 n
  }
! z+ y; m7 A- T/ k  5 B$ n9 T" `9 ~9 W  _
  AT91C_BASE_MC->MC_FMR = ((0x48)<<16) | 91C_MC_FWS_1FWS  ;  
5 ]8 M+ c0 O" @/ g4 U//108us  ,wait state 2 cycles
( U7 z' V* H% ^5 o
) w) T' V! B! H* h3 X+ c' t  AT91C_BASE_MC->MC_FCR = ( 0x5A <<24) | ((FLASH_SAVE_PAGE_ADD<<8)&AT91C_MC_PAGEN) | AT91C_MC_FCMD_START_PROG ;//write page
2 ^# P) w8 C( b2 S+ K9 ?  , o/ T) a2 U2 a3 e$ g
! S" _0 C7 z% |# u; N  t
  while(1)
4 s) A' I! L. u# o1 ]$ T  {   
% [0 p! p; k1 b- Q+ q0 o$ J    if(AT91C_BASE_MC->MC_FSR & 0x01)2 Y& T5 r6 ^8 _  h
    { % ~3 d0 }( v1 ?8 x4 x
      if(AT91C_BASE_MC->MC_FSR & AT91C_MC_LOCKE)/ t7 Q# M( g2 N! ?$ a3 x3 Z& h. A) s+ R
      {
7 ^- j9 Z2 x# D* b        return 1;% ~) ?0 @1 I# d( [8 A
      }
3 X8 ?! c* C. l      if(AT91C_BASE_MC->MC_FSR & AT91C_MC_PROGE)
" e- ?# j) y- v& x% d; ~6 M      {   
; r9 _# q" q# Y' f        return 1;
2 m0 j, P) R- `% W      }7 E# c8 ~# D6 o1 M
      " I0 n! x; P; X; ?/ \& u1 }
      break;  z/ Z4 d& P  }9 E/ ^8 D% `! U
    }//if
& i  \/ ^6 d6 r7 n- ~7 x  }  //while: f. E. c4 p& m* F- Q9 f
  1 @5 o! G% @! `7 }$ E9 }0 @
  return 0;
7 T1 Z+ u9 P& r4 G  Y* M, g+ E) ^} //Write_Page
* x4 U% ^- H; L( h/ n0 h9 M% L; ~# z3 k1 n6 I7 A; v- z
執行完這段程式以後,程式就跑飛了,不斷地進入未定義指令中斷,我把看門狗打開也不能在超時以後重定系統,但是資料確實已經寫入Flash,斷電或者是按reset以後,從指定的位址�能夠讀出寫入的資料。

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

使用道具 舉報

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

本版積分規則

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

GMT+8, 2024-11-11 06:11 AM , Processed in 0.144008 second(s), 16 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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