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

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

[复制链接]
黑夜之狼 发布时间:2016-3-23 13:58
来了社区蛮久,还没发过帖子,这次来分享一个串口调试程序,欢迎大家拍砖赐教5 J6 B& P  U$ I2 i+ \
  1. #include "uart1.h"
    ! T5 V, Y' K7 q! H; y7 Z! e- H
  2. ; ^+ d5 T$ T# b0 o: {! ?$ B0 N$ O0 K
  3. void Uart1_Init(void)
    1 Q$ \7 m6 c- Q, t
  4. {
    + ]5 N! Z0 z5 P( s% x" H' t, K4 g
  5.     CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);. L9 {8 b- }- j( u; ]
  6.     GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Fast);//TXD7 W6 O+ y( l; H0 U1 {  M/ M
  7.     GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT);//RXD/ m5 G* O3 K2 v4 A5 N; j  `
  8.     USART_DeInit(USART1);       //复位UART1
    . F. n! g& {4 @; Z5 b- {2 J
  9.     /*
      |" o$ m5 W% ]
  10.      * 将UART1配置为:, t3 R* P* r5 u2 m' A
  11.      * 波特率 = 115200) d1 w% m: Z$ S$ S8 n, z3 M- k: H
  12.      * 数据位 = 8' D7 L) {2 J* B+ L7 [* x
  13.      * 1位停止位
    1 \9 {. n9 W- ^* H1 b
  14.      * 无校验位7 D% [* @6 X, b6 G6 t
  15.      * 使能接收和发送, s: Q3 h) q( T! p+ p, K! P; N
  16.      */. f- a# S  ^3 x' {2 R
  17.     USART_Init(USART1, (u32)115200, USART_WordLength_8b, USART_StopBits_1,
    , F) F3 l2 A6 r* P
  18.                 USART_Parity_No, USART_Mode_Tx|USART_Mode_Rx);% V6 t, D- n: l- c" T$ A
  19.     USART_ClearITPendingBit(USART1, USART_IT_RXNE);7 W5 @- x% j4 M  R& X+ f: A3 Q( t
  20.     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断
    ) ~- q; x5 `1 r1 R) U" ]
  21.     //USART_ITConfig(USART1, USART_IT_TC, ENABLE);//开启接收中断( t3 K  q( \: g. S* a7 i5 H4 S
  22.     USART_Cmd(USART1, ENABLE);  //使能UART2
    ' {9 @6 U; a" H& E8 ^9 x
  23. }. r+ U" @6 ^+ _* B6 V: C. @
  24. 2 ]) ?3 b# b( U$ d# V4 e( i9 q
  25. /*******************************************************************************
    / r; u, k: }+ ~9 B' a+ k
  26. * 名称: UART1_SendByte
    ( A  r* O' B- G! S. C! g' `9 N
  27. * 功能: UART1发送一个字节: H, v2 ^6 n$ R6 U! s( w
  28. * 形参: data -> 要发送的字节' b  |- x& e! p5 }' A9 D; {
  29. * 返回: 无2 o9 S* `6 o, m) W: E) t
  30. * 说明: 无 6 w' N9 Y0 k# ^, y3 E
  31. ******************************************************************************/
    ) i, q& O7 }' a$ O, L
  32. void UART1_SendByte(u8 data)+ K* }& T5 Q. e% Q7 g7 C; k2 [
  33. {% J1 u; N: B: x5 _0 Z) x5 [$ u7 o
  34.     USART_SendData8(USART1, data);- m  M" I  T' s7 W* Q
  35.     /* 等待传输结束 */
    ' i) a& e0 A  B# Y/ K
  36.     while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
    ; b, F! a) z3 T) \9 q
  37. }' R" d9 j' r* Z: c

  38. 7 u4 ~$ Z% C1 W5 g: E; g& t
  39. /*******************************************************************************
    " Z5 f+ i. u; u4 c/ I) X
  40. * 名称: UART1_SendStr
    7 h3 }& d$ M$ e8 o
  41. * 功能: UART1发送len个字符. W/ E  o3 \& F# D& U% N
  42. * 形参: data -> 指向要发送的字符串2 t! g& T( O# X. o
  43. *       len -> 要发送的字节数3 W- {- l! B3 P$ G; E8 `% V2 L
  44. * 返回: 无+ w) ]3 [% Q& Y; q/ M1 u1 P, u
  45. * 说明: 无
    ! e1 {4 V. @4 ?, O7 m3 V- v
  46. ******************************************************************************/6 ]8 `' L; [- \
  47. void UART1_SendStr(u8 *str)& i: Q5 B% c6 _) I
  48. {
    0 t/ J- Q0 g0 {& p2 R* J" F" [2 D
  49.     while(*str != '\0'), i8 N4 h0 [" ^* K
  50.     {
    ( D5 g  Y) Y. Z- _" g9 F7 e
  51.         UART1_SendByte(*str++); /* 循环调用发送一个字符函数 */
    9 ?' j# Y5 i7 V3 H9 M
  52.     }   ) i; G# t/ n7 v7 O* E# Y& `# U0 q* i
  53. }
    $ A) G+ h. v+ |
  54. / F  v" G, d/ g1 b# O. ~9 Y9 B
  55. /*******************************************************************************% c$ S8 N6 w) s7 O  A# l9 D& ]5 b
  56. * 名称: UART2_ReceiveByte  d& x% ]- N3 p; a* A
  57. * 功能: UART2接收一个字符
    , Z# [; Z6 h8 K4 \! u! E& H3 Z2 }+ ^
  58. * 形参: 无/ L& B$ r& Q/ d: g7 P  X
  59. * 返回: 接收到的字符
    9 \6 U! E- o& f7 {7 F
  60. * 说明: 无 3 j2 o+ J4 E& W; a9 {
  61. ******************************************************************************/2 M2 H- d/ c7 [$ R; m7 p/ N
  62. u8 UART1_ReceiveByte(void)5 Z1 X+ c, ^8 o- x
  63. {3 k  Z) f+ m4 b
  64.     u8 UART1_RX_BUF; + P7 e& F3 \2 R
  65.      ; G1 i& A( X. u" S0 g
  66.     /* 等待接收完成 */5 ~0 t9 f+ `, d" W
  67.     while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
    # e! v0 j7 O% O( V2 B! S. h6 U
  68.      $ N- m% ?; U$ |! c1 B. x$ z$ k
  69.     UART1_RX_BUF = USART_ReceiveData8(USART1);8 s: b4 @7 A$ b4 @& m
  70.      7 P/ ?; P' ~* `* x/ M2 g
  71.     return  UART1_RX_BUF;
    ; p7 f) j  ^4 z/ J6 R
  72. }4 A6 F7 i8 p2 O

  73.   R& O, W( _4 D8 |
  74. /*******************************************************************************
    ( i" y% P# I$ K. t6 J) v
  75. * 名称: fputc
    ( _3 L  N$ P5 T( I6 s% F4 {
  76. * 功能: 重定向c库函数printf到UART1
    . b/ ~! x' L2 O; I9 J0 H3 q
  77. * 形参: 无
    2 W! G7 n. v' m: u* b
  78. * 返回: 要打印的字符  F, G2 ]( T4 T5 M
  79. * 说明: 由printf调用
    * _0 T$ b. Z4 X* I" @+ h
  80. ******************************************************************************// Q+ L+ c3 X4 z; m
  81. #ifdef _IAR_5 K1 s3 W% B" x; M
  82. int fputc(int ch, FILE *f)
    & m/ b$ u+ O* X5 ~8 L1 _: N5 U! E
  83. {  
    " H! W5 ^  v* ]3 D( Y/ `' G9 t) v$ E' S
  84.     /* 将Printf内容发往串口 */
      X+ W, b4 z% ]- E
  85.         UART1_SendByte(ch);& i9 w/ }- |+ V, v! ]
  86.      
    1 R* _( t0 w  n5 `6 [( }
  87.     return (ch);$ I+ x4 x7 D- Q
  88. }
    3 ~4 }2 n) ~4 J/ R+ j
  89. #else
    8 ]( Y$ c1 C' N# B
  90. PUTCHAR_PROTOTYPE
    2 k* V" A  U4 d; D- w5 F) c- Q( u
  91. {3 G$ L. g- v3 r1 {. ?
  92.    /* Write a character to the UART1 */1 ^) r' _. Y- R4 B3 D) i
  93.     UART1_SendByte(c);& U3 C3 m6 o) V& Q) r  g( j1 l
  94.     return (c);& ^- F" v) B4 p/ V+ g1 a) n$ V
  95. }0 S' E' S' z; x( Q
  96. #endif
      U& ^4 h% c$ P8 o
  97. 8 e* P# b3 V2 [2 w+ ^3 ?% ]% _
  98. GETCHAR_PROTOTYPE
    ; m+ A% K9 ?' u: x/ S
  99. {$ N7 }2 H) @: |. M, Y1 a
  100. #ifdef _COSMIC_+ s! p" m! W/ }/ O+ ], k
  101.    char c = 0;
    ! _% c1 T3 W7 a& k2 X' C
  102. #else$ ~6 H1 S; _" Q( a  W4 ~4 r
  103.    int c = 0;* {) o5 [1 v* l9 a" C, q
  104. #endif
    & f2 _, F: }% H0 `) e/ ?; U
  105.    /* Loop until the Read data register flag is SET */
    : R" r1 ]) V8 f2 F
  106.    while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
    ! s2 L* \5 v4 g- n3 Q' c
  107.    c = USART_ReceiveData8(USART1);: a$ t- C( d1 r* E
  108.    return (c);6 B7 R+ d1 h  i* g8 a
  109. }
    " ~4 n$ s/ O% T: j6 t! H. n

  110. 9 p; U- G# _- \  N- D. r4 Q
  111. /********************************************************
    * I# y' X8 t% e( j2 Z
  112. * 函数名:itoa4 |7 B5 x; ~7 ]. l0 X) J" ~% P
  113. * 描述  :将整形数据转换成字符串# d4 L/ |& I' \% Z: u. C$ U3 R
  114. * 输入  :-radix =10 表示10进制,其他结果为05 r) q' X* G  q: H2 ^- u( p- t
  115. *         -value 要转换的整形数7 r3 q6 b/ k, W$ V. M/ F
  116. *         -buf 转换后的字符串
    . z& E: n5 l' n7 h9 j$ ^
  117. *         -radix = 10( i5 H/ A* c. M, ?
  118. * 输出  :无
    ) b& L2 B/ o5 l6 G. ^: ~
  119. * 返回  :无, J& x7 j: ~! M' ?/ l
  120. * 调用  :被USART1_printf()调用
    $ ^) k8 Y) j0 Z. Y& ~0 D
  121. *******************************************************/8 s& d5 G5 M$ ]  m
  122. static char *itoa(int value, char *string, int radix)4 Q' E" Z1 m6 i
  123. {
    * [( K7 c! P% `1 `3 ^5 ^1 @
  124.     int     i, d;$ z$ \. V* C* ~
  125.     int     flag = 0;
    / l+ _$ Q3 ^$ z0 e
  126.     char    *ptr = string;
    * C. S# d1 E% r* X. t6 b+ W, _+ C

  127. 9 J1 o! m8 e7 C1 n/ p- P
  128.     /* This implementation only works for decimal numbers. */. ^2 l$ r) O, d8 }8 |/ E8 H2 R
  129.     if (radix != 10)
    , ~' x! F9 ]( j9 a: l5 g& F2 ~
  130.     {: ^& U7 [4 V6 C/ B; P0 C
  131.         *ptr = 0;
    * X+ q: F- k0 R$ t' V+ a' T
  132.         return string;4 h' k: o$ n0 c/ A: q, O% W, y
  133.     }% G! L# w0 [4 D$ o) L
  134. / j' ^/ }1 L; w
  135.     if (!value)
      ~! C7 E' a2 g* j2 T
  136.     {
    $ r8 A* m" `5 j6 c0 C
  137.         *ptr++ = 0x30;
    9 a9 H% I& S3 A5 u: I3 O
  138.         *ptr = 0;7 t: N  y; S2 B& J, V1 l2 T0 `9 A
  139.         return string;
    / |" j3 t& I5 I$ W, }6 T1 J
  140.     }
    " j' q8 u9 X- E7 T. ^

  141. & y* x; [1 S1 H5 m4 ~) ]
  142.     /* if this is a negative value insert the minus sign. */
    * g+ V  V7 H) G
  143.     if (value < 0)
    : M; b/ {! k3 k( J7 D# F
  144.     {: h( o, ]: _2 e% a/ E, F
  145.         *ptr++ = '-';
    / H; i6 \, v7 l2 m
  146.         /* Make the value positive. */# `0 ]( P0 r  ]; X
  147.         value *= -1;
      R" }0 t6 |6 O+ ]" z) T
  148.     }
    9 Q/ l# e4 a# ]( ~) o, ~
  149. 9 d9 u4 ^( u/ e1 f/ E  z# [8 n
  150.     for (i = 10000; i > 0; i /= 10)! f0 U& ?* P  t1 W
  151.     {1 \2 C: L/ Q+ q  \& j( O2 R
  152.         d = value / i;
    ! F2 j2 a6 V' p# w$ w& y/ ?

  153. ' _" Y0 n% }( J4 [3 J. N
  154.         if (d || flag)5 q$ a! D# C# o9 ^2 u, r
  155.         {
    ; t! h3 j# g# h
  156.             *ptr++ = (char)(d + 0x30);/ J5 O- w* P0 a( I
  157.             value -= (d * i);
    # n' [0 z/ m! w; f
  158.             flag = 1;" y( W7 v; z. M5 c
  159.         }# u; R5 R6 {! X' x+ P  J
  160.     }& s! F6 M3 b. p
  161. ( @5 D/ v3 T2 ^% d* g! e- s
  162.     /* Null terminate the string. */
    ) D9 T- S5 ^. g' }
  163.     *ptr = 0;, e: F  Y9 a4 [3 V

  164. 8 u2 P+ {5 j' s' Y
  165.     return string;: A* F3 T- F) G2 s7 r; P" h
  166. - f6 H+ q0 Q2 d6 X) T3 W4 L
  167. } /* NCL_Itoa */9 k; m/ J1 u# w" F2 L# a" a

  168. ( N+ _8 r9 K- d9 [. O1 e
  169. /************************************************************************
    : h0 |' ~2 O: m: q7 g' t
  170. * 函数名:UART1_printf7 |* a% A/ p9 x2 f" S* _3 e0 C
  171. * 描述  :格式化输出,类似于C库中的printf,但这里没有用到C库" \5 u3 t+ P2 R. S) M" c; @. v
  172. * 输入  :-UARTx 串口通道,这里只用到了串口1,即UART1; g: t' X6 F$ c4 ^$ ^
  173. *           -Data   要发送到串口的内容的指针
    : V% c7 j& e% B% J9 t" ]) e: G5 o
  174. *             -...    其他参数
    ; w$ Z( a9 g& \1 N8 }% i! b" w8 C
  175. * 输出  :无
    * W4 a  _1 ~( D& w/ S
  176. * 返回  :无
    ' s3 m* u5 N4 Y) R/ B( x  R
  177. * 调用  :外部调用' i! b" P- W4 f
  178. *         典型应用  UART1_printf( "\r\n this is a demo \r\n" );0 J6 V& s, \) ?
  179. *                   UART1_printf(  "\r\n %d \r\n", i );
    1 b( F) `1 S# l$ @  Z# b) d
  180. *                   UART1_printf(  "\r\n %s \r\n", j );
    - r& U$ V" ^( n; d! l9 {$ h
  181. ***************************************************************************/
    5 E2 t! m5 v/ U
  182. void UART1_printf(uint8_t *Data,...)& E: ^- Z. {  @, X& G
  183. {
    8 b! u  X( k  j0 k& Y
  184.     const char *s;
    6 T" P5 n  z* j& b' c: S/ t, g! |% D
  185.     int d;     Z* }2 m+ r* q* L) V) Z
  186.     char buf[16];
    0 Z4 j6 L2 X: E* F) l- k
  187.     va_list ap;6 Q; q; q# g$ U5 s  f) U: P
  188.     va_start(ap, Data);
    . h6 _7 i; r7 x- |; Y0 t( L
  189.      / T, V& P+ s4 l* \. E, J0 d
  190.     while ( *Data != 0)     // 判断是否到达字符串结束符
    ; T, B- g8 z6 O& |& u  {' _, _
  191.     {                                         
    , q) D5 u4 F' }8 s% g
  192.         if ( *Data == 0x5c )  //'\'/ d4 ^* h/ [4 P
  193.         {                                    
    % R3 G: J8 i. G4 q
  194.             switch ( *++Data )
    ( C! A" e3 M, D0 Q
  195.             {
    . i( A) J7 A9 B, g$ `
  196.                 case 'r':                                     //回车符
    . P( l" y% w7 r5 R+ |. ~( g
  197.                     USART_SendData8(USART1, 0x0d);  I3 A/ h: g/ q  n
  198.                     Data ++;
    $ |3 y* N  P% i$ F8 e/ [' U' K
  199.                 break;9 ]. d2 [* ^, i( b& C
  200.      
    9 D2 l- z# m# |4 g  b6 F/ O
  201.                 case 'n':                                     //换行符
    ' m8 G. o$ l, B4 p' H
  202.                     USART_SendData8(USART1, 0x0a);  
    5 v8 ?3 W. s! g3 q, c
  203.                     Data ++;
    ( C( V6 ~6 P. I& O+ ]
  204.                 break;" ^  c& U' a# H5 q: I9 }" ~' }
  205.      
    / @! |: `$ i. u) l7 Z7 X3 C
  206.                 default:
    9 {% g/ y( m" H8 O# R
  207.                     Data ++;5 s! I" Y) d% K. _7 e
  208.                 break;
    4 I  `- Y8 [& r  W
  209.             }            " E) g- }4 |9 v+ `8 \' D- U
  210.         }# E* e3 E; \$ v4 p! |$ i! X
  211.         else if ( *Data == '%')  Z) B) i( n4 L
  212.         {                   //) {5 Z2 T+ j' ~$ l0 i
  213.             switch ( *++Data ), |) l% i  Z2 v
  214.             {               
    # L0 s/ d9 D/ B3 D7 s! l" \
  215.                 case 's':                       //字符串
    , c: z' E& e( K5 f
  216.                 s = va_arg(ap, const char *);
    9 b) Q/ Z2 R/ H  F( ~+ d" d+ d+ g
  217.                 for ( ; *s; s++)
    - v6 N% ]$ b: ^. l+ B
  218.                 {4 d+ ~/ y" n5 C
  219.                     USART_SendData8(USART1, *s);5 y4 d# L! {; V5 U2 E
  220.                     while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    ( n1 @2 z3 Y& q- Q6 B9 M2 \
  221.                 }& t4 x/ l" m- X/ R
  222.                 Data++;+ ~" [8 L% N1 z* s6 n
  223.                 break;  
    4 m, `. `! `- X; \! |( ]
  224.                 case 'd':   //十进制' @( A) O2 F! v/ @
  225.                     d = va_arg(ap, int);
    0 M6 |/ |3 _! h- {5 |# V
  226.                     itoa(d, buf, 10);/ `5 t. g+ ?. v; j1 u4 u
  227.                 for (s = buf; *s; s++)
    7 e: Y7 E5 f9 [. W
  228.                 {1 h! |) Z8 c1 Z: t  d$ J% V
  229.                     USART_SendData8(USART1, *s);
    0 a# U0 ?$ I1 \: s7 B. k; [
  230.                     while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    8 l- }% e" F6 N5 S/ x, P% [* c$ N- z
  231.                 }4 ?) l! f( {* {: m9 O) K) r/ G
  232.                 Data++;
    6 z% |7 C+ a6 |6 @; J; s
  233.                 break;          " \8 x* z: L1 `$ N
  234.                 default: Data++;
    # ^9 i1 k" ]1 U) `
  235.                 break;
    # k+ J: ~' ?# L) L' u% M$ f
  236.             }        
    ; c( a  P( J4 G) l
  237.         } /* end of else if */" j9 A7 S" h  b1 y" g4 ~
  238.         else USART_SendData8(USART1, *Data++);
    . H! E# j; a4 @5 ]
  239.         while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);+ T% m/ f% X( b6 D% U  M7 b
  240.     }
    : P1 ]$ O9 w: H2 l* K
  241. }
复制代码
附上工程文件9 Q) @; j* u. B1 K

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
, N+ o3 l% Z! x  f9 f% P
支持!
youngyyzz 回答时间:2016-10-19 22:35:16
主程序第一句就打开中断,不好。

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版