Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

如何對ARM內部Flash編程?

[複製鏈接]
跳轉到指定樓層
1#
發表於 2006-11-13 12:11:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
3Chipcoin
[轉貼] 第一次使用ARM,遇到以下問題,望各位大大為我指條明路:8 H( {4 Z( r+ s) ~% ]' {
9 o& k- q, c- B/ ?) u1 d  Q- `
    寫Flash函數如下:
, D4 ^! E/ ~+ I* ^* B- hint Write_Page(int *Buffer/*數據源指標*/)6 l, X3 A. u* A" Y' f
{: ~' [8 ^6 [) H6 c( {% k! T8 ~
  unsigned int  *Flash_Address;
/ X3 ]0 p/ o# ]) P. [  int i;  . \' F) \; W& m* b
  2 }0 u; n" S, A" \/ s6 w
  
5 E5 q, p+ D# o  W  if(AT91C_BASE_MC->MC_FSR & 0x01)
  V- p! D) J' v' q6 L8 v1 v1 R$ q  {* ~, \) X; E, P5 {- }
  / v# a* X6 L) Q/ F+ a* z6 F
  }7 s# v  |- k0 g- @
  else
  z* s" p5 F- s; ~6 ?  {$ h5 t' ~* Z0 w8 v. [! `4 w4 |
      return 1;
. l1 |9 e9 F  D- e/ a& m; i  }, k: [* N$ v* k; W0 u7 ]( P
  //, p) ?0 G1 ^2 h  I$ P1 q
  Flash_Address = (unsigned int *)(0x100000+FLASH_SAVE_PAGE_ADD*256);
6 L% l" c7 m# h' A/ p9 Y8 y   
5 @5 r1 C% `- h9 N% o  //
: V" k) q" T( l) i1 @  for(i=0;i<64;i++)7 r$ @. _9 ^* d9 M% u
  {
8 L6 X. W" B9 J& G. r+ d; `9 u    *(Flash_Address + i) = Buffer;  B; B. |1 f( g. A5 p7 T2 K
  }6 b& i; o1 ~* }# X8 E' b
  
4 L% J; q: h9 b- p, i. |+ y' g  if( ( AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY) != 1 )
/ Y' E/ l3 \; j  {  
" f# u2 u7 U% \8 z" j; G( f% Q1 l    return 1;& c1 Z, B) F$ S" x6 s  b3 e. t0 W7 k# Y
  }; P2 P7 T2 H0 m: K% o9 j! y. d5 l
  
6 d/ \; s( c3 V2 z" I  AT91C_BASE_MC->MC_FMR = ((0x48)<<16) | 91C_MC_FWS_1FWS  ;  3 l+ {" P8 E0 x: A" p2 U" C
//108us  ,wait state 2 cycles+ ?; V5 f- d+ j- `' z
) {7 ]4 _3 @9 j" \( g
  AT91C_BASE_MC->MC_FCR = ( 0x5A <<24) | ((FLASH_SAVE_PAGE_ADD<<8)&AT91C_MC_PAGEN) | AT91C_MC_FCMD_START_PROG ;//write page- I8 R% i8 z" b9 Z. T) R
  
- ]$ O' ~1 Z; O( W$ T6 g
7 y+ `( X# h/ {6 Z' S  while(1)
) l" |) j# W) w2 W! f- ^" j  {   
) N8 z, ?& ~" u5 z8 `, h3 S    if(AT91C_BASE_MC->MC_FSR & 0x01)
( S& _2 V, U: {. [! b& y    { 4 V2 v3 k3 o5 j
      if(AT91C_BASE_MC->MC_FSR & AT91C_MC_LOCKE)
% Z7 T0 b1 P: P' S" L& N      {, `3 E5 M1 o/ E9 N
        return 1;
  @6 k& Z, [8 ?7 N+ x      }4 M6 `" o7 R2 v% E1 R. }8 j+ j
      if(AT91C_BASE_MC->MC_FSR & AT91C_MC_PROGE)8 F' e5 g) o/ p
      {    ; ]9 E+ o4 R$ S: w, E; [
        return 1;! Y: c0 E2 [9 o7 ^
      }
1 w8 X6 w8 j! q5 o5 D      ! j7 G) b7 {) B5 ]2 [) K
      break;9 x! x# [3 L+ r1 {/ N2 X5 K
    }//if - G# n5 p+ N- Y6 Y$ U) Y4 [9 A
  }  //while* D2 q5 p( D. b8 m$ A$ [4 w
  
- D0 `, g6 r, h) i* A  return 0;
/ r, p+ }3 v3 Z. S} //Write_Page
' t- ]& P8 v8 R- r  C2 r) D5 P" h% @. E# d& B1 R
執行完這段程式以後,程式就跑飛了,不斷地進入未定義指令中斷,我把看門狗打開也不能在超時以後重定系統,但是資料確實已經寫入Flash,斷電或者是按reset以後,從指定的位址�能夠讀出寫入的資料。

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

使用道具 舉報

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

本版積分規則

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

GMT+8, 2024-6-14 08:13 PM , Processed in 0.124016 second(s), 16 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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