版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2013-10-12 14:30
|
显示全部楼层
C8051F MCU应 用 笔 记
: N: |# I8 u7 w. B; r- j! Q, V" p/ |: W: o+ J/ E' j& Q
AN009 — 从应用程序写 FLASH / m4 R6 r) v1 K+ W0 k+ M
* x/ a1 R, m, e$ D7 h( `
相关器件 : }* }! Q' E* d8 U
本应用笔记适用于下列器件:
) R, D1 ^4 [3 Y$ i7 t4 yC8051F000、C8051F001、C8051F002、C8051F005、C8051F006、C8051F007、C8051F010、6 U% \" r6 a6 |, m' [( u
C8051F011 和 C8051F012。 0 ]0 K' Q! x: u. b
引言 ' \0 D7 \2 O* e0 L5 I
本应用笔记的目的是说明如何从应用程序写FLASH。在应用编程允许将FLASH用于非易失性% J0 Z! y- i; U& |
信息的存储(例如配置参数),还可以允许采用JTAG接口之外的另一种接口(例如UART)进行在
8 p0 B2 s5 c: ~. c; \, g系统引导装载。本笔记的最后给出了如何读和写FLASH的‘C’代码。 2 B4 Q+ t# L- H. B
关键点 + p1 X1 q- Y5 t7 v+ [7 F1 I& o; L- O
在应用编程允许将FLASH用于非易失性信息的存储,这一点与EEPROM类似。 ' _3 e$ K a3 @. @. v3 V5 f' Q
FLASH写/擦除寿命在 – 40 ~ + 85℃的工业温度范围内保证在 10000 次以上。 * d' Z$ ]$ I* W. |/ b
FLASH存储器用 MOVC指令读取(MOVC a, @A+DPTR)。
1 o# |& p c7 K$ O( o* O: m FLASH存储器用 MOVX 指令写入(MOVX @A+DPTR, a)。
: w* |/ r. d+ l- `, b5 T: z FLASH页以 512 字节分界(0200h, 0400h, 依此类推)。 6 r$ T {4 w- a" |0 k7 U2 e& O
FLASH写操作只能写入 0。因此在写一个 FLASH字节之前,包含该字节的页必须首先被擦除* I0 V5 s+ K! g& ~5 {9 I
(使该页中的所有位都为 1)。
3 l4 g+ d# `6 l) A( X/ ~ 在进行 FLASH写或擦除之前,必须根据当前的系统时钟设置 FLSCL 中的 FLASCL 位。 2 ]3 |7 _+ n2 z3 W( |8 y8 w
在进行 FLASH写之前,必须将 PSWE 置 1。 % _8 w, L1 U' E
在进行 FLASH擦除之前,必须将 PSWE 和 PSEE 置 1。 7 u; G, k/ s7 X5 [& M6 ?! Q) Y7 O
FLASH页的擦除操作是将PSWE和PSEE置1并向该页512字节中的任一字节进行写操作。 % ~* L" a: V' H& m" } C, B, X
含有读锁定字节和写/擦除锁定字节的 FLASH页不能由用户软件擦除(但是,该页可以由用户: d) _! W: Y' f& c& {! m
软件写入)。该页只能通过 JTAG 接口擦除。 - i l6 e s; r! V4 H$ X' @2 V' X
过程 1 k/ |' @: R5 F7 L: K- E6 `
FLASH 是按一系列 512 字节的页组织的。另外还有一个 128 字节的页,该页位于 FLASH 的+ {2 e v( R! h+ x5 q
顶部,起始地址为 0x8000。由于写一个 FLASH字节只能对各位写入 0,因此在写一个 FLASH字
5 g( n% \4 C+ h! C& _4 a节之前,该字节必须被初始化为 0xFF。一个 FLASH擦除操作将一页内的所有字节初始化为 0xFF。 : m6 m# Z( U0 `4 f
擦除一个 FLASH 页
4 w5 ^7 Q8 I! _" x一个 FLASH 页可以通过下述过程擦除:
1 D6 Z- f U1 G& E7 b2 d1.根据当前系统时钟频率值按 C8051F000 数据表的说明设置 FLSCL(当使用缺省的 2MHz
: Z) W; B: g$ F$ ^内部振荡器时,FLSCL=0x86)。 ) w1 h1 _) ^; }& ~% j7 F7 m
$ [4 T: D- X. zSilicon Laboratories Inc. 新华龙电子有限公司
7 v b% e& c# m4635 Boston Lane 深圳市福田区华强北路现代之窗大厦A座13F C室(518013)
2 b7 x H4 b1 V/ o2 E% U7 S& ZAustin, TX 78735 电话:0755-83645240 83645242 83645244 83645251 & h( x' l, D6 v$ f
Email: mcuinfo@silabs.com (版权所有) 电邮:shenzhen@xhl.com.cn
/ Y5 F: S1 Q& u( J, C. F' c* ?Internet: www.silabs.com 网址:www.xhl.com.cn 7 G* f5 _: }$ z' L+ K& V, H
% [1 J% L& ]' I
E$ t; ~$ Y: }4 |( a9 z! a
AN009 — 从应用程序写 FLASH
6 F5 J& b) \; y- l% g6 D# A4 L1 c0 G6 @( ?# N5 ?
2. 通过向 PSCTL写入 03h 使 PSWE 和 PSEE 置 1。 5 F* r+ ]3 l3 r2 W, @
3. 向待擦除页内的任一字节写入任意值: - j! @! F. {: A5 q
; 初始化 DPTR,使其指向待擦除页内的地址
4 Y1 A% l6 |/ E/ V6 ? mov DPTR, #address 7 ^; E3 T6 d) a% O, p5 B
; 启动擦除过程
. o6 g- w) x8 \1 i movx @DPTR, a
! V) T3 H1 }' ^1 X# O8 o: L- E9 ^4.如果不再进行擦除操作,将 PSEE 设置为‘0’。 * K- d/ G" p& j6 {$ w
擦除每个页需要 10到 20ms 的时间。注意:CPU内核在 FLASH擦除过程中停止工作,但外
( s9 C2 g" W( _' w设(象 ADC、UART、SMBus 和定时器)仍然工作。在擦除过程中产生的任何中断都将被挂起,( J& U$ X5 A! ^' ^
直到该过程结束。在写一个 FLASH字节期间 CPU的工作情况与此相同。 % d* ~5 e a; K! @& _$ L
写一个 FLASH 字节 0 j6 t! x; Q0 f" `7 P% U
下述过程用于写一个 FLASH字节:
6 D5 g H: a2 T% F# V& H& P3 ~% F1. 根据当前系统时钟频率值按 C8051F000 数据表的说明设置 FLSCL(当使用缺省的 2MHz
& u7 T1 }6 ^$ f$ S. ?8 J- e内部振荡器时,FLSCL=0x86)。 " ^; Q& X& r% k0 @: w" l, Y
2. 通过向 PSCTL写入 01h 使 PSWE 置 1(PSEE 必须为‘0’)。 0 s8 R; @4 f, X" q1 v# [
3. 写入字节数据。
% A5 @ t+ Q5 I ; 初始化 DPTR,使其指向待写字节的地址
, P8 M% P4 f1 ?1 K4 Q0 J$ G) K mov DPTR, #address
7 D; L6 F' q5 ]5 Z6 u+ o ; 将待写字节装入 acc
4 o) I5 R T6 ? j9 n mov a, #value ( W& ^" Y6 ?) l% Y
; 启动写操作 / D1 f( i: u, D+ E+ ^, |# x* J
movx @DPTR, a : B, H2 H- O$ I' G
4. 如果不再进行写操作,将 PSWE 设置为‘0’。 7 k8 \9 ?/ t1 T8 }4 e3 r
每个 FLASH字节的写操作需要 20到 40μs 的时间。
& s& Q) C0 }+ L- O7 D更新 FLASH中的数据 , O) c: K/ q6 }, e
当保存一组配置信息时,经常需要在一组字节中单独改变某个字节的数值。单独更新某个字节9 F, K) ]- T( S# z
(或字节子集)的一般过程如下: 0 F3 w Y& C! z
1. 将 FLASH页拷贝到一个临时存储区(RAM 或一个已被擦除的‘临时’FLASH页)。
, {. u$ H7 ?% F& ?2. 擦除 FLASH页的数据。
5 A c: X, e% f# m7 D) y3. 将前面存储在临时存储区的内容复制到 FLASH页中。
' E: j# l3 z$ d' @ b, j) E用‘C’代码访问 FLASH ; v1 {" W. L$ O: a, a
所附的示例代码说明了如何用‘C’程序擦除、写和读 FLASH 内容。由于 FLASH 读操作是2 p/ S* X( m9 b, W4 J! F2 k* V) d
用 MOVC 指令实现的,因此用于读操作的 FLASH 指针必须是 CODE 类型。由于 FLASH 写操作
; t6 E x+ b8 d8 U, }" |是用 MOVX 指令实现的,所以用于写(或擦除)操作的 FLASH指针必须是 XDATA 类型。
3 }! J8 @% ~. N: u' I4 N/ V7 ]% h* U9 t
2 AN009-1.0 JAN01 ! j+ D- }3 O2 ^6 w( U
! J) F B7 K' K2 s0 P0 V- O0 Q6 G
, q0 k: }# M7 |3 a! o% [5 A1 G
! E8 B; y- M9 R) l( e# b4 `AN009 — 从应用程序写 FLASH ' R; U+ U$ q( @
1 [0 D" F! O0 I1 z4 l0 q! `
软件示例
8 c4 y3 X9 d8 d1 Q9 `//----------------------------------------------------------------------------------------------------------------------- ) v: r2 Y4 @, \( p8 P
// FLASH_1.c + ?' q8 w# u- q& U: l. v
//-----------------------------------------------------------------------------------------------------------------------
2 `9 O. ^6 c3 _# V//
- b1 g; j, }; A1 ~' N0 N6 o) O// 作者:BW
$ h' I' F# k" ~2 a* q0 t. t7 n//
6 b1 n; e, ]& k7 |8 E6 y4 W// 本示例程序给出了用‘C’程序擦除、写和读 FLASH存储器的例子。
5 I8 f' O# z7 h1 [! E$ ~// ) e; [: c9 f% ^
// 目标器件:C8051F000 或 C8051F010
; S4 \$ k7 F, F; G/ p// 开发工具:KEIL C51
" o6 y0 u: t0 _5 Y j//
5 T" A; y" L& p9 b; y# `8 n. i$ y2 |
//----------------------------------------------------------------------------- 7 Q/ N7 P0 |! ^9 U
// 包含文件 4 q/ k: P# Z: { @& \
//-----------------------------------------------------------------------------
$ I8 e7 _! j/ x2 i K/ F7 y) d9 n. P. B& R R8 b3 }8 W2 ?6 w& y- |
#include <c8051f000.h> // SFR 声明 6 x2 J$ E8 n0 ?, a. h( t
#include <stdio.h>
! n$ W, U/ P7 ]) X4 a4 G
7 x' x5 D% e# w+ c7 C//-----------------------------------------------------------------------------
) z2 u, m8 t& x. K& b2 ~- S, m// Function PROTOTYPES + Z" { E1 Y/ x
//-----------------------------------------------------------------------------
" z0 [+ K9 a6 f/ x9 b9 |7 N( l( r; k @) I1 O% E/ O
void main (void); ( `( Y C% ~- Y# Y- B( a
/ `: M' p' @5 e) o9 x% @" x//----------------------------------------------------------------------------- * `/ }" |1 o# t/ h
// MAIN Routine $ \5 a6 P2 E2 ~1 l- h( i3 ^" O
//----------------------------------------------------------------------------- ' @# Z5 F+ {" S+ t6 I% a
& m% _& @( T4 B7 Z2 q
void main (void) { $ s% L6 C- q( r5 r8 a2 w2 @
1 V! N- A8 P3 x5 e
unsigned char test_string[ ] = "Howdy!"; // 将被拷贝到 FLASH中的字符串 6 O$ g( ^: X* F8 k
, r4 m9 }, S) _2 H1 d) j9 l
unsigned char xdata *pwrite; // 程序存储器空间的指针(FLASH),指向待写地址
# c+ E4 m9 O, X) o1 R- ^4 B' l unsigned char code *pread; // 程序存储器空间的指针(FLASH),指向待读地址
! }4 f) v/ ?& j2 u6 }6 X unsigned char *pgen; // 一般指针 7 s! r4 q$ J7 n1 A" a& D( s" a4 ]/ e
char test; // 测试字符
; n: O, T) W6 N" J8 B% T* k- ~; B2 X; R1 P) n& @1 R
AN009-1.0 JAN01 3
9 U T# L9 x( t- y9 c! c( t) Z) U' M& f8 f2 u
3 u( x. ^) [& b
+ s _- B: c5 J3 lAN009 — 从应用程序写 FLASH & t6 T/ C; m* r6 C, j) m$ a/ u% }
! y- G1 j! w v, s8 B3 [) I8 ~2 ` // 禁止看门狗定时器
+ b: i) C3 E6 N+ g- } WDTCN = 0xde; : F# o" I0 D" V3 d. ]* o8 ~
WDTCN = 0xad; $ Q: F- W# o; _
// 擦除 128 字节的信息页(位于 0x8000) ! C N8 B! r2 {8 b% N9 q4 g
FLSCL = 0x86; // 设置 FLASH标度寄存器(对 2MHz 系统时钟) ; O. {4 L$ i+ ~. N: p# x' q
PSCTL = 0x03; // 将 PSWE 和 PSEE 置‘1’(MOVX 指令对应
9 t5 ]0 }' x+ f // 的 FLASH页 / \, l% K: A$ [1 P/ i+ |& x
pwrite = 0x8000; // 将指针指向待擦除页
. P' v. _4 Q# { *pwrite = 0; // 启动擦除过程
n7 z! `: `+ A+ x3 b4 ~' } PSCTL = 0x01; // 清除 PSEE,PSWE 仍然置 1 . X3 T" R }2 w" A
// MOVX 指令将写到对应的地址
& I/ J l! l# @. C: Q1 l9 F0 R
- e1 p$ M+ z1 B& d3 r) w6 x // 现在我们要拷贝字符串 <test_string> 的内容到 FLASH页,从地址 0x8000 开始。 " n5 ~+ u! w* t* p8 W
( K I' W3 a/ _% _
pgen = test_string; // pgen 指向源字符串 % c# ^' \3 F* R& Z0 M0 k
do { . j) s2 f" z4 Y
*pwrite++ = *pgen++; // 拷贝字节
) x5 |$ r& b3 L; r } while (*pgen != '\0'); // 直到 NULL 结束符
. U J. a# Q/ n7 x9 L, r( _4 p/ h/ G$ q, H
*pwrite = NULL; // 用 NULL 结束目的字符串 7 S, d6 S' [% O% Y7 ]( T. ~
; X8 ~4 r( |( C# e. y PSCTL = 0; // 禁止 FLASH写 6 X8 u% ~* t1 D7 e: S" I
FLSCL = 0x8f; // 禁止 FLASH写 5 ]: Z8 g0 B8 n# [) P/ O
) Z4 P+ C" Y% N" r" I // 现在我们读写入的字符串
/ K- O' L$ {! \ d- \, I2 _4 `
; S/ q' C' f5 I/ Y O pread = 0x8000; // 初始化 CODE 读指针为字符串起始地址 6 i' d4 y" ^& t, Y
" ^/ i/ L/ J* B M8 O
test = 0x5a; S2 c! v- T s1 ~7 ^8 k5 h
do { 0 E. C! R! q' ^+ ]
test = *pread++;
( l- Z; T0 j( Q7 T } while (test != '\0');
* X/ i5 ?8 V) ]) {) ` X3 n
% u |; F+ ?) d5 X- g6 }) u while (1) { // 原地循环 ) A# W, t) r3 j, \* v8 D; ?# Y
} 8 i; N ~$ U N G* r; s) O
}
; D1 d: ^/ \$ L3 m8 V
, z- F( x/ _6 T( q. ^% h4 AN0: @6 d5 |4 L( w$ O' L7 {) Y
$ S1 T: e8 S6 Z
|
|