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

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

[复制链接]
黑夜之狼 发布时间:2016-3-23 13:58
来了社区蛮久,还没发过帖子,这次来分享一个串口调试程序,欢迎大家拍砖赐教% j+ g. F, D, Y) q
  1. #include "uart1.h"
    7 G2 }3 ^2 C, c% H2 @

  2. 9 {3 H3 b' d3 b2 K$ Q
  3. void Uart1_Init(void)
    ; e2 R# H- G' b* }
  4. {1 `, a$ I0 x! X9 q. s4 p5 h
  5.     CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);
    , d6 M; I+ u9 b% d9 j
  6.     GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Fast);//TXD
    - z0 V2 E/ W3 ~4 f+ s% R4 V
  7.     GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT);//RXD
    8 _: G6 U& M: c9 c% n
  8.     USART_DeInit(USART1);       //复位UART1 3 |5 p7 t% f' r. v/ b4 Q" a) E; c
  9.     /*
    # F9 N* w+ u3 g6 S6 h; l9 Y" R
  10.      * 将UART1配置为:
    3 Y/ Y  a! i6 f( S$ p6 c+ J
  11.      * 波特率 = 1152003 v$ ?) R' X3 \. _$ ?
  12.      * 数据位 = 8
    5 a  Z# t  K  @, m( b7 t$ o
  13.      * 1位停止位3 R' E+ t" w: x* L0 I& @
  14.      * 无校验位
    + z! F) D0 _+ N. g; d  p
  15.      * 使能接收和发送( ?( ~3 w( x. ?+ ]& Y
  16.      */+ a* E+ o, d9 ^3 K0 Y& u* k7 N
  17.     USART_Init(USART1, (u32)115200, USART_WordLength_8b, USART_StopBits_1, : z" n3 d) l) P$ ^4 G
  18.                 USART_Parity_No, USART_Mode_Tx|USART_Mode_Rx);
    4 N9 U  F* c9 O  V7 q: D8 Z, i9 _
  19.     USART_ClearITPendingBit(USART1, USART_IT_RXNE);% V* y( S0 V; c1 X. k
  20.     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断0 j1 g5 o9 h( |/ }, L
  21.     //USART_ITConfig(USART1, USART_IT_TC, ENABLE);//开启接收中断
    ' A6 H& r7 X( W, ]$ r$ p
  22.     USART_Cmd(USART1, ENABLE);  //使能UART2# g; D  N5 e( K8 S
  23. }$ E4 P0 ^! j/ G0 u# K
  24. : l5 V  h5 ]1 G" k/ x$ [
  25. /*******************************************************************************
    . `9 I, m- g2 A
  26. * 名称: UART1_SendByte5 _7 v! w; E# I2 K3 S
  27. * 功能: UART1发送一个字节
    ' n* H3 T: c# R4 j& ~
  28. * 形参: data -> 要发送的字节0 v- e+ a: N" G$ S0 b6 d
  29. * 返回: 无. I) S; P+ f8 p6 H- v, x
  30. * 说明: 无
    ( B  p; o8 o! [: k/ n1 V0 @2 v
  31. ******************************************************************************/
    ! N9 q5 v5 q$ s: j9 \2 n- M% d
  32. void UART1_SendByte(u8 data); Y" p* d7 N( l% R: P8 W, p# I
  33. {2 L% }' ~: p: c( ?' G7 Z% U
  34.     USART_SendData8(USART1, data);1 T5 Y+ F0 Y/ D3 Y# g4 x' |
  35.     /* 等待传输结束 */# Z* H8 a* Z3 i9 S1 F# ?3 {; S
  36.     while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
    2 t8 ^( t' s/ N; F
  37. }& ~  Q3 w+ O3 i) E1 Q

  38. " L! L: E4 C1 g3 z) [
  39. /*******************************************************************************1 a% u8 R% T2 _9 A
  40. * 名称: UART1_SendStr
    6 n2 b3 Y7 d- y9 [6 }, ^$ p% |
  41. * 功能: UART1发送len个字符
    $ u2 g  F$ p3 C3 F2 K0 c- b& |
  42. * 形参: data -> 指向要发送的字符串( X. t# }8 V& g/ M, D, L. K
  43. *       len -> 要发送的字节数  t5 l' K! _$ |/ H1 f
  44. * 返回: 无
    % D2 ?* O/ E; d; D
  45. * 说明: 无
    1 U& {/ Z  ^! U2 e, Z$ p
  46. ******************************************************************************/
    5 [2 [) W8 H; @& S. N1 K+ v5 O9 q
  47. void UART1_SendStr(u8 *str)
    . I, W/ ?9 _& D8 |. G) ^: t  G
  48. {
    , }9 V, \3 r! C! e8 |7 Z
  49.     while(*str != '\0')" t6 t, `  I& Y5 C' r  _2 i& E
  50.     {2 J' p" d1 M  n$ r1 d
  51.         UART1_SendByte(*str++); /* 循环调用发送一个字符函数 */& A8 t1 o0 h7 X& H
  52.     }   
    - a/ J& g& J9 z) O2 M
  53. }& C' _, m. V! I3 I/ o
  54. ( e3 B* @' o' ^1 I# `0 a2 J/ E
  55. /*******************************************************************************
    # K; N4 o% N" r! C  A( }- x, @
  56. * 名称: UART2_ReceiveByte
    - G5 |( P, O* A! b* ~$ W5 P
  57. * 功能: UART2接收一个字符4 m& d: d: }* i9 n* h' c0 B
  58. * 形参: 无
    4 A$ h4 x( m% m6 L% R8 `; |
  59. * 返回: 接收到的字符
    8 f7 P& Z5 w: d" M) C  W( w; S; s0 }5 b
  60. * 说明: 无
    7 \" i% q# u* g
  61. ******************************************************************************/
    0 }& N7 h* ?7 }3 _6 t
  62. u8 UART1_ReceiveByte(void)
    - N: i7 \0 V# ?5 A* r5 `! a
  63. {% Q: l  P( K6 r& S
  64.     u8 UART1_RX_BUF;
    - }# O, G* c( f
  65.      
    9 ]' S6 s) s( f
  66.     /* 等待接收完成 *// k, {9 M# S. W7 [
  67.     while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
    4 x8 ~0 T- F" |- Z% I7 ~7 ~* U4 I
  68.      
      G# p4 c  F% E+ P
  69.     UART1_RX_BUF = USART_ReceiveData8(USART1);% h) I3 J1 k' l) ^+ L$ Q2 @' ^. d
  70.      . g+ q) ], M6 f4 n# v) [
  71.     return  UART1_RX_BUF;
    5 G, @8 y  ?  V
  72. }
    . _. y$ C; ~9 I
  73. 7 @4 O7 O* ]5 z* }4 a: ^7 n4 P3 H4 B# V
  74. /******************************************************************************** g8 L' t7 w5 Z% M  d9 {" @
  75. * 名称: fputc, F& I( O& d) z, m
  76. * 功能: 重定向c库函数printf到UART19 u; O/ i5 y8 I
  77. * 形参: 无" W6 W- x+ H8 X( `2 ^, s
  78. * 返回: 要打印的字符
    ; k/ h- M3 u5 a4 J
  79. * 说明: 由printf调用 & ?: J! q: u1 n
  80. ******************************************************************************/
    : }' P. a# i" I+ \
  81. #ifdef _IAR_7 h! _- o  p2 i9 c
  82. int fputc(int ch, FILE *f)0 J9 \0 N3 z- z7 l! i
  83. {  
    ; c: X4 a5 i. O5 G; I
  84.     /* 将Printf内容发往串口 */1 X& u9 D* f$ M( ?1 E  p
  85.         UART1_SendByte(ch);4 f  u, I" e6 ~- X4 t: _
  86.      $ d6 }, I# O3 F9 w8 G6 P
  87.     return (ch);  \3 N/ L. ^  X# m# s4 S
  88. }
    ) u8 D6 P$ z! D  w) k% e6 D) J
  89. #else8 r% w+ S) P/ m# C% P- v0 T
  90. PUTCHAR_PROTOTYPE" a% n* t2 V) I* B* P1 Z
  91. {
    - M+ v, f$ C  T+ |
  92.    /* Write a character to the UART1 */7 Q+ I  O, Z( g4 }  A
  93.     UART1_SendByte(c);
    ( S: \! f& a& L5 Q* u; g% ?
  94.     return (c);
    + f' S3 U0 Q3 L
  95. }5 V) D! u& H/ J7 J6 J" y
  96. #endif0 C7 P8 ~9 C8 {* ^3 k" w& k& {" x
  97. 1 H7 |. {1 P, v) Q# T6 }2 s
  98. GETCHAR_PROTOTYPE
    : p6 k3 U9 }3 \2 X2 F
  99. {
    8 O. ~& i0 s5 T, T) g. g6 g4 F
  100. #ifdef _COSMIC_. D- l, B9 [% S1 Q
  101.    char c = 0;
    $ y. m: [3 p& H& E( ]
  102. #else
    $ E# p4 L( y& Q, G4 }! H
  103.    int c = 0;! R" n& G1 ~& K# n( j
  104. #endif
    $ l; E3 [$ D* {, x) A1 a
  105.    /* Loop until the Read data register flag is SET */: m& i' q: B& I4 e  v1 Q
  106.    while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);+ j, {7 P$ B- l1 p
  107.    c = USART_ReceiveData8(USART1);5 j, J- o2 s: s
  108.    return (c);
    : c. V4 {9 U1 Z& v
  109. }& P/ I, L  g+ k/ }& J9 [9 g
  110. / {( v( J& X  D. L# ~7 U
  111. /********************************************************3 z, u9 }; d  q0 G5 {0 j+ V! s
  112. * 函数名:itoa$ {$ t  F6 O$ I" n
  113. * 描述  :将整形数据转换成字符串
    ( m1 a, ^& D# r' z# y" z+ f
  114. * 输入  :-radix =10 表示10进制,其他结果为0, z9 A5 w; Q4 r, K
  115. *         -value 要转换的整形数
    3 F) `$ \. \8 A
  116. *         -buf 转换后的字符串; G2 f. v5 _1 N2 Q& w4 V8 X2 q
  117. *         -radix = 100 @! a8 J' Z4 ]! j3 x$ s- d
  118. * 输出  :无
    5 N) e& H9 i# T' ~6 g# G
  119. * 返回  :无
    - j. _' S9 W0 U% H5 S
  120. * 调用  :被USART1_printf()调用
    - ^3 d: z6 t- O' O
  121. *******************************************************/) q1 {4 C4 }1 z6 u, V
  122. static char *itoa(int value, char *string, int radix)0 }4 }7 B+ Z2 S+ k
  123. {
    $ x% G$ {4 e, d3 g; e
  124.     int     i, d;
    2 t: J& j& J! p' ~" C7 ^+ B6 @3 P
  125.     int     flag = 0;# q8 |) o( O1 o% C' b6 K
  126.     char    *ptr = string;4 d  O1 I9 A" U& }6 N) R
  127. . ~  B& e2 N8 v
  128.     /* This implementation only works for decimal numbers. */
    . c( F2 l. T7 @" C$ U+ R6 G
  129.     if (radix != 10)8 b' J* [8 \  G4 @6 f
  130.     {
    % O% v- A. n: _' m
  131.         *ptr = 0;3 r6 u1 H$ G$ q8 D3 h1 i. ?
  132.         return string;
    9 R2 v: B0 B/ }- n
  133.     }
    6 I' q+ S) N- d) t9 T$ ]# D
  134. / c7 N: T$ ]2 b% n' F" r# `
  135.     if (!value)4 O$ f' W6 l# Q" ?+ T
  136.     {3 h3 H1 O' c" T6 i
  137.         *ptr++ = 0x30;
    9 q+ \: C$ s  M" F; b
  138.         *ptr = 0;
    2 `: ^' }9 L( m' Z
  139.         return string;
    - P. M2 ?+ |+ T
  140.     }/ N$ t8 L7 M2 `- Y/ e; a) i, \

  141. 4 G5 t  \: F) Y& Y$ n" x
  142.     /* if this is a negative value insert the minus sign. */
    ; i' V3 q& W" l4 y' l
  143.     if (value < 0)! Q/ j9 }: x( [5 K
  144.     {- q" M: J9 o/ @) x' S
  145.         *ptr++ = '-';" B' Q$ k3 A% C6 b3 [% d8 p3 f
  146.         /* Make the value positive. */( d" u, \! ~6 K' \( J
  147.         value *= -1;% W, o8 n4 _, j6 z
  148.     }0 }1 d& x( a; |: A% W, @' `
  149. 2 k4 R6 A' \9 j0 N, V" q/ R7 b! S9 X
  150.     for (i = 10000; i > 0; i /= 10)1 P  a+ C8 n5 c: m* ?  @1 U
  151.     {4 g: s( ?( U! ~2 }( ?, Z. g6 ?
  152.         d = value / i;
    / G0 o1 ~1 v0 z

  153. ( ~5 @7 P& G, v* z$ a
  154.         if (d || flag)
      Z; R! E7 s7 J! y. @
  155.         {
    " M: x7 A2 R- c* M7 M. x% n: C, l1 b6 k
  156.             *ptr++ = (char)(d + 0x30);
    4 V' m0 k, L) ~7 J
  157.             value -= (d * i);+ r" Z6 _- J1 n$ h
  158.             flag = 1;; R, i0 ^& e- Q, }0 h
  159.         }
    - G8 {( j* \  w# h* S' n
  160.     }+ a. L" y7 M5 _  W; k9 z

  161. . r) v& }% @. E2 m5 ~
  162.     /* Null terminate the string. */
    6 y( q% R7 G" J0 A
  163.     *ptr = 0;
    ' L0 m0 a: d# {5 y8 }) U4 S

  164. 1 L  |$ O/ R' T) {& h2 _
  165.     return string;
    : Z: T6 x$ g0 w6 o
  166. 9 k' k9 d- ^# {! r( J% x
  167. } /* NCL_Itoa */! o# S, d, y; ?' d

  168. " q+ M7 E  U( V3 ^& z
  169. /************************************************************************
    , r$ c, O4 O  _( ^% |  C
  170. * 函数名:UART1_printf7 q& N- U7 C; m$ g2 R6 f
  171. * 描述  :格式化输出,类似于C库中的printf,但这里没有用到C库9 u5 b: v* t7 C7 t. b
  172. * 输入  :-UARTx 串口通道,这里只用到了串口1,即UART12 U3 \4 M- ]4 `; c) d2 u
  173. *           -Data   要发送到串口的内容的指针" S& s6 Q+ z6 k* k
  174. *             -...    其他参数
    ' w1 y" v# n' A! i! F: q
  175. * 输出  :无
    0 r% [2 S1 p1 k4 t
  176. * 返回  :无
    2 @' U# [1 w( |" L+ I
  177. * 调用  :外部调用3 @3 q) t) W7 C
  178. *         典型应用  UART1_printf( "\r\n this is a demo \r\n" );8 r# Q& X2 \8 V# ^  [' B: ]: K
  179. *                   UART1_printf(  "\r\n %d \r\n", i );6 P/ N9 k, t7 h
  180. *                   UART1_printf(  "\r\n %s \r\n", j );
    2 D& K+ L' u  v5 e( m
  181. ***************************************************************************/: y- l! ?/ I, p3 J5 T
  182. void UART1_printf(uint8_t *Data,...)8 {, R/ `. p( {. i1 g8 x
  183. {
    + i- ~: T. m( d/ J$ e. R% P
  184.     const char *s;3 }3 T+ J# z1 A
  185.     int d;   
    5 U& ^& o1 C1 U, N8 i  Q
  186.     char buf[16];: v2 ^2 b' g8 ]3 J4 b) W# B
  187.     va_list ap;
    ' p% {: C+ E4 G/ h% Y
  188.     va_start(ap, Data);3 d. p4 ~' H9 J, v
  189.      . g  |3 G7 f) K3 ?
  190.     while ( *Data != 0)     // 判断是否到达字符串结束符( B; V& W  \: Z  N0 h: W
  191.     {                                         # |4 y2 j8 h4 w3 ]& C# k7 T1 W8 n
  192.         if ( *Data == 0x5c )  //'\'
    + H. o# l% l* c2 f# Z2 q) r
  193.         {                                    
    5 C2 a: Z1 Y' t' l5 m$ n( a0 h
  194.             switch ( *++Data )2 Q! s$ s5 [' @  o& Q! q! P, v2 e/ A
  195.             {
    ' ?$ r/ f$ _9 |9 S; E" v. O
  196.                 case 'r':                                     //回车符
    1 |6 n# D& V1 q/ L. G
  197.                     USART_SendData8(USART1, 0x0d);: W4 h* n+ r6 \! k' [* v
  198.                     Data ++;
    6 _" C3 [4 ]7 S5 A  L; h' V; F9 ?0 v
  199.                 break;
    - }' J" a8 Z/ m9 s$ H6 b" L  t
  200.      & W' n9 v$ k7 K2 O, N, m3 y% B; I4 @
  201.                 case 'n':                                     //换行符
    " F" q( T, T1 [' ?
  202.                     USART_SendData8(USART1, 0x0a);  
    & W! V# f& r8 |+ ?& P
  203.                     Data ++;; ^: ]2 A) ?$ ?! g0 ]' |* |
  204.                 break;: t6 g: b% o2 E/ z' M
  205.      
    2 f) x* w; R% g; U
  206.                 default:
    . W' Q, y2 C: @2 [2 E2 a: V* H0 K5 b
  207.                     Data ++;
    ( l% P+ a; ^; \5 L3 {
  208.                 break;( ]4 T+ L0 Q4 [4 J( B8 ]; t  j' ^
  209.             }            
    7 H+ w6 q9 s+ u' W9 |- i+ n
  210.         }
    ' w* z: W* Y5 f: G
  211.         else if ( *Data == '%')
    7 S; K. O/ O  _' y5 h
  212.         {                   //
    * U6 H, H4 [# P4 l  l' k
  213.             switch ( *++Data )
      l5 }9 g3 b3 O5 i. l
  214.             {               : j: r4 Y# _/ G% x8 ~7 v- f
  215.                 case 's':                       //字符串7 U. V" A1 L7 w5 v+ K- P, C! f
  216.                 s = va_arg(ap, const char *);( j: }( t* F' D! b1 t9 X/ k
  217.                 for ( ; *s; s++) ) k* c+ K' e& W" A
  218.                 {9 l. |) z1 w8 e# m5 z' i. e
  219.                     USART_SendData8(USART1, *s);! H% O& |+ }  U( h
  220.                     while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);( x5 K8 b: o/ c: r) g# w
  221.                 }4 ~0 q4 @/ t# Z, d4 N! Q
  222.                 Data++;! d) n. v) U4 L* }% w& b
  223.                 break;  
    ! |; P6 ^+ K4 g* Y& w  l7 J% ]
  224.                 case 'd':   //十进制+ D# F7 O; s& N2 B. w
  225.                     d = va_arg(ap, int);
    & C  {* q- O% {$ |3 ^& t# f
  226.                     itoa(d, buf, 10);' K+ B3 _  q6 u4 n$ \: A# ^
  227.                 for (s = buf; *s; s++) 9 n6 O% s. c1 Q% B! T8 J& U- A3 N6 x
  228.                 {
    4 Y% I% @' I9 A) n8 u
  229.                     USART_SendData8(USART1, *s);6 x* r% B4 @  r8 d7 l
  230.                     while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    5 a2 V8 F' S* ^! U* ?
  231.                 }
    5 |, ~4 Q4 K5 c- G- x1 {& A( X
  232.                 Data++;* H$ g/ n) {/ \* j
  233.                 break;         
    ' |; U) T8 x/ _* \5 i
  234.                 default: Data++;
    ) S8 \. G; H& v4 [& h6 |( J
  235.                 break;
    4 ]6 s' g3 Q/ C, P
  236.             }        
    ' J' K. {! D, N1 q0 a% T' H
  237.         } /* end of else if */
    5 n) w2 L+ ~6 |/ [: s9 B
  238.         else USART_SendData8(USART1, *Data++);5 d. T- x8 @, _% g
  239.         while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);) T- G! U6 W" l
  240.     }+ ]! q$ ]. t0 o4 {  m1 F5 L5 u  ~$ q
  241. }
复制代码
附上工程文件  O# E$ G+ H0 \5 I: c  S

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

  H0 g7 N! h7 p7 `6 x' H支持!
youngyyzz 回答时间:2016-10-19 22:35:16
主程序第一句就打开中断,不好。

所属标签

相似技术帖

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