【STM8-SO8-DISCO】——10、串口打印EEPROM数据
r# @) P6 G8 D8 T! L7 O; D
- b" d7 K9 u& T0 R1 M 本贴在前贴的基础上,添加了串口打印EEPROM数据。
. p% T9 i/ u# }) a前贴链接:( u! h1 D# x1 k$ O- _. M
【STM8-SO8-DISCO】——9、字节方式读写EEPROM3 T: I+ s3 v; Y% e5 h0 `
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=619717&fromuid=3072977 m' H! T) t+ g2 \# i
串口打印功能请参考:
* U2 K2 ]% Y$ d% z& l m4 f, K【STM8-SO8-DISCO】——8、测试 UART1_Printf
) M1 i, n- j5 B0 j+ D/ q4 O- Y! \0 [https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=619620&fromuid=307297
) G/ s9 q2 a* c$ X$ G- T$ m& H
* k, U; T/ `4 m2 [ 主函数main()实现。
, e7 \% F- ?* P' p5 P1 C- void main(void) |2 }: x1 Z6 D. t7 Y
- {
# Y2 X* b9 I% Z! X. _ - uint8_t i = 0; , y7 r+ A$ l B$ A5 R- O8 P
- uint8_t dir = 0;5 z$ f& x1 n& A# o1 e& P
0 N4 I3 d" f& g# X% P( w/ ~- STARTUP_SWIM_DELAY_5S;
8 f5 m) g6 p( u" T; z4 h5 ? - 1 b( j, a% F% `; z) n' p7 n: b
- /* Clock configuration -----------------------------------------*/
+ E+ O( o5 d3 |5 R0 Z D - CLK_Config();
( p" d8 r8 W8 i$ F) L - 8 u. g0 _/ U0 g
- /* GPIO Configuration ------------------------------------------*/
& \- P z' w M/ V3 a# ^# W" } - GPIO_Config();
( u+ C& }3 o2 `3 K5 j
. ~5 v- I* g2 _+ r- /* FLASH Configuration ------------------------------------------*/
% j; u2 A3 L( l% q- ?0 d$ L% ^ - FLASH_Config();2 ~% J& W/ M4 v' ~6 {" U
-
0 k3 D3 u. L7 O( ` - UART1_DeInit();
! ^4 r( v$ q; k! n6 t/ O0 I - /* UART1 configuration ------------------------------------------------------*/& Z" T* X; {) r" d, \
- /* UART1 configured as follow:
3 y. y- w6 p- I& A P5 e5 b - - BaudRate = 115200 baud . _, U" _1 I0 J
- - Word Length = 8 Bits
" u' l/ S" J* O0 k% `4 j2 I+ K - - One Stop Bit% x+ D3 }( C' V! L
- - No parity
9 A( J) U6 p( }$ [6 \# W# q( L& ~7 O - - Receive and transmit enabled$ t% e; C6 l9 T2 X
- - UART1 Clock disabled( m+ @4 b+ D: E% \/ Q! I& v
- */
( u B2 M+ z2 ?8 Y4 N* ^ - UART1_Init((uint32_t)115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO,
) ~& A% a! r7 Y4 o/ O - UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);) j' V1 \9 M$ X9 K/ o8 u
" l3 {/ w' j3 k, o, @, N7 m( V- /* Output a message on Hyperterminal using printf function */
% |5 f% t d4 \1 z9 E - printf("\n\rUART1 Example :retarget the C library printf()/getchar() functions to the UART\n\r");
6 ~8 e% X8 f/ j1 o. I! h2 }* N - printf("EEPROM Test!\n\r");
. c4 h& E9 M7 J: R2 R -
$ l) D6 n$ A& w* h0 Q, X- l - /* ********************************************************************* */5 Q% g5 M( j8 e! O! ~# t. d
- printf("Read from EEPROM Start:\n\r"); . H$ p3 A, C! R. n; ]
- /* Fill the buffer with EEPROM Data */4 q! w' g& h, |) f- _
- for (i=0;i<128;i++)
5 l; `! r5 ~1 F j8 ` - {
2 L. k; X8 n+ a h# w1 p H: Q - /* Read byte at a specified address i */
- Z4 I p: O2 n) p" o - GBuffer[i] = FLASH_ReadByte(EEPROM_BASE_ADDR+i);% W6 r2 v3 ]7 |
- }; |- X8 r% O, e {9 y6 Q; E& I" o
- 3 z8 H/ R" M. H: @
- if (GBuffer[0] == 0x00)) \! E5 k2 M: E4 E1 W) Q* @
- dir = 1;* k! a4 F# `7 V
- else2 A' A) L# D7 S& ^
- dir = 0;( T, d$ d& i( |5 B% [4 |$ m
-
0 R; w0 X' m& c* @) w, y% y' a - for (i = 0; i < 128; i++)" ?- q" A4 T3 O
- {+ t/ B9 ^6 c' y5 {# P
- printf("0x%02x,", GBuffer[i] );) |) z- n$ S; {8 J% f
- if ((i+1)%16 == 0)1 {3 H' {2 Q8 H$ n
- printf("\n\r");+ W* V& d7 E) V( G
- }2 q! b2 d) g; Z8 M' u6 T
- printf("Reading End!\n\r");, _5 G C5 p& y% @! H! [. C
- ) G; l+ }, K- s
- /* ********************************************************************* */
, B/ R3 |* A: k1 t0 T4 I - printf("Write EEPROM Start:\n\r"); 7 x+ e6 s) c+ M& H! D& u. i( b* G
- for (i=0;i<128;i++)
, u! K% r( y/ ^8 y - {( r9 l4 Q# ^) R* H7 U- A' t
- if (dir == 0)4 O% e# H( Y( h8 ~; C6 s
- /* Write byte at a specified address i */
% _- S. ^; K, A6 _ - FLASH_ProgramByte((EEPROM_BASE_ADDR+i),i);
- [4 E# H. p. K( X. r - else
8 t' B5 ~# E; M - /* Write byte at a specified address i */
' w& I8 d4 i+ a& x - FLASH_ProgramByte((EEPROM_BASE_ADDR+i),i+128); % }+ K8 j9 }; c3 }& x3 r* D+ Q/ L/ }
- }4 f7 j: s- ]5 Q
- # B' Y7 m8 V% T: z
- /* Fill the buffer with EEPROM Data */
T% G* Z) x2 k+ M% C4 X1 m - for (i=0;i<128;i++)- n& H, W! v9 b5 p7 i6 M
- {( u0 O7 z/ D- ^6 j$ u
- /* Read byte at a specified address i */
* Y0 P! s# B$ [7 N# x; r1 | - GBuffer[i] = FLASH_ReadByte(EEPROM_BASE_ADDR+i);
7 k+ t/ v2 e$ H: s6 M - }
1 Q: B: x/ I$ e( T; z - K$ }0 c- ?- y r7 B/ I
- for (i = 0; i < 128; i++)
. \3 \( W+ q( n. n' E4 { - {6 Y. x. r- Z0 v6 Q8 U7 Y! R
- printf("0x%02x,", GBuffer[i] );
7 q& j1 }4 ]$ w0 f9 l& T7 Y - if ((i+1)%16 == 0)
8 b. ~( Z. G+ p! ?5 [ R - printf("\n\r");
8 }, h7 W/ Z* g& U1 f) I, Z9 e& [ - }
3 |4 X+ C5 ]4 B" h2 y1 H! G - printf("Writting End!\n\r");/ S* ^' f$ @9 x& b, {1 s% }
- * Y) t Q- c+ y
- /* ********************************************************************* */
! q! h& z, m3 Q -
0 e, m) X5 r# n# ]# o: L - while (1) l2 B* |5 Y0 @0 |' |
- {
' q3 I \# c1 ] - GPIO_WriteReverse(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS);
% e$ P) Q8 S% @1 b" k - Delay(0xFFFF);/ t* l1 [; Y' y9 W, G
- }" Z5 [7 S/ D/ c5 u# R# Q# N
- }
复制代码 1 |* |6 @9 c& y3 B) H; L- q; d
程序功能与前贴相似,只不过原来由打断点观察内存及变量,改为了从上位机串口助手观察。
) r c3 W+ ^5 c! U9 n
0 @6 V6 l, E( ^' D4 r 实验连线如下图
! p b/ `8 N4 ?/ e& W
/ b; w. E1 D" t2 F
( N# N& l* W: M6 M# ?2 C) ^9 W! K 第一次上电,串口打印内容。- p# h/ w& Y/ z1 ?4 b9 n; W# [6 G
# c* y* ?* q7 ?$ ?/ A4 s+ D c
: m# _0 e; G) c( j6 `& [; v 第二次上电,串口打印内容。4 t" u+ [! n; J7 }/ [- B
9 v' L i5 o" @% G) c
, o2 X: l3 g" Z, r, Q, N 首先读取全部128字节EEPROM中的数据,打印到串口;然后修改EEPROM内容,再次从EEPROM读取全部数据,并打印。
/ ~" Y1 r; S# B: f) l f% S4 } 程序中判断EEPROM中第一个字节是否等于0x00,如果等于0x00,则往EEPROM中写入内容0x80到0xFF;如果不等于0x00,则往EEPROM写入0x00到0x7F。每次上电,EEPROM中内容都会修改一次。
! [' H) u0 z+ \1 _4 L& G/ o3 X3 j% e/ ^3 J3 A
至此,通过串口打印EEPROM内容实验完成。
. o7 Q9 t! p( {. c 本贴测试工程附上:3 Q% r: s, P4 i7 E- O5 q' W6 \
STM8S_StdPeriph_Flash_EEPROM_Printf.rar
(268.3 KB, 下载次数: 26)
|