【STM8-SO8-DISCO】——10、串口打印EEPROM数据 : k$ v. r6 B" p t1 v1 L$ @
! ?. `: y: i. Z+ H# V2 j; ^ 本贴在前贴的基础上,添加了串口打印EEPROM数据。. M$ B! K" L3 V+ O9 d" i
前贴链接:
! l. `8 U# ~ [9 f* a4 V1 `【STM8-SO8-DISCO】——9、字节方式读写EEPROM" f* `0 W" _# w7 e) y
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=619717&fromuid=307297
5 t( E6 q, P% i' [& v7 C, F) S0 ?串口打印功能请参考:5 r# N1 \4 V; l) I
【STM8-SO8-DISCO】——8、测试 UART1_Printf) `6 b$ I) e& E; F* e' \8 S* r
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=619620&fromuid=307297
) _) A; a- H: N3 I) \( `% b2 b6 G9 F. H8 {" ^9 E# B2 y( Z
主函数main()实现。
" Q( C) y; \% z5 g0 K4 J- void main(void)
$ h3 k7 |# T' C - {
5 |6 J9 w( ? O0 \6 `# a# C& ` - uint8_t i = 0; ' H% X. S! T& N6 H3 s$ U/ U( Y6 H
- uint8_t dir = 0;: n! H7 O6 w; r' l. z6 L
/ m/ l- F2 h( o9 z, F. \4 d5 ?- STARTUP_SWIM_DELAY_5S;
C) X, U. M) K+ y) ` - , \, t0 U) K- k5 `8 h5 o0 g5 c
- /* Clock configuration -----------------------------------------*/
{' q( c& C- Q# C$ }$ N# G4 t3 d - CLK_Config();8 q( R/ E* b* @# c% a
$ v: ]3 _" Q9 f! s4 R- /* GPIO Configuration ------------------------------------------*/9 n% K1 l% G: o; m5 t7 K( W9 F
- GPIO_Config();
0 i. n; w$ ?) v3 @# c& |" L) G; E( D - ) o% f! q8 i2 E* y F
- /* FLASH Configuration ------------------------------------------*/
; M4 M6 y0 M! J/ c- W1 A# m - FLASH_Config();, v$ b) _% n! L/ m
-
( I. d# v% v4 H8 x/ C8 L - UART1_DeInit();
, G( |4 n* [+ w& y+ I. r& S1 I - /* UART1 configuration ------------------------------------------------------*/
4 ]( O9 ?+ j' s - /* UART1 configured as follow:! k4 L9 w, o" j3 P* d7 m
- - BaudRate = 115200 baud , M; {3 t: x9 y5 H" p) h& T+ k$ n1 n
- - Word Length = 8 Bits
_1 K( U; U' ~: x" J - - One Stop Bit
# g, T8 ~) u% J/ r - - No parity
$ z- b+ _+ Z1 H0 Q& ^; C% m# m b - - Receive and transmit enabled i; K$ Y4 l8 ]( H7 g+ g
- - UART1 Clock disabled
) y, g9 p- c0 t5 D - */: r X1 e I) n: D0 m) t( R
- UART1_Init((uint32_t)115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO,
# p) r) p# i: e4 y - UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);) T! n- N% Q# a% V+ U+ h
- 6 b' r. a( u n+ E+ ?) X/ G
- /* Output a message on Hyperterminal using printf function */
5 ^8 @+ B" @- b4 ?. K3 u - printf("\n\rUART1 Example :retarget the C library printf()/getchar() functions to the UART\n\r");3 p2 _( T4 w, o; l
- printf("EEPROM Test!\n\r");
8 P- L& G0 y6 r5 {: w - + Q' O3 Q7 M' p3 M% C+ o
- /* ********************************************************************* */
8 b9 L l+ _2 s# Z, W' q1 Q+ U; ` - printf("Read from EEPROM Start:\n\r");
1 Z& K; c& T$ G2 z8 k) D g3 X: c6 p - /* Fill the buffer with EEPROM Data */
7 [& C: K+ M' u2 r- G3 G# W - for (i=0;i<128;i++)- H* a9 ~5 n' ?, [) [6 l l) U, k
- {1 t: v$ D2 x8 s- D5 e) X
- /* Read byte at a specified address i */
) v% q* K' d6 u0 |" H2 g) K/ B - GBuffer[i] = FLASH_ReadByte(EEPROM_BASE_ADDR+i);
8 Z/ @. K+ ^( I# F2 ^( N( p - }
8 Z% D+ ^. q4 G! B -
4 G8 Z: ~/ m+ l6 q9 r1 W - if (GBuffer[0] == 0x00)
* v2 \. ?; S+ c. a: o' k) P - dir = 1;
" L8 {/ [- B$ F* C+ T+ }' S) L9 V - else
8 Z! O" u% g1 a, V - dir = 0;" j( t7 j5 A1 Q% Q- e: N& S t4 [
- 5 G* c5 [- A s5 D$ q
- for (i = 0; i < 128; i++)
( J9 ?- Z7 R# V; X* H - {, u4 G4 ^" X6 p4 M) ?" _( P, i
- printf("0x%02x,", GBuffer[i] );* Z. e6 P+ n% H* ^8 d# H$ o6 }
- if ((i+1)%16 == 0) M6 S% A1 E# V5 B4 f
- printf("\n\r");, r; U9 t& o, R+ Z- ?6 Z
- }
9 Q) k' A! a4 [ - printf("Reading End!\n\r");3 B* p$ e+ C% P1 s
- 9 X5 \$ q( G9 z8 }5 p
- /* ********************************************************************* */
7 h. J, z, U7 G5 F9 Q - printf("Write EEPROM Start:\n\r"); 2 a! R' {+ Q/ m: D. T
- for (i=0;i<128;i++)* Y m( T/ `# I( v: o$ o
- {
" J: }0 U' F( x8 Q1 [ - if (dir == 0)7 ~0 K( s- V* r
- /* Write byte at a specified address i */* z$ W) V9 F0 g0 H
- FLASH_ProgramByte((EEPROM_BASE_ADDR+i),i);4 r. B; \3 f V+ j
- else6 L0 C' ~1 x3 w( [* Z
- /* Write byte at a specified address i */
, ]/ U6 F( S3 k- w; D2 s- } - FLASH_ProgramByte((EEPROM_BASE_ADDR+i),i+128); 7 j: L0 o/ i% f% M) e$ s1 y
- }
: b) u2 @* Q" p0 d7 k, R( R - & v% b0 K# W8 B0 n
- /* Fill the buffer with EEPROM Data */
& D* W$ r$ C/ k+ R+ r2 Y - for (i=0;i<128;i++)
' {( y+ q2 i. ^; @# e- a% `9 y - {! s/ F" S& A0 Z2 A" }8 I4 J
- /* Read byte at a specified address i */
0 B9 f" I8 x; p' i: L - GBuffer[i] = FLASH_ReadByte(EEPROM_BASE_ADDR+i);5 Q, S( w% p" {
- }
, D6 V' N* R" q, [ -
, D6 o7 H# c E9 ] - for (i = 0; i < 128; i++)* }; Z8 T" E/ O" [8 G
- {2 f [9 y! R4 g5 s" g5 k- M
- printf("0x%02x,", GBuffer[i] );# f' `2 F2 p' Y2 P) x! j
- if ((i+1)%16 == 0)6 v7 k: ^1 r0 A9 s5 C
- printf("\n\r");( s' }) K' `2 ~6 c+ b& M1 I: k
- }
3 P% n+ j& N$ v p9 T' _ - printf("Writting End!\n\r");
5 R0 z5 }) h9 r - 2 C2 c& ]- N$ Y6 H
- /* ********************************************************************* */
6 }# S8 ]9 o4 i: e - - V( A7 J* ~+ X& k
- while (1)
! Y" T2 g D8 p0 h( W7 } - { 8 q) E5 D# n* j7 U+ m2 F9 j; c
- GPIO_WriteReverse(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS);5 o7 p8 k2 H$ ?
- Delay(0xFFFF);
- c* J( E- A, {. @/ Y - }
7 b' ~& F/ W, ]/ \6 Y3 d - }
复制代码
6 ?: w. r; T7 r; ^4 B- @ 程序功能与前贴相似,只不过原来由打断点观察内存及变量,改为了从上位机串口助手观察。& p" Q6 K3 a, s' `, W$ n. R2 `2 L
% s% U4 L- l5 Z, X: u' B1 b L
实验连线如下图
8 B+ f( H( I+ v5 D" [
5 c B- v2 M2 z/ j% T4 _- ~3 ?
Y y5 c7 Q4 r8 i: h) K9 ] 第一次上电,串口打印内容。
$ U1 F$ C6 l' [/ U9 m/ d9 `% u, S
* c M% x+ E9 `" g9 Z& A
: ]' N; G. j+ w) o& ^# y0 ]% _6 s 第二次上电,串口打印内容。9 |0 J( N1 d' _9 f w
' v2 W, A" q4 W1 x+ Q5 h8 v- W8 m# }' G" n3 Q7 ]/ T
首先读取全部128字节EEPROM中的数据,打印到串口;然后修改EEPROM内容,再次从EEPROM读取全部数据,并打印。
$ N9 m% a' {3 e' c2 m$ X# z 程序中判断EEPROM中第一个字节是否等于0x00,如果等于0x00,则往EEPROM中写入内容0x80到0xFF;如果不等于0x00,则往EEPROM写入0x00到0x7F。每次上电,EEPROM中内容都会修改一次。
4 z. Q, k4 E. ]9 m6 ~) [3 ~( j. O& W9 R
至此,通过串口打印EEPROM内容实验完成。( C# ^7 s; L$ J3 |! V! u! e
本贴测试工程附上:
% `$ t3 A! ]1 {! T/ x
STM8S_StdPeriph_Flash_EEPROM_Printf.rar
(268.3 KB, 下载次数: 26)
|