你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

分享一个STM8L152C6的串口调试程序

[复制链接]
黑夜之狼 发布时间:2016-3-23 13:58
来了社区蛮久,还没发过帖子,这次来分享一个串口调试程序,欢迎大家拍砖赐教
+ [" u# F* T$ h, A! ^( x
  1. #include "uart1.h"
    9 z7 A- v$ {* }! E+ L/ K% A
  2. . r" y1 x6 M  V  {4 T$ y1 q
  3. void Uart1_Init(void), n+ o( I/ X5 F5 ^/ J
  4. {: f) `5 ^( _9 |' o
  5.     CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);, U# Y) |, o3 Y" c9 S
  6.     GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Fast);//TXD+ V4 f7 w# w4 O& y- J: g: N
  7.     GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT);//RXD4 U: H: h0 K5 c) l3 Z
  8.     USART_DeInit(USART1);       //复位UART1
    : W5 c" `3 S2 @3 U9 q- l
  9.     /*, m+ j: [3 ]  y: o. D. O
  10.      * 将UART1配置为:2 L4 s  W5 U% R5 X, u
  11.      * 波特率 = 115200+ t# m/ ?- ^1 F, j
  12.      * 数据位 = 8: ?, m6 L' c4 x( D1 O
  13.      * 1位停止位
    9 y0 n: F3 v& \8 y
  14.      * 无校验位
    9 Y7 @* ^; l# S
  15.      * 使能接收和发送
    2 [  _3 i' [2 `& }) k' {
  16.      */
    : ^3 ?# b' `8 ^* u  K( b- M$ c3 ]
  17.     USART_Init(USART1, (u32)115200, USART_WordLength_8b, USART_StopBits_1, ( w' {7 @% P5 o/ o  D4 L
  18.                 USART_Parity_No, USART_Mode_Tx|USART_Mode_Rx);
    + ^" g. \0 Y0 [% `* M( @
  19.     USART_ClearITPendingBit(USART1, USART_IT_RXNE);4 s. V; p1 `+ F& O8 K; Q. N
  20.     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断
    " r6 g6 w( F1 `
  21.     //USART_ITConfig(USART1, USART_IT_TC, ENABLE);//开启接收中断
    3 p* }- ]* O) l! m/ ~9 a4 z
  22.     USART_Cmd(USART1, ENABLE);  //使能UART2
    : o$ A" x' Y6 u5 l/ h7 k# A1 W& Z
  23. }
    ( ~% x1 N+ e# p7 y

  24. - P9 P' c1 h1 U" m. d. b9 ^! e
  25. /*******************************************************************************
    $ v" C: K( }  t* t. B
  26. * 名称: UART1_SendByte
    2 ?" c$ W4 ]0 K# P
  27. * 功能: UART1发送一个字节
    $ w2 [/ }- ]8 o; d  f
  28. * 形参: data -> 要发送的字节
    ) b4 z& |7 G& K% L# Q9 o
  29. * 返回: 无
    " y; q- _0 \4 y8 g+ S9 L3 s' ^
  30. * 说明: 无
    ) o+ F0 D/ f0 d- I1 r8 l
  31. ******************************************************************************/- P; ]4 C" _! n- ?% D
  32. void UART1_SendByte(u8 data)+ M7 z& h& d) F8 }# h; y& G! a2 Y1 u  Q
  33. {
    7 s0 S% I% ?5 Y
  34.     USART_SendData8(USART1, data);5 I+ y5 s# K: {8 f) q3 _
  35.     /* 等待传输结束 */
    8 K( g' k( t$ ^# H0 ?+ S! ?
  36.     while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);8 S0 W8 V8 ?7 c+ t  {0 E
  37. }
    $ V- K1 B4 ~# L7 t& p9 @/ R, b

  38. ( S5 Q% Z! Q* k7 h$ u
  39. /*******************************************************************************
    9 s# y4 g3 t. C: O
  40. * 名称: UART1_SendStr
    0 A/ E4 ~2 z. {* p
  41. * 功能: UART1发送len个字符% N; q+ [0 V6 r: b( n( u
  42. * 形参: data -> 指向要发送的字符串
    ' F, Y; Q3 `4 j' }) s. u
  43. *       len -> 要发送的字节数
    8 l5 Y. P& s4 o  J$ Q
  44. * 返回: 无9 ]: z1 G' [' A" G2 I- x( D# C2 w
  45. * 说明: 无
    + H$ F) l& S2 x6 O1 \- I7 i2 M
  46. ******************************************************************************/
    & Q  ]* J6 N  j8 @
  47. void UART1_SendStr(u8 *str)+ X% k: D" B4 v: X% P1 g; E* y7 x
  48. {( ?- v1 g* L5 n+ O, p: I
  49.     while(*str != '\0')
    + f6 a7 t; H  M4 X# l6 a; U/ Z) Q
  50.     {" S/ I" e! Q# a; t
  51.         UART1_SendByte(*str++); /* 循环调用发送一个字符函数 */
    ( ^9 B) U' B$ Q  l9 G7 j
  52.     }   ! X9 m) P. U& W8 b2 E) C  K1 `
  53. }
    6 E, Q0 ]+ F1 c+ [! r+ ^

  54. 2 p" j, A) ^( v# v. ]1 I7 }
  55. /*******************************************************************************
    / o" i  g( J# o) O7 v
  56. * 名称: UART2_ReceiveByte( l4 k5 Y6 g6 U' k8 z
  57. * 功能: UART2接收一个字符
    + {# C% `1 Z3 ^1 b2 r2 }0 o' @
  58. * 形参: 无5 ]) X+ N0 ?% d! O" ^) N0 f* \
  59. * 返回: 接收到的字符' o, l$ O6 n( S7 v/ I6 l( S# t
  60. * 说明: 无 3 T: w0 M1 D( W' k1 x+ _9 a
  61. ******************************************************************************/
    1 N8 u8 g3 ~; ?8 t8 _
  62. u8 UART1_ReceiveByte(void)
    ; v4 [' b; i" r0 O+ z/ E) ?
  63. {
      t0 ]$ A- B/ p8 H8 s4 f9 Y% Z8 q, r
  64.     u8 UART1_RX_BUF; 1 }3 f; Z8 ^! O4 O" O
  65.      # Y1 l- Q8 V6 [( B. l, t9 J) q5 b
  66.     /* 等待接收完成 */' f( ]" S: W4 f2 P. m  i
  67.     while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);  F; X- u; H1 p$ i9 b$ y) _5 F
  68.      * v' }+ R4 }1 _" ^) n1 `
  69.     UART1_RX_BUF = USART_ReceiveData8(USART1);% c% k2 s) e, ]9 i" I; e! i
  70.      
    # n' s, g! `& [0 f5 T( o
  71.     return  UART1_RX_BUF;
    ( B* z6 l/ S$ k& ~$ L- s5 ]- G
  72. }. `! ^/ b6 }/ T5 w! S+ m
  73. 9 }; q+ z/ e  t! A1 a
  74. /*******************************************************************************
    $ N9 [1 h- C8 `  a4 L7 ~: q& R, }
  75. * 名称: fputc0 H/ k# T0 O8 F$ v! y" R& b
  76. * 功能: 重定向c库函数printf到UART11 G+ q+ d8 \% @& u9 H$ U
  77. * 形参: 无" r0 P; H2 F! i( {" p
  78. * 返回: 要打印的字符
    ( U+ Y5 m+ S0 z7 z. m
  79. * 说明: 由printf调用 7 J  d8 ]5 H; h% `" m) ]
  80. ******************************************************************************/0 t& `- I9 z9 h# G2 M
  81. #ifdef _IAR_
    5 f; Q! X9 @7 R) y# ^; j& R
  82. int fputc(int ch, FILE *f)
    : V  R$ ?$ s" p& z/ k1 S& `2 W
  83. {  % @; S- i9 }# p' Z. V/ _9 ~& o
  84.     /* 将Printf内容发往串口 */  G) G9 ?' Y$ f- [) Z  x
  85.         UART1_SendByte(ch);2 s. n* a$ ]' {# {6 e: D( j
  86.      
    # U4 V6 y5 A$ p. D
  87.     return (ch);. B% W- R. s  I. m
  88. }
      g3 r- e0 A4 T' O' d( D
  89. #else
    6 b4 H7 _* @$ G7 r& N- U
  90. PUTCHAR_PROTOTYPE
    % e, f; w" g, ?) \
  91. {
    2 Y7 |0 y% f  a4 p
  92.    /* Write a character to the UART1 */
    , C" I$ s; J' ]2 k
  93.     UART1_SendByte(c);
    2 ~: d8 M, [) v) b
  94.     return (c);
    8 i2 y& `& I+ [9 [% ?1 E4 V4 J) `
  95. }
    % d3 C! s& `# V$ j4 D1 L# B: r+ \
  96. #endif
    + i! E: j, o8 B& m% E9 _# w

  97. 5 _4 e; i/ G7 f3 ]' t$ |
  98. GETCHAR_PROTOTYPE
    1 Q+ t# @8 x8 R- a' C
  99. {$ ]4 J" [* e6 @9 I
  100. #ifdef _COSMIC_( m9 N. j) j7 B' h- J9 C8 ^) q4 _5 [
  101.    char c = 0;% t* v* l, k# f! V2 I  ~
  102. #else
    6 y6 d  Q- W& V1 v) H' ~/ h: I9 C
  103.    int c = 0;
    * L0 M5 i7 E8 u# d4 Y# T
  104. #endif
    - f' z$ `. q6 m+ i5 ^
  105.    /* Loop until the Read data register flag is SET */
    1 E# j( D9 v6 Y8 k* b  R. T
  106.    while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);1 C: a6 }- C) o( w' U7 U" v
  107.    c = USART_ReceiveData8(USART1);( f2 b' s7 A* d. |/ \, @2 T5 w
  108.    return (c);
    9 J' \  J2 _8 O5 y
  109. }
    " f% _" V6 u* g5 _

  110. / r7 |' E& @/ C  T& J3 `
  111. /********************************************************, G3 f5 O) o- n
  112. * 函数名:itoa( W7 B/ [: ?4 {. z) x
  113. * 描述  :将整形数据转换成字符串
    % o- Q. X, w9 U. |
  114. * 输入  :-radix =10 表示10进制,其他结果为05 M5 w, @9 O& h& x
  115. *         -value 要转换的整形数
    4 y  ]9 I/ l8 k5 i
  116. *         -buf 转换后的字符串: s& n& ]+ }4 u0 E$ J
  117. *         -radix = 103 A$ ]3 S' c0 Y- |) X: c! d8 E
  118. * 输出  :无
    3 q* O2 R$ V8 j# S
  119. * 返回  :无2 x" R" [3 S' S+ F/ _# {
  120. * 调用  :被USART1_printf()调用
    % H) m- o7 S! X* H2 v9 @9 y8 F
  121. *******************************************************/- p# r. b6 ^4 n# y
  122. static char *itoa(int value, char *string, int radix)
    ; p; D( D4 {& `. K  h! @
  123. {/ T% M6 e5 v. g( ]# [8 A
  124.     int     i, d;
    & C  r" r0 J1 U2 l6 I) A
  125.     int     flag = 0;+ K$ F+ i5 m( u% s( e; ^1 N+ U
  126.     char    *ptr = string;
    4 t: P% V. K! o0 Z

  127. : p- t4 E+ e1 e& I5 H$ R* M  p
  128.     /* This implementation only works for decimal numbers. */" q  u: A% V, w  Y, M1 ~6 g
  129.     if (radix != 10)
    ) h0 r* x$ T! P9 J1 w1 V
  130.     {
    3 {2 Q# e% s! a3 E
  131.         *ptr = 0;* s: ?3 H) W( Z+ t; B9 f
  132.         return string;+ c# n7 O, c/ k9 n2 p4 s1 |& l! t
  133.     }2 ]) Y' z/ V+ j. @; X, Z

  134. * g5 j" s' ^* I5 I9 `/ X6 F& M
  135.     if (!value)
    4 g' Y& L8 v% N' A3 X0 @3 ^3 n
  136.     {7 @( h# v6 @1 Y, K" A5 u3 j
  137.         *ptr++ = 0x30;# q: A, t' m. z  ]( H- X9 F/ ]  C
  138.         *ptr = 0;
    " o% y' G, w. G4 o& D- q% {
  139.         return string;( V! g- Q. D8 q1 \5 V
  140.     }
    8 f0 K9 R/ r; e# o7 g6 C
  141. + }" l% i% A+ c
  142.     /* if this is a negative value insert the minus sign. */9 J5 B! q. I: X, ]2 u  V
  143.     if (value < 0)1 O- b! h" ?- S% q
  144.     {& K9 J$ O5 }  t9 p. B% ?) \
  145.         *ptr++ = '-';0 U* _: @& y# L3 c) X) N3 E
  146.         /* Make the value positive. */. w- f: W* r* l: G- u9 q
  147.         value *= -1;
    % ?" Z; Q$ Y; w# R  @4 Q; S4 O
  148.     }9 C  Z) ~( b$ g( S+ j5 j
  149. & w% Z* q% x5 p+ f# _
  150.     for (i = 10000; i > 0; i /= 10)* C/ D: ?$ O2 H2 I% F( |' Y
  151.     {
    2 Q2 Y; H; F3 w  U7 q4 B3 A5 j
  152.         d = value / i;/ j: h6 x( L+ k7 Z. ?

  153. " U0 r! _! j+ x4 o3 b0 r: i2 M1 `3 z, G1 U
  154.         if (d || flag)+ F! @. |/ g9 R/ |
  155.         {8 e( r3 j$ ^0 K* v  J0 X/ y
  156.             *ptr++ = (char)(d + 0x30);) a% ]' c# x0 H, i' A, c6 U
  157.             value -= (d * i);
    - u$ i* n( `; v9 L+ C
  158.             flag = 1;& R$ Q+ ~8 }8 [5 v: z: x+ V
  159.         }. [$ @4 r" w" m5 j
  160.     }8 w% \  S' \2 n8 i8 c

  161. ' w: X" o! L% b1 }6 ]
  162.     /* Null terminate the string. */0 _6 I5 J0 C( L
  163.     *ptr = 0;% H) E+ u1 X" Z

  164. ; `5 H  A. m9 d# W5 Q# J. `
  165.     return string;. M: w6 F  t8 r7 w8 v: p, q

  166. $ |1 A+ I8 J8 a
  167. } /* NCL_Itoa */& r+ F8 |0 A" r4 i

  168. 3 Y& {* R0 t9 R5 v$ J0 K' x
  169. /************************************************************************, Q) M( A& I6 B2 T0 {8 g# {
  170. * 函数名:UART1_printf- e! @. v! I1 x# Q3 I3 z
  171. * 描述  :格式化输出,类似于C库中的printf,但这里没有用到C库' C! m# o' g, A. M/ ^# n
  172. * 输入  :-UARTx 串口通道,这里只用到了串口1,即UART1
    ! m$ [. J2 V5 l
  173. *           -Data   要发送到串口的内容的指针
    1 G5 m  }# I7 h$ \
  174. *             -...    其他参数7 p# x0 R( v) }3 g% @7 ?% C
  175. * 输出  :无
    9 Q$ a/ t8 c  h# E$ k; Y- Q9 n
  176. * 返回  :无 7 O3 \1 K% P% i% g2 w8 W9 T; ^
  177. * 调用  :外部调用
    2 I4 @) B. E! s- N; F, ^3 f4 @
  178. *         典型应用  UART1_printf( "\r\n this is a demo \r\n" );
    ) v* a9 s8 n5 g! k
  179. *                   UART1_printf(  "\r\n %d \r\n", i );7 D1 A. x9 `; I8 f7 P$ Z7 v
  180. *                   UART1_printf(  "\r\n %s \r\n", j );
    6 ]3 y% c3 B% H6 D
  181. ***************************************************************************/
    + c$ n( f* n. c( f- o. }) `
  182. void UART1_printf(uint8_t *Data,...)
    8 z+ T6 q9 g& I+ i% m3 z
  183. {
    # I  c3 \0 g( \- s! A- K0 {' S; g
  184.     const char *s;( ]% Q4 \; x/ q  D' N# A
  185.     int d;   # ~; B2 s  T7 i& u; X
  186.     char buf[16];
    ' C! u* V- ~) v3 R/ k) w' y% S
  187.     va_list ap;/ Z6 H- o, g, K1 d" A) n5 G9 G
  188.     va_start(ap, Data);
    / X7 }  k! D; n
  189.      
    : P# p  G. O0 N' t5 ~- E4 o
  190.     while ( *Data != 0)     // 判断是否到达字符串结束符
    4 q2 G  ^2 g, H7 _' x; {5 i
  191.     {                                         
    : c4 r: O: e1 G, x3 \: g+ {6 D
  192.         if ( *Data == 0x5c )  //'\'
    , d# P" k8 i7 P. z3 i# l/ M, O; M# g
  193.         {                                    
    ! g# T. y! r; E# ?2 D. v
  194.             switch ( *++Data )
    ! j# m3 O7 [# ?" L0 X
  195.             {
    + {) d+ M% u; D9 B9 G5 L1 N
  196.                 case 'r':                                     //回车符
    # ]9 O; g7 X2 K, A- B0 }* l4 Y
  197.                     USART_SendData8(USART1, 0x0d);
    3 m: L2 A! m* S3 s5 m
  198.                     Data ++;/ T9 W- e$ f. [; m$ h* R7 N
  199.                 break;6 N% r' h, M" ]- l3 C1 x4 A
  200.      
    # o1 J, g6 g6 k6 V; P
  201.                 case 'n':                                     //换行符7 [( H8 H( U6 f$ v6 J) W0 G
  202.                     USART_SendData8(USART1, 0x0a);  1 v* x2 J' t: S+ I+ |4 E
  203.                     Data ++;
    ( I2 `6 ?- U; q- M; ^! Q
  204.                 break;
    5 U1 C& \0 b0 ^4 Z9 _
  205.      ) o$ u3 g) l9 W$ e2 }% K
  206.                 default:
    ) T( w6 Z# w! o/ N+ X( N. l+ q
  207.                     Data ++;
    2 J7 C# f! m( V  T& n4 P7 A
  208.                 break;
    7 X3 y( x9 u+ [7 i6 f4 o
  209.             }            
    7 E: P. e1 l- `7 X  X) W
  210.         }# ]8 y6 n1 A9 k4 h( O
  211.         else if ( *Data == '%')4 G; j0 p) p( T
  212.         {                   //
    1 g4 A- h; e6 i* Y& A" c1 m5 F4 e
  213.             switch ( *++Data )
    ; R& n% ^7 }: x6 \$ e
  214.             {               
    ( j& l+ R) |$ Z0 W2 E  Q( s
  215.                 case 's':                       //字符串6 _- a$ _. ~* m0 j
  216.                 s = va_arg(ap, const char *);% q' f4 M( s' Q. o6 s$ a
  217.                 for ( ; *s; s++) 5 j5 I) ]" o+ D0 u: j
  218.                 {
    . B- b- r+ ]# W8 y. n
  219.                     USART_SendData8(USART1, *s);
    1 q7 Z1 r$ @$ Q
  220.                     while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  R! C/ h9 j* M9 {" A6 }
  221.                 }
    3 O1 y4 }: {* B2 L
  222.                 Data++;6 c3 ]. [) R  ~# i5 p
  223.                 break;  6 Y; e" B# X2 F# n/ A) L: L2 v1 k0 f) D, f* o
  224.                 case 'd':   //十进制& k9 b  x' d( [/ U7 K0 E
  225.                     d = va_arg(ap, int);  Z% P$ ]/ |7 j2 @. e$ m5 Q
  226.                     itoa(d, buf, 10);
    - w- s3 \2 u+ c5 T& V. Y/ \9 _/ i
  227.                 for (s = buf; *s; s++) # g# i1 q: C$ ^& l- x) R% [7 y
  228.                 {$ |& s2 z9 a( U0 P. {& ?
  229.                     USART_SendData8(USART1, *s);9 Q, j* O8 M7 k6 l$ \& R3 Z
  230.                     while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    2 H! |; r( k$ F( |+ q. ^
  231.                 }
    ) d1 ]3 B& s6 `: v
  232.                 Data++;9 e/ B/ t( f, ]1 T
  233.                 break;         
    * s# M/ u1 e6 w2 o7 B
  234.                 default: Data++;
    1 [6 n6 B) f3 b! C# A* r& u, F3 ^
  235.                 break;
      ], ~2 H/ N1 M8 d1 j& j+ k' S# k
  236.             }        9 h2 s: C7 z6 S. M6 \3 o
  237.         } /* end of else if */
    6 q; Z8 k4 C7 A) A# H
  238.         else USART_SendData8(USART1, *Data++);
    , p% v5 t# K+ A% i" H
  239.         while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    / \3 [$ q1 E5 V& D# u
  240.     }
    ; W- w4 C- X8 T; k3 U  d
  241. }
复制代码
附上工程文件
9 m8 Q# Z5 h# U+ V

STM8L_UART1(基于库).zip

下载

741.95 KB, 下载次数: 1738

收藏 4 评论4 发布时间:2016-3-23 13:58

举报

4个回答
魔界黑城 回答时间:2016-3-23 15:36:10
支持!
zcl201207 回答时间:2016-3-23 22:28:24
youngyyzz 回答时间:2016-9-29 14:28:35
# V  ]. z$ a' S5 f9 `3 f' m* j
支持!
youngyyzz 回答时间:2016-10-19 22:35:16
主程序第一句就打开中断,不好。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版