|
【STM8-SO8-DISCO】——10、串口打印EEPROM数据 5 I# Y* d/ u. o3 G" q' p
) }. W+ s$ X, q& C7 l' g 本贴在前贴的基础上,添加了串口打印EEPROM数据。
+ b) D. G$ B, M( e; F, X前贴链接:
! g2 t2 k4 a5 }: Y6 [+ K& B【STM8-SO8-DISCO】——9、字节方式读写EEPROM' {8 f( x) i9 U- M% J! W" E
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=619717&fromuid=307297( D! X I3 _: M3 D8 ?8 s: S
串口打印功能请参考:0 i+ X3 \) [1 q6 s9 O- ]' Y
【STM8-SO8-DISCO】——8、测试 UART1_Printf. Q- s. `! g4 a7 {* n: ?7 p6 h
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=619620&fromuid=307297
: a# O4 T- S$ e+ K. g7 k1 v- ?' j
主函数main()实现。
! r0 }: v5 V% i- void main(void)/ K. p$ t2 D6 q/ ~% Q; T
- {
1 F0 k1 W5 [/ B! {% B$ l - uint8_t i = 0;
" i6 V y7 |4 E" ? - uint8_t dir = 0;1 g9 m/ r- m7 y9 a
9 f% u% w+ ?, [" p2 R B+ i% c- STARTUP_SWIM_DELAY_5S;
7 r. l( a3 {! p6 ^& X - ; I! `/ t5 y( u5 [+ o3 d
- /* Clock configuration -----------------------------------------*/5 p* t, A0 R) m5 _6 t) V
- CLK_Config();9 d% d3 ^) s- Y( y2 n
1 h& e0 z# I7 Y$ L/ E- /* GPIO Configuration ------------------------------------------*/2 `! h$ ]% G* h4 Q, z/ Q5 t$ B
- GPIO_Config(); # S+ a# v# L8 j# A" x4 @( v; O
* g& l2 o2 W$ u* J) G6 D- /* FLASH Configuration ------------------------------------------*/1 @6 Z! L5 A9 m3 g
- FLASH_Config();
# Q2 u! h- h7 r - % S$ _; k, E- ~+ U2 n5 b2 q" A
- UART1_DeInit(); n$ h5 u! S& Y5 x0 G1 x: p
- /* UART1 configuration ------------------------------------------------------*/
9 J/ E% m% O2 j - /* UART1 configured as follow:2 S$ |% H) k& L0 e" I
- - BaudRate = 115200 baud
+ b$ K% d- Y. L. o _* ^ - - Word Length = 8 Bits! w% p- }' w9 C3 T7 v
- - One Stop Bit
5 R* l! X# q8 [% _ - - No parity
S* Q+ S( A6 c - - Receive and transmit enabled( l1 H q3 o. T' t
- - UART1 Clock disabled2 z ~* H0 h' b' v# c' ^
- */
7 Y$ e: d) k3 [ - UART1_Init((uint32_t)115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO,
5 {2 g) }5 h) q+ X. M3 z - UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);, i- K+ g0 L2 Z3 [
- 5 r9 p: O6 u) Y0 R' O, A
- /* Output a message on Hyperterminal using printf function */1 u5 Y* K) V, F
- printf("\n\rUART1 Example :retarget the C library printf()/getchar() functions to the UART\n\r");
6 R$ ]- Q0 H& q8 z& g' u: W) h - printf("EEPROM Test!\n\r");. K& {2 j7 ^6 f2 _2 V; Y
- 2 G) j" X. K% n* B
- /* ********************************************************************* */0 O& W; C5 x+ E
- printf("Read from EEPROM Start:\n\r");
; B, i4 F! y3 V' s - /* Fill the buffer with EEPROM Data */
# b$ E' t0 m( l6 d' y$ O E5 } - for (i=0;i<128;i++); B- K' S9 j3 [* g" {
- {- i1 f1 r( ?; _# l, s# \
- /* Read byte at a specified address i */
- P# Z% `, D! M4 o - GBuffer[i] = FLASH_ReadByte(EEPROM_BASE_ADDR+i);1 L( c- O/ w4 Z
- }
9 v" K+ N; I; z2 o1 T: q -
4 K4 V, M' y1 ?9 V8 v% o* B - if (GBuffer[0] == 0x00)2 ^4 D6 ~* f, x. {# U
- dir = 1;: D2 N) @3 ~8 d1 @; n% C# i8 T# n
- else
D& {! U* _, x - dir = 0;; R% T8 Y, Y* M, u2 j% [0 ~
- ; S! o# i3 V" n# E& B4 r* I0 l
- for (i = 0; i < 128; i++)) G. P. b2 P: u' e5 Q" |- n' T
- {
) X R1 n; `- l7 J: | - printf("0x%02x,", GBuffer[i] );' u% S7 o3 F) d* R, f5 I
- if ((i+1)%16 == 0)3 x# P3 J [) V% g: T9 ]
- printf("\n\r");6 l. G; z5 c: { \) x) }3 n
- }
7 c. p: ?) j/ j3 x7 t0 K1 D$ } {2 Z - printf("Reading End!\n\r");
* N, u' S2 r) a - 1 `* b$ j- }& `4 _6 y
- /* ********************************************************************* */$ k% |" q9 P7 U1 Q4 q3 k- s
- printf("Write EEPROM Start:\n\r");
; f3 p4 S @. A0 `6 E - for (i=0;i<128;i++)
# R5 K: U( w# K8 y# Z: A$ z0 d - {
/ g9 _8 v7 L" a3 W( \; l - if (dir == 0), P% e9 b p- }0 k. x; N
- /* Write byte at a specified address i */
; j9 p8 ^: @. B% r - FLASH_ProgramByte((EEPROM_BASE_ADDR+i),i);2 ?! j$ w! t3 u7 U+ P1 H* I* r% l
- else! T# V0 O, V+ {8 y% K# x; [
- /* Write byte at a specified address i */" l; v. t1 [+ r# @
- FLASH_ProgramByte((EEPROM_BASE_ADDR+i),i+128);
" O) E/ J2 \/ }6 g0 s$ J - }: e/ z2 R/ t) B" B6 p( a
-
; p9 m) E. Z4 p" X/ N - /* Fill the buffer with EEPROM Data */
/ {7 v5 _2 R+ R `0 e7 q$ g - for (i=0;i<128;i++)" G7 D" v" f" z8 f) D4 A$ `- j
- {
4 r# r) _; Z; A; C - /* Read byte at a specified address i */
: E9 J) X$ T; a# |: v0 V - GBuffer[i] = FLASH_ReadByte(EEPROM_BASE_ADDR+i);2 I% }' j2 ^9 I6 i/ ?8 n
- }
; p# w0 ^7 Q5 C* f -
$ W, C( q# l$ }0 I) v - for (i = 0; i < 128; i++)
# T$ {7 v- @9 m5 M" l - {- u+ S/ M* _# s8 j0 o" \9 y* h9 L8 M
- printf("0x%02x,", GBuffer[i] );$ {5 S* M E! W' O R4 j
- if ((i+1)%16 == 0)& n9 s/ m) Y0 d) m
- printf("\n\r");4 S7 M3 `7 g. f5 W$ Q8 `
- }
# w1 U0 W' \8 b - printf("Writting End!\n\r");9 W. y* _, a4 W# J2 _8 e7 n
-
/ S) t! l1 {. }& X/ i, I - /* ********************************************************************* */
* J% o2 J; X! T# m -
1 J2 _- }0 y4 z3 Y - while (1)
/ z4 L+ \0 D) v - { ' {9 J) q! w' s/ [4 e! ~! u
- GPIO_WriteReverse(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS);( U% H4 A, n6 B; N6 R
- Delay(0xFFFF);
$ P# l7 x; J4 e( Q( T- P) K - }( m) o, w8 ?) c
- }
复制代码
$ s2 h8 ^) N- j8 q 程序功能与前贴相似,只不过原来由打断点观察内存及变量,改为了从上位机串口助手观察。
6 F2 ~$ |. [8 t9 @3 `( [$ A
- h B" T. T( | 实验连线如下图
0 |& W' E/ Q' q$ U. P3 a
U% [3 t* D- d) H
: C0 q9 r. ]/ r9 ]% c$ l
第一次上电,串口打印内容。
9 s& @ e# Z9 S' n# k4 k
$ f/ j& {" d$ Y' w. L! Z6 B5 h. q
) H/ ] w+ I& S$ O E 第二次上电,串口打印内容。+ Q- ]1 J. k1 [/ ^5 I
+ p% {; @. |$ v
4 @8 \7 C8 }* ]% W- V6 L$ ?
首先读取全部128字节EEPROM中的数据,打印到串口;然后修改EEPROM内容,再次从EEPROM读取全部数据,并打印。
5 o# F1 X5 P) H% L1 j 程序中判断EEPROM中第一个字节是否等于0x00,如果等于0x00,则往EEPROM中写入内容0x80到0xFF;如果不等于0x00,则往EEPROM写入0x00到0x7F。每次上电,EEPROM中内容都会修改一次。
( V( y1 J/ i" M2 \2 m2 e K& m) \4 a% S$ S3 c1 L0 R
至此,通过串口打印EEPROM内容实验完成。
2 n' X n) d5 j1 `; {9 D 本贴测试工程附上:. J5 z* @; r+ U
STM8S_StdPeriph_Flash_EEPROM_Printf.rar
(268.3 KB, 下载次数: 26)
|