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

【经验分享】在STM32F103上实现串口功能及消息邮箱-2

[复制链接]
STMCU-管管 发布时间:2021-5-21 11:31
如果您是完全按照《如何将移植ucos到STM32F103开发板上-1》来新建的工程的话,那很遗憾,你要重新建立一个工程,因为,在那篇文章的步骤1中,我们选中了GPIO,但是没有选中USART,所以要新建一个工程,只是也要把USART选中! {7 G! W: C$ i
1 o. D0 J. M& K& l0 w: P

& e5 a* K; u: V) z0 o% W) dBSP.c文件中增加对串口的初始化及中断的初始化:
1 d6 {6 g3 }+ K! m2 _8 S% J  b

  1. 4 N6 M+ L3 O3 S9 |- Z6 Y
  2. void NVIC_Configuration(void)+ ?- Q' @: C9 Z3 s8 l2 g
  3. {
    / y4 L+ @; [: h, K/ H: a) ^
  4.   //EXTI_InitTypeDef EXTI_InitStructure;
    + \( n, F7 B2 R
  5.   NVIC_InitTypeDef NVIC_InitStructure;8 }9 F% u1 b! x9 y% x, R
  6.   
    ) z3 l2 `: @( s# O4 N& `( h
  7.   /* Configure the NVIC Preemption Priority Bits */  ' J0 [  ?* a% ]
  8.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);6 h( R$ p. i: L
  9. ; K; X8 r$ D& i* G4 q$ v. V
  10.   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;, B) W: J, T2 D8 h0 b
  11.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    $ O3 y! l; I* O$ \, c8 p
  12.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/ O& F  B; w/ g8 X. z
  13.   NVIC_Init(&NVIC_InitStructure);8 f2 u: t) [1 j0 u1 V
  14. }+ J( I5 B. i/ K) x( l" L: J* n
  15. * d6 w7 V. h% n, p! ]/ g& v& ?
  16. void USART_Config(USART_TypeDef* USARTx,u32 baud){
    8 W' j" W* C! f: h' F
  17.   USART_InitTypeDef USART_InitStructure;
    $ \0 u6 g+ V4 r/ r- d$ d
  18.   GPIO_InitTypeDef GPIO_InitStructure;
    $ ?& T  R" g! F- |  X, I& }$ q% E' v

  19.   N, j5 {6 P" C9 C
  20.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    4 s- g5 j! h( T9 e- o; M
  21.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);        3 p! G$ f& J7 I) e( U* ~: X
  22.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    + @0 N' G* X# x" p
  23.   
    0 g/ I* o4 U1 D; J
  24.   //usart_init----------------------------------------------------0 A6 J# O; \8 P  P6 u
  25.   /* Configure USART1 Rx (PA.10) as input floating *// I; I4 s2 V; a  B5 O( T
  26.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
      U0 I- w! y1 `- F2 _* w; b
  27.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;2 `% n5 X) E5 U6 v: p: |9 \  f$ j
  28.   GPIO_Init(GPIOA, &GPIO_InitStructure);                                         
    # D3 K: V, \( h  w! U! y
  29.   
    0 X" e4 |) n# r8 J- W5 @, P
  30.   /* Configure USART1 Tx (PA.09) as alternate function push-pull *// Z( a, Q6 @, ]$ X' N; i" g/ F- ^
  31.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;% o9 I% ?* K/ f$ p
  32.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ; W" ]# @. H" B- ]" r
  33.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;6 v; \& V6 k, X* w9 T; [* b! \) Y
  34.   GPIO_Init(GPIOA, &GPIO_InitStructure);
    9 G. f3 Y9 p9 T" [
  35.   / {9 s& P. e: ]1 }) j* Y: f
  36.   
    ) h: w3 i/ j* |/ [& k" \  H6 H$ V
  37.   USART_InitStructure.USART_BaudRate =baud;2 E7 S$ e# d8 O8 B* M
  38.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;3 p- Y. T6 h$ `
  39.   USART_InitStructure.USART_StopBits = USART_StopBits_1;4 J; H% V3 I# d0 }- c( e
  40.   USART_InitStructure.USART_Parity = USART_Parity_No;( H1 n1 r4 R5 w( K% D
  41.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    2 J5 ], `+ h1 V( y% i
  42.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
      k/ E5 [: m. b6 G$ A8 g
  43.   Y; }; S4 }6 Y  H# F
  44.   /* Configure USART1 */
    ) M4 ]( j) S1 R- f# k1 z
  45.   USART_Init(USARTx, &USART_InitStructure);
    " d* i8 h6 C+ F# @( c! V
  46. ( [% G* O6 j6 X* |
  47.   /* Enable USART1 Receive and Transmit interrupts */
    6 z# B  r& D% ]# r
  48.   USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);
    : B1 M: W" y2 }- T" @7 c" o
  49.   //USART_ITConfig(USARTx, USART_IT_TXE, ENABLE);
    0 X( d& n$ Q6 o0 g/ H: P

  50. . P& }6 c$ o" q- K
  51.   
    % o. K4 `) l: C3 c
  52.   /* Enable the USART1 */
    4 ~. _/ Q6 t. f4 M: M
  53.   USART_Cmd(USARTx, ENABLE);       
    4 L& L/ s; K5 v0 |1 r6 R+ ]

  54.   q: o3 J& j% ]+ l/ E, r) t
  55.   //USART_ClearFlag(USARTx, USART_FLAG_TXE);
    ; z# ~- M8 p+ p
  56. }: ~$ d6 |0 e7 C" U, C: Y
  57. ; E; R0 K1 {$ }* M5 J2 ~- r; a
  58. void BSP_Init(void)
    3 r7 K7 p5 A  M2 T6 ^% ]4 P
  59. {
    4 C% ]  f9 b" Q
  60.   /* System Clocks Configuration --72M*/1 G2 O( k9 `8 z7 e/ J8 A# [: z7 C9 S
  61.   RCC_Configuration();   
    / K0 P  O, V4 z8 v: B) s$ U  _
  62.   GPIO_Configuration();
    1 z' r. L' M6 c2 R  G

  63. * O. n1 V1 d9 @: Y% |
  64.   NVIC_Configuration();
    # Z9 [, e) w  K/ B
  65.   USART_Config(USART1,115200);
    % ~, C1 g  \5 Q6 o! I+ s5 Q
  66. }
    / N, p6 k# {5 `
复制代码
APP目录下新建USART.c文件,添加如下代码:
# `" z: u/ l# }& }- q) x& N. V9 o2 ]
  1. #include <usart.h>0 z/ y+ J8 K  p$ Q8 u4 R) x' Q

  2. 0 m- ]6 s, @' s
  3. void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...){
    0 Q6 u$ L, o$ ~! D
  4.         const char *s;
    * Y; ]; L/ _; s' \
  5.         int d;
      R" U6 w2 I( u$ v9 i; P
  6. , N9 }! e# |$ j" K$ k
  7.         char buf[16];/ L% L9 L3 ]! m2 s& \' ?
  8.         va_list ap;
    : c& \; A1 ^, M) B
  9.         va_start(ap, Data);
    * c0 S7 p1 L% A4 W/ t+ k7 f" h
  10. : _* ~/ g2 Z" [( ]- n1 F
  11.         while(*Data!=0){
    4 h: \1 }4 _1 E7 d* K9 E4 P
  12.                 if(*Data==0x5c){
    3 f/ ~0 T9 N/ a7 u( V) p7 @
  13.                         switch (*++Data){
    ) Y$ S+ }% f4 J
  14.                                 case 'r':
    7 M" F/ w7 z, z
  15.                                         USART_SendData(USARTx, 0x0d);
    * @7 S) ~7 R! d2 Y8 z, n

  16. ' Q6 h0 y! s2 v) i  n5 x
  17.                                         Data++;
    . s5 O, W% ~6 |# l  f* a. C0 f
  18.                                         break;
    2 F% n5 @9 o, t2 K& M# f
  19.                                 case 'n':$ ^2 _8 J" p8 e! t9 w. r
  20.                                         USART_SendData(USARTx, 0x0a);       
    8 b9 t; k% s) z! Y: @# O
  21.                                         Data++;
      m2 Q/ F% h1 E  ?/ j
  22.                                         break;
    / E8 d. P3 {/ Z$ `. Y
  23. % Q0 ~- Y7 }3 O4 [
  24.                                 default:+ @1 r1 i" [0 N- L% V! e( ?
  25.                                         Data++;2 O: ?% T  P* C8 L- A( @  H
  26.                                         break;
    * U" ?- I3 B9 L* d$ n# J$ s5 r
  27.                         }
    ; E8 J7 X* C+ \. k+ D) w4 W
  28.                 }else if(*Data=='%'){+ ]9 H! Z7 l0 p/ y: y9 u
  29.                         switch (*++Data){0 {) B5 ?, O) y+ d0 _
  30.                                 case 's':/ N* l+ ?1 |5 z0 ^6 r
  31.                                         s = va_arg(ap, const char *);$ R7 ~/ n) r3 I# e6 \
  32.                                         for ( ; *s; s++) {
    : z, g8 F8 O9 z: X
  33.                                                 USART_SendData(USARTx,*s);/ @3 a* \' x- U6 m3 D
  34.                                                 while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);1 s& w, p3 e% e+ L1 s
  35.                                         }
      X8 [; ]: u* F/ p. v1 _- a
  36.                                         Data++;
    $ i  B* e0 b4 L% V: o
  37.                                         break;  b: f8 [& J/ s+ e% \$ m) l( P: y6 F2 Y
  38.                                 case 'd':
    . H% I5 L+ E! B
  39.                                         d = va_arg(ap, int);1 K5 |2 S/ \! z$ _1 C  X. }
  40.                                         itoa(d, buf, 10);) @) M6 |& }+ o/ d" [
  41.                                         for (s = buf; *s; s++) {
    + \! j3 Z! W7 f5 n  m6 ~+ f1 b* k: b
  42.                                                 USART_SendData(USARTx,*s);/ V) |+ R. F; c
  43.                                                 while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);0 ?4 S  S( U2 N& ~+ _
  44.                                         }; B, K# E" h9 o3 I' {
  45.                                         Data++;& n, [7 i- I/ A/ v0 }
  46.                                         break;
    2 S: x$ y  [) ^: V. w3 j. \
  47.                                 default:
    , m5 Y$ X8 x' ?) z# s6 [* z
  48.                                         Data++;1 x, v3 f+ P& q" Q/ l6 @) p- Y, o
  49.                                         break;
    1 q- i, w7 L# G5 x
  50.                         }                 $ K% L. L( T: h# {  D$ r, F4 H/ ]8 R
  51.                 }else{0 E  y8 z7 Q( ?" R! A' c- F
  52.                         USART_SendData(USARTx, *Data++);/ K! D) h5 v0 u# P- z% z8 |  U  B
  53.                 }7 j. p4 {2 L4 X. y
  54.                 while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
    0 B1 P/ v* \' D! C5 F0 N
  55.         }
      ~# I  d: y3 k$ A4 p9 B9 c
  56. }
    ! `# q# e0 {/ J6 E1 @3 A. T) k
  57. 3 B$ t6 v5 ?% x; v6 @8 D$ R
  58. char *itoa(int value, char *string, int radix)9 L  o- l) ^6 `* M
  59. {" _5 L2 [  Z8 O1 {8 _! j- ~
  60.         int     i, d;
    % m' i+ G! y' i4 x4 G
  61.         int     flag = 0;: \% t. M1 E8 |2 R2 v2 E4 H. c9 o' @9 ]
  62.         char    *ptr = string;8 l  F6 s9 e- f- M: K

  63. 1 _' C1 }6 {& s3 N; Y1 i9 v% r
  64.         /* This implementation only works for decimal numbers. */7 u3 G. w  ?* `  U  H9 s
  65.         if (radix != 10)( s& x+ Z) g1 g. Y$ o: d# P) B
  66.         {
    # l# L  g* w5 I! v0 q3 B
  67.                 *ptr = 0;
    6 F0 u8 z! K; _
  68.                 return string;
    9 S/ K+ r" x5 s: E
  69.         }
    2 h' q  ]+ o! ?( I( Q% O% V8 G
  70. ' s: k2 Q" C- l6 t9 ~" w% s
  71.         if (!value)& o0 c; Q8 C$ W, h" t& O: V8 X
  72.         {; U9 P) t0 g/ B7 F. W' Z! T4 D
  73.                 *ptr++ = 0x30;
    9 P: h, o: ?0 U. B. p4 j
  74.                 *ptr = 0;- {/ B- T0 b/ r3 O% z" Z
  75.                 return string;( B0 v9 Y( L0 T; c4 G5 |& P! _1 V
  76.         }$ B( X3 O5 ~1 y1 r$ v  J  r

  77. ' q9 c/ A3 t6 ^3 {6 H) v6 o
  78.         /* if this is a negative value insert the minus sign. */: F( T6 n& Y4 W$ H5 C
  79.         if (value < 0)
    . q7 p- y  c$ d1 u+ y/ \/ _
  80.         {# [9 h! j7 H7 s1 k" U& `3 H
  81.                 *ptr++ = '-';
    0 s& W% X7 I2 F1 }$ p& g( ]. `$ a! R
  82.                 /* Make the value positive. */
    . u6 a8 ]% I2 \- a
  83.                 value *= -1;
    - w! z2 N# m) Q$ ?, L! Q, ^6 ^
  84.         }
    - a6 P4 w+ ^8 t2 K; W
  85.         for (i = 10000; i > 0; i /= 10)5 u/ r; _5 o; J" F$ ^6 f6 ]
  86.         {7 C$ ^/ S0 `& X4 j
  87.                 d = value / i;
    $ s9 O4 @. c7 u* D& S+ \$ A" w

  88. 4 t4 ~0 e* D+ I- k  o. K6 R5 t
  89.                 if (d || flag). E2 i9 P+ ^9 X( f2 L
  90.                 {& ~5 Z1 H; F# w- G: T
  91.                         *ptr++ = (char)(d + 0x30);
    9 ^: D  F+ Y9 a8 b6 x: K+ A+ u. p
  92.                         value -= (d * i);
    / _/ F6 ^) z+ f% ?9 c# M3 f7 f
  93.                         flag = 1;7 V9 x: A/ |: I/ d
  94.                 }+ J. u0 h( T% ~+ W1 h3 `
  95.         }2 ?( J$ X3 r" m2 R

  96. ( w) @) v9 P# f4 h- ~
  97.         /* Null terminate the string. */3 ^9 v3 Q. V2 O" }7 l# ]$ m
  98.         *ptr = 0;+ q5 O0 v# J9 ?4 A

  99. / c/ S' i  t  B4 i
  100.         return string;6 w8 }, l& w. _9 A

  101.   }9 L' E7 y' c+ I
  102. } /* NCL_Itoa */- X' y9 e, X, W% I

  103. $ H3 M  H) ^5 h) P1 e3 M! J0 C
  104. int SendChar (int ch)  {                /* Write character to Serial Port     */& H/ b$ m: l* ?
  105.   USART_SendData(USART1, (unsigned char) ch);
    : |$ v8 t  S; w+ R, m
  106.   while (!(USART1->SR & USART_FLAG_TXE));
    , V% b) @" ?7 v/ H3 [! U
  107.         if(ch=='\r')
    9 D% k- Z( _+ A
  108.                 SendChar('\n');$ j# x5 Q+ T: r/ B8 j  `
  109.   return (ch);: z% j# T- J- L" ?' ]
  110. }7 s+ \! [- x6 Q
  111.   g) E0 |* L! s7 B2 X* t3 h. J2 e
复制代码
新建usart.h文件:( l5 V2 A0 b1 @" P* {3 ^
  1. <pre name="code" class="html">#ifndef __USART_H__
    ! W1 @6 A) C% C) @3 D' l/ ]  L7 s
  2. #define __USART_H__
    7 L* b7 C. ]" z* T1 W/ O

  3. : t8 r7 X2 A2 ?; d9 X3 e8 {
  4. #include <includes.h>
    ( {4 w/ R& s) I( @% C

  5. ! q: b9 }  u8 j, b
  6. void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...);
    % W4 m: }% u5 F0 R7 v1 C
  7. char *itoa(int value, char *string, int radix);/ ~8 ]1 M9 x8 C+ I* U9 T/ |
  8. int SendChar (int ch);3 @- y- U# b7 Z. ^/ g% U/ y3 [

  9. - S" \' }$ g5 _" u$ L2 l
  10. #endif* T, }: m. o, I. F% f! U* {, X
复制代码
stm32f10x_it.c文件中添加串口中断处理:
1 {. s7 X" Z: _; U9 L6 @9 ^/ |4 {
  1. void USART1_IRQHandler(void)& `$ l" G7 Y# A$ r" q: v- X
  2. {! l. F) L6 G# ^$ J3 G
  3.         unsigned int i;5 q7 m: l& g  {# ^) e! l' x, D4 |( X
  4.         unsigned char msg[50];
    ( q) ?% U; r* y
  5.         OS_CPU_SR  cpu_sr;
      t; g- ^* }8 I& |3 e
  6. 2 V5 ]0 L0 x0 M' {( E
  7.         OS_ENTER_CRITICAL();: ]" y) R! x; J8 q
  8.         OSIntNesting++;
    - r7 Y4 a, a* E4 O9 k" k

  9. % j/ V; q. ~2 B8 A5 `
  10.         OS_EXIT_CRITICAL();& j; s. U4 J- V5 N/ ]2 G

  11. ; m7 P( x3 P5 X2 a4 a% m
  12.         //OSTimeTick();* o; k. z+ O! W, Z1 Z1 Y6 I
  13. 9 J+ o1 @6 d: d6 Q& X8 ^8 X) u) e
  14.         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    0 q& S  o) z; Q9 t, d3 j
  15.         {        4 n: `$ u) [4 b( W0 k3 k
  16.                 if(RxCounter1>20)
    8 K7 D/ ~% K8 t) d
  17.                         RxCounter1=1;3 q+ x1 c& N3 N6 i$ ^- s
  18. # @' M6 J% y' o  c* L  W
  19.                 // Read one byte from the receive data register $ ?6 D5 j( v8 i
  20.                 msg[RxCounter1++]= USART_ReceiveData(USART1);
    , ~. d5 q2 K6 C3 n+ p) R) c2 g
  21.                 SendChar(msg[RxCounter1-1]);9 n3 |% d5 i6 q0 @) G5 h

  22. / l+ d6 ]( M6 f1 h: H) Y
  23.                 if(msg[RxCounter1-1]=='L')1 F' k* J7 @- S3 G& a
  24.                 {
    # q; o4 l7 j& M' i' @: X7 U
  25.                         msg[0]='L'; RxCounter1=1;
    - e/ k$ J! j$ e2 Z+ M  O' m" S
  26.                 }else if(msg[RxCounter1-1]=='F')
    ( A+ u4 [. a: ?( ]3 `" c
  27.                 {
    8 r3 s7 ~1 h* _% N7 T4 c9 t) \9 y7 K
  28.                         for(i=0; i< RxCounter1; i++){4 F( ^. ~5 l* D; j  [; N
  29.                                 TxBuffer1[i]        =msg[i];
    1 ^- Q  u8 Z) f! P' e, r9 k6 z. w
  30.                         }- C& h3 s* ~5 t7 M
  31.                         TxBuffer1[RxCounter1]=0;: Z+ d8 {! v; l1 ~% k/ r
  32.                         RxCounter1=0;
    1 n- O) q( _' e, {$ l5 T
  33.                         //OSSemPost(Com1_SEM);           
    7 c0 |$ f- ?( s' S- V: |
  34.                         OSMboxPost(Com1_MBOX,(void *)&msg);                            5 C7 B- U# f$ q# p- o! U
  35.                 }- b! |7 S* m4 E: f* f- [
  36.         }% D" ~" s  L2 h% n
  37.         if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)0 b, d/ Z' D5 u% j5 V
  38.         {
    & B! {' _# W& n% r5 e" ~7 \! \
  39.                 USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
    . c3 o6 H$ E$ I
  40.         }       
    9 N0 O' l% n# H
  41.         OSIntExit();
    9 b2 b8 y6 V1 ^4 N& T& ]0 w
  42. }5 m1 b6 r( N& V, v
复制代码
APP.c文件中新建消息邮箱处理函数:
6 b( o7 n0 ~. Z* r0 }

  1. 4 m! @. C8 ]  w  J! Z1 l2 k
  2. static  void Task_Com1(void *p_arg){
    7 H# n  Z$ W3 ?4 o
  3.         INT8U err;          j# u" Q: g5 L" r% M
  4.         unsigned char * msg;
    6 i1 F# @2 c+ ]4 Y% Z7 J( N
  5.         (void)p_arg;                                            
    9 i& u  O7 g9 m& L* A3 i) |5 ]
  6.         while(1){
    * m0 a: {; A' N; h% [: m- U4 `
  7.                 msg=(unsigned char *)OSMboxPend(Com1_MBOX,0,&err);2 x; Q9 w# S/ r# u9 I, `$ @4 Q# _& H- M
  8.                 if(msg[0]=='L'&&msg[1]=='1'){
    ; L. L" o; P! y$ F
  9.                         milsec1=atoi(&msg[3]);
    * k0 u1 e- G6 W* E! i3 e
  10.                         USART_OUT(USART1,"\r\n");
    2 h) Y" t% ~9 p2 a$ G1 c
  11.                         USART_OUT(USART1,"LED1: %d ms delay",milsec1);3 j  d2 Z& ^9 G4 R) E8 @
  12.                         USART_OUT(USART1,"\r\n");$ G. u1 {. ]- f/ n/ g; c* h
  13.                 }else if(msg[0]=='L'&&msg[1]=='2'){  K9 N- X  z5 P& C" X8 h
  14.                         milsec2=atoi(&msg[3]);
    * Z6 D9 y' K0 R
  15.                         USART_OUT(USART1,"\r\n");
    " t* L" y! F! h" b
  16.                         USART_OUT(USART1,"LED2: %d ms delay",milsec2);
    4 V) g# N; F6 m9 Q2 G/ l8 D
  17.                         USART_OUT(USART1,"\r\n");$ X$ u( T# v  I& {
  18.                 }
    ; E- }4 \6 t& L1 P( [
  19.         }
    9 @6 a) k1 }* S0 f3 [' L: Y; |' D
  20. }, ~! y0 D0 U% c( m. t
复制代码
并添加该任务:3 B! R& ]8 `1 c' O+ S; r
  1. OSTaskCreateExt(Task_Com1,(void *)0,(OS_STK *)&Task_Com1Stk[Task_Com1_STK_SIZE-1],/ Z0 Q9 a; N# t8 b: |& o! _
  2.                 Task_Com1_PRIO,Task_Com1_PRIO,(OS_STK *)&Task_Com1Stk[0],
    0 O- A4 D8 a7 Z, t/ Q/ `
  3.                 Task_Com1_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);- P3 }4 L# @1 R3 Q# F, ^9 y) n* F
复制代码
新建一个头文件globals.h:1 L$ s2 S( v$ K, B  Y% u6 T3 K
  1. #ifdef GLOBALS
    : `# `: `( ^& n2 Y
  2. #define EXT
    7 Z0 D2 C8 U4 c/ l6 Y/ b2 {( L
  3. #else* e2 b. s1 N- H. y' N* Y0 ~) |
  4. #define EXT extern   E' B& c3 P# o+ s
  5. #endif8 m6 z$ r4 K; o

  6. 7 Z$ r$ V( M8 f4 j  ?

  7.   g; z$ x/ L8 x( T) H% M
  8. EXT unsigned char TxBuffer1[400];
    7 H3 W- f+ e: H' T% w% X$ \$ W$ L
  9. / s7 \+ k. ?2 w0 A
  10. EXT unsigned char TxBuffer2[];
    $ Q+ {2 v! H$ h9 l: J- M2 o, X) M  N
  11. EXT unsigned char RxBuffer1[400];
    % h; M1 t3 |, r9 y. N. r$ u
  12. EXT unsigned char RxBuffer2[];& x3 s6 ^# s- s, C% C  Q4 X
  13. EXT unsigned char TxCounter1;
    $ k8 I3 T# d" y
  14. EXT unsigned int TxCounter2;: u. r. t. y: r4 Q
  15. EXT volatile unsigned int RxCounter1;
    $ S% z* r- U4 {
  16. EXT volatile unsigned int RxCounter2;
    . H% M0 O% e! J
  17. 7 L$ X. y& V/ R! T, n0 d6 L9 c! w
  18. EXT volatile unsigned char rec_f,tx_flag;# e$ h$ A* j6 e$ p
  19. EXT volatile unsigned long Rec_Len;        % w/ K/ [9 {3 D% K2 x
  20. EXT volatile unsigned  int  milsec1,milsec2,milsec3;
    " i! _* C! y' R% K5 S) U" ~
复制代码
将 globals.h 文件 include 到 APP.c 和 stm32f10x_it.c 中,注意,在APP.c文件 中应该先define GLOBALS,即+ {1 h0 D" g  ]1 m7 Q
  1. #define GLOBALS
    # ?& l7 C) e) S

  2. ' b* t& \1 ~9 _3 g) |
  3. #include <globals.h>
复制代码
APP.c文件中添加全局变量:5 K2 w+ J6 J& v% I  }: N; ~; n
  1. OS_EVENT* Com1_MBOX;
复制代码

, z4 h7 V) {) ?9 q, E2 ?stm32f10x_it.c 中也添加该变量: 7 _7 [8 n" G5 ^8 ]* Z& ~
  1. extern OS_EVENT* Com1_MBOX;
复制代码
6 U9 R; \% u2 t6 R; N/ d0 `

7 ^& O" M! G, {
赞 收藏 评论0 发布时间:2021-5-21 11:31

举报

0个回答

所属标签

相似技术帖

官网相关资源

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