【STM8-SO8-DISCO】——10、串口打印EEPROM数据 ' Z: f6 O* e( R" B# M% n; n) ?; N5 m
" C4 ^7 s- e* Q- ~3 E 本贴在前贴的基础上,添加了串口打印EEPROM数据。) }0 d( c9 a. L/ ?5 A
前贴链接:3 I9 q4 K" {2 |& M0 W8 s
【STM8-SO8-DISCO】——9、字节方式读写EEPROM
* H% b8 A1 o5 ?$ ~( J, `0 \. h5 \https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=619717&fromuid=3072977 ^8 f) n2 D5 G) Q
串口打印功能请参考:
2 h, w1 _2 t, O, [5 U【STM8-SO8-DISCO】——8、测试 UART1_Printf& N8 A7 ~$ q6 X& J3 l, i
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=619620&fromuid=307297
& h* }( S" M5 k4 ?- ~- |9 }; c2 g, b/ }7 Z" [# `
主函数main()实现。
4 ]6 H% U# m2 j1 X5 s# K- void main(void)
8 r# t) h8 g& ]. d0 e - {
7 t. Z8 [# _. q, G" h, p - uint8_t i = 0; # J6 B% \; [- G; y
- uint8_t dir = 0;+ M7 l) d2 q d/ k7 {) v
: d) ]3 j/ k, k H- STARTUP_SWIM_DELAY_5S;
$ {3 n. N$ h$ d8 L. o - 1 S. u0 A, Q/ o# X3 _1 T: p% k
- /* Clock configuration -----------------------------------------*/
5 T j" F2 l/ Q) j% @4 ]; ? - CLK_Config();0 B0 Z. m' }" W4 r9 x: h
; V! t2 Q: Z' t- /* GPIO Configuration ------------------------------------------*/
8 ^" t+ R0 m3 e6 m - GPIO_Config();
' Q Y# X! x# H8 x3 @
4 s$ O$ f) R. C' x9 Q' |- /* FLASH Configuration ------------------------------------------*/& k( G# w H2 L# x8 p3 |3 i
- FLASH_Config();
5 V& y' y$ F% _* v! \ - ! E5 p$ |$ f, e, V2 i a3 s5 i
- UART1_DeInit();
* y8 l4 R8 Y# X4 e9 k - /* UART1 configuration ------------------------------------------------------*/
) ^/ Q$ M% c$ S( k& I! P# l9 h* h - /* UART1 configured as follow:; v- ?! ~- Z e. W- G
- - BaudRate = 115200 baud
% m) P) E) Z% N" @ - - Word Length = 8 Bits
/ ?) {6 M8 w' Z/ w* b - - One Stop Bit
4 m' y4 I7 H6 r6 ~" z* x+ @ - - No parity( N6 k" X3 F) U* n) E* b* b
- - Receive and transmit enabled
' I" `: a: p% N @( G - - UART1 Clock disabled
3 L w& m3 x9 V4 q5 ]. r7 C - */
! [$ X' {+ J0 w+ |* y$ ~. T - UART1_Init((uint32_t)115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO,
- F* w: y: H/ }) T - UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
) F2 p0 Y3 [7 ^8 v% u; W - 6 s _( e4 }3 k( n: [
- /* Output a message on Hyperterminal using printf function */, `! H# A3 J: S9 f* x2 \8 G
- printf("\n\rUART1 Example :retarget the C library printf()/getchar() functions to the UART\n\r");
* E" c7 S/ P: {4 o# C5 w - printf("EEPROM Test!\n\r");
: q0 S6 D5 _& \- r -
* \- N8 A9 ]% v' c7 ]" f - /* ********************************************************************* */) d9 T" S: O' N9 V
- printf("Read from EEPROM Start:\n\r");
! L9 e8 ^& ?7 q; p" x4 L6 D - /* Fill the buffer with EEPROM Data */
8 h" f4 X7 Q* [; Z J& _% Z+ [ - for (i=0;i<128;i++)
$ `5 ]- i4 _! g5 I- `0 u$ W - {
- @% c& S: F( T' z3 s$ b - /* Read byte at a specified address i */0 }4 ~3 U# ?) D0 o2 A
- GBuffer[i] = FLASH_ReadByte(EEPROM_BASE_ADDR+i);3 q2 x* ]4 Y+ [& y l
- }$ |. ]9 X. T& s" \, [) h6 X6 s6 \" D
-
+ M0 R2 y; ~4 N/ x0 m4 K - if (GBuffer[0] == 0x00)5 l/ @9 t& n( h% {! e2 _5 W
- dir = 1;
3 P2 U1 r9 L( h" w& L& L - else
& `+ b5 Z0 [7 X4 ~4 N - dir = 0;
1 X/ w' k0 g/ H, t8 z - ! T1 m- |" w" w7 Z0 x
- for (i = 0; i < 128; i++)9 K- b1 v. H7 u, u5 h
- {
4 ~0 e% M) ?/ i/ Y( M! n! y3 \ - printf("0x%02x,", GBuffer[i] );0 E. {& u4 E. z! z
- if ((i+1)%16 == 0)
. |9 w+ ^$ | M, ? - printf("\n\r");; y$ h6 _3 Q! W& p' c
- }0 A) J* w% N/ I$ f+ C. y
- printf("Reading End!\n\r");2 n, D* r4 X% p2 a, g `* H" Q
-
, L& M% ?" G- J; i; | - /* ********************************************************************* */
/ N& Y! t) D2 p - printf("Write EEPROM Start:\n\r"); 7 R) ~1 ^' Q4 m4 b$ d. a) O; ^
- for (i=0;i<128;i++)/ O+ k" r5 A1 z* e- {
- {9 E1 G- }. O3 d! Z; r
- if (dir == 0); w& `) F) Q. V
- /* Write byte at a specified address i */
9 x/ t1 U+ x# v, X - FLASH_ProgramByte((EEPROM_BASE_ADDR+i),i);
0 ]+ Q& x( U4 B. s x& J - else
" u4 K5 d h- D4 h - /* Write byte at a specified address i */
2 t/ I6 K" V+ j - FLASH_ProgramByte((EEPROM_BASE_ADDR+i),i+128); ) o/ Y# K; q& I, r* U, X' j
- }4 [1 C% ~: y& z9 o; ^" E
- + ]' |0 x2 u6 }
- /* Fill the buffer with EEPROM Data */
# g5 q( b( L* z; d" C - for (i=0;i<128;i++)6 F' P8 A" P% |" f" s+ Z
- {1 e/ l$ r x. b
- /* Read byte at a specified address i */
; R9 |2 }& o0 [2 z. E" y1 N I - GBuffer[i] = FLASH_ReadByte(EEPROM_BASE_ADDR+i);
" W+ Y+ c6 G g; g! W: I0 a - } o& I: T. n5 T9 G4 F. V
-
& P5 m. i* Q' ]3 g6 f - for (i = 0; i < 128; i++) [! m- V! j3 p; I x
- {% ?! d a& W0 v
- printf("0x%02x,", GBuffer[i] );- n: S9 D" a( d
- if ((i+1)%16 == 0)
9 o+ S) @$ l- l - printf("\n\r");/ K" ~' Z8 E! m+ Y
- }
; N3 J2 [( X2 e# t1 @ - printf("Writting End!\n\r");
- m9 d+ t3 ^" F8 F) p4 J, V -
* s. l1 {; Z' w+ P3 w - /* ********************************************************************* */
+ c3 ]( c: x4 ^ -
2 H; i: p" }1 l+ ?6 N5 V - while (1)7 ]& D. v+ p" u
- { 7 F+ b1 C2 S( N
- GPIO_WriteReverse(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS);9 K# _) e6 p5 C1 `' e, s3 O4 t+ O j" S+ i
- Delay(0xFFFF);2 c* N2 j+ U* M7 I0 f
- } ]( z8 S' {: `
- }
复制代码
" p# l. c X; _7 V0 F1 c 程序功能与前贴相似,只不过原来由打断点观察内存及变量,改为了从上位机串口助手观察。# I) p/ Z& N& Z( D. f( w7 [
* i8 u3 l, @5 a3 T0 w1 n$ b 实验连线如下图
- L! n5 ], D9 A g" ^0 ^ P
8 r* {6 e5 R$ r6 G# t/ t! n$ `) k
( v* H$ F& Y2 V# ?/ g6 x' }
第一次上电,串口打印内容。
G2 ?& z0 n' m/ }& n9 l
2 R$ F) x+ x9 H. l- l& e' `" ]) X, e7 x1 F# N6 q
第二次上电,串口打印内容。
) m: M0 N5 o& f" I1 I, _% Y
) V5 g T9 M/ |; t0 k% m. W1 b7 P1 M" }5 W
首先读取全部128字节EEPROM中的数据,打印到串口;然后修改EEPROM内容,再次从EEPROM读取全部数据,并打印。: u8 n$ w% A" x( G/ S* y4 c
程序中判断EEPROM中第一个字节是否等于0x00,如果等于0x00,则往EEPROM中写入内容0x80到0xFF;如果不等于0x00,则往EEPROM写入0x00到0x7F。每次上电,EEPROM中内容都会修改一次。
R8 p2 M4 K" b( F/ x6 q; F% a" y: o: E \
至此,通过串口打印EEPROM内容实验完成。
: }" c4 } K- C4 R' [; I" } 本贴测试工程附上: j7 e& l4 B& ]5 o2 N" q
STM8S_StdPeriph_Flash_EEPROM_Printf.rar
(268.3 KB, 下载次数: 26)
|