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

【经验分享】基于STM32实现的的短信实时传送位置----GPS+GSM

[复制链接]
STMCU小助手 发布时间:2022-2-3 19:00
总的来说就是实现了一个GPS数据通过串口发送给STM32,
STM32进行解码,
在通过串口把解码提取出的经纬度发送给GSM,
GSM根据给定的手机号发短信过去。

8 Y; ?$ ]  b9 @' m  l) {6 E
main函数里的最后一个while循环是每隔5s发一个位置出去
延时函数写在sim900a.c里,可以自行调节时间间隔。
就是这么任性。
" x( s. f: n6 m1 k4 ?& W
main.c
  1. /*
    8 W" ~% k  L+ @( T7 a) o
  2.   ******************************************************************************3 s5 N9 K5 `9 k" Q7 N
  3.   * @attention
    # n  w& ]+ g% X( w! Z2 n
  4.   *: m* {' {- z0 t9 `
  5.   * 实验平台:野火 ISO-STM32 开发板" K% a9 r; v' K, r, g/ \0 m- T

  6. * V( ~7 U6 S# |6 p5 ?
  7.   ******************************************************************************
    7 J: s; _1 b; O/ s& y( _
  8.     */
    " V9 X- s5 k7 B5 X1 l$ l
  9. #include "stm32f10x.h"/ c$ R8 ^6 n- w7 T4 Q
  10. #include "bsp_usart1.h"  I  k3 u* A! b: Y% F1 a: h
  11. #include "gps_config.h"
    6 A# C0 ~* S0 W5 J6 ^' f
  12. #include <string.h>
    ; b) f: ]0 P! ?# ]' ]
  13. #include "gsm.h"
    / n3 f& O' r% ]6 a4 d$ d: V
  14. #include <stdio.h>
    $ T% H( H6 R' k4 L
  15. " L. O* K8 x5 s& l
  16.         
    5 y8 M5 `6 x% K1 `) E

  17. 8 \7 t5 J) ]# b/ e9 N: z5 R9 I
  18. extern void nmea_decode_test(void);
    : N; I% @' J" C1 K
  19. 0 q0 o% P& t7 B$ L" L# S7 K
  20. /*
    % S1 f$ s1 U* Q. y" j. B6 i
  21. * 测试GPS模块功能5 s2 B3 p  d% E; `; e$ B6 W
  22. *
    $ h' n  K2 B# J3 `7 @
  23. */
    4 V" M7 M8 L! Q! n& k

  24. 7 L6 c; @) q6 X
  25. ' R" Z" J+ e6 X7 O; |- `
  26. double  zaishichua;
    9 e5 H: V+ P. D9 b, Y
  27. double  zaishichub;4 ^9 I  M1 D0 ], M& W' C
  28. int main(void)
    + z  p6 o) Z- Z
  29. {
    9 ^+ Z) a4 e- g
  30.     char zaiship1[14];6 [. ~& R. i3 b6 b. q. L& c( u' J2 H
  31.     char zaiship2[14];( @  H7 s4 H3 P/ K6 a/ s" P
  32.     /* 配置USART1 用于向电脑printf调试信息*/" W' c! S* l. B. W9 Q
  33.    USART1_Config();                          
    " t, b1 S" m! A1 m; `0 F
  34.     /* 初始化GPS模块使用的接口 */
    9 G# H3 G* J6 Q# w; r
  35.     GPS_Config();3 Z) x, M, {: a8 V5 ^  `% z
  36.     printf("\r\nGPS模块测试例程\r\n");
    4 R- d2 C1 t: z+ h# {/ U
  37. 5 Q1 |$ x- |0 v: z4 c
  38.     printf("\r\nGPS模块测试例程\r\n");      /////////////////////////////////" y4 M% Z" p1 g
  39.          while(1)
    0 m# X! V' s) G" {( |# P
  40.          {/* GPS解码测试 */8 Y1 q3 N+ ?8 e& r- Q6 z1 l
  41.     nmea_decode_test();+ \( ~% N% e- f- e! E
  42.     printf("\r\n纬度:%f,经度%f\r\n",zaishichua,zaishichub);
    ! X% ^' O2 R( i( K% U
  43.      printf("\r\n纬度:%f,经度%f\r\n",zaishichua,zaishichub);+ F! v4 f" w# Z- |
  44.    9 A% R. o8 ~2 r1 L7 ^
  45. , x4 q. L; o1 v9 K
  46.       sprintf(zaiship1,"%013.6f",zaishichua);* L; E9 M9 o' u/ p
  47.       sprintf(zaiship2,"%013.6f",zaishichub);  h8 r% N7 i* P- g* G
  48.        gsm(zaiship1,zaiship2);/ f4 k% T2 L, T2 ]7 N; L# E
  49.          }
    - z) E. o+ P+ l

  50. % z! B1 ^6 E' Y$ w4 F& C
  51.   9 e5 Z) k8 X. v
  52.   
      I% m0 _/ ]3 L: F7 N3 U% n% F4 M
  53. }
复制代码
: I0 m! Y. y5 [- j) W
bsp_usart1.c
  1. /**$ i. E, `8 R7 @) o2 F6 Q
  2.   ******************************************************************************
    4 O$ E) p9 W" }( I
  3.   * @file    bsp_usart1.c
    & t! s# r9 |2 b' f7 A
  4.   * @author  fire
    : ?& b8 J3 N6 a- F/ U2 p$ {6 s4 h  V1 l
  5.   * @version V1.0; u7 i8 N1 j, D1 g* V
  6.   * @date    2013-xx-xx2 C3 j& I' Z$ H# w6 {
  7.   * @brief   重现c库printf函数到usart端口" a# E% w: M* I/ ]3 J
  8.   ******************************************************************************
    ( \# U, j; F' J0 m5 t) B
  9.   * @attention" j5 A; b0 y/ \8 _; g
  10.   *
    ( A6 q  T* f: s1 S# M( f+ T( a
  11.   * 实验平台:野火 iSO STM32 开发板1 ]% ~% G" r- g9 k, S& u0 ~
  12.   *, B2 B; X3 Y0 ~! x7 X
  13.   ******************************************************************************
    / M7 A  B$ S- A" F
  14.   */. A: l1 i- i5 w& M& m! p

  15. - x9 H  N. |: n
  16. #include "bsp_usart1.h": F; S) J  H7 t1 I9 s7 K3 H
  17. 2 P8 D4 c) z6 L

  18. ' j  [" k5 _1 x, d1 a5 m/ \
  19. /**
    / y, J: h! V: J- j) q2 G
  20. * @brief  USART1 GPIO 配置,工作模式配置。115200 8-N-1
    ! W( P2 o% F( ^8 X# }
  21. * @param  无: H: A& n! b+ V3 p
  22. * @retval 无0 f; ?: `* S; E& w0 |# D4 p# h
  23. */# G2 {! w  m/ E# Z
  24. void USART1_Config(void)
    ; s7 ^' D4 d6 {0 c: I, f( ~
  25. {0 `( ?. Y. Y$ u
  26.     GPIO_InitTypeDef GPIO_InitStructure;. L% b) r3 ]; [8 H- q/ e* y/ R
  27.     USART_InitTypeDef USART_InitStructure;: T: k4 v5 |; a" B

  28. 5 v. _- ?: u+ g! p& \: T
  29.     /* config USART1 clock */
    ) Z1 f4 Z1 {) M3 f* [
  30.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
    6 A6 W% R: R! z% o8 M9 U) c

  31.   t7 W0 e: b$ }2 J0 N, ]+ }$ J
  32.     /* USART1 GPIO config */% \) w  G5 B7 f8 M; H
  33.     /* Configure USART1 Tx (PA.09) as alternate function push-pull */
    3 b3 H- z( Z6 d8 x
  34.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;2 d# {" m5 a5 @- h$ y2 A3 N" [. r; T
  35.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;1 v+ \6 a% w* e# h" s, o
  36.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ! d. `; H6 I. q' o
  37.     GPIO_Init(GPIOA, &GPIO_InitStructure);
    ( ^1 O4 h, V. e' \/ C: D$ O" ~- X  ~
  38. ' T# g( R7 F; A( k; m
  39.     /* Configure USART1 Rx (PA.10) as input floating */( a  h" I3 W% X& l: u
  40.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    3 U  ]' r; b( s% e7 t
  41.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;7 D6 Z# g; z: o  f8 o- W
  42.     GPIO_Init(GPIOA, &GPIO_InitStructure);& n$ R; I6 S/ J# ]

  43. 5 D, t3 W/ U' B* Y
  44.     /* USART1 mode config */- J" ~1 Q% u( U3 g
  45.     USART_InitStructure.USART_BaudRate = 115200;
    % x; L0 v* P1 B4 Y. a% K
  46.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;% q! X6 ]: ^; J8 P3 S7 m
  47.     USART_InitStructure.USART_StopBits = USART_StopBits_1;# N" E9 P- X+ I" G# T. E) t
  48.     USART_InitStructure.USART_Parity = USART_Parity_No ;3 t' g' {+ y! F- s
  49.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    8 X- k2 Q7 s  @$ F( k& j+ M! _
  50.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    7 z/ L  t( |% C" D1 `0 B# p! }7 C
  51.     USART_Init(USART1, &USART_InitStructure);" y/ [; M, V6 Q0 }% c. P. l. c* o" ]: ]

  52. : z2 E* l! ?- o
  53.     USART_Cmd(USART1, ENABLE);
    7 V8 F" D3 D) J1 W& O" f
  54. }9 f. {! {7 u5 L( q& n9 R

  55. ! Z1 L7 e8 Q& S4 p
  56. ///重定向c库函数printf到USART1
    ( m8 z# k+ k6 A+ k
  57. int fputc(int ch, FILE *f)
    % o6 Q6 N6 y$ i. r; T
  58. {" N- b' F6 @& g
  59.     /* 发送一个字节数据到USART1 */" u0 g3 M# a3 x  k" _5 A4 M( i# p! A
  60.     USART_SendData(USART1, (uint8_t) ch);
    0 Q8 l7 T! w3 Q! ?8 U

  61. ' N* U- o: i  r+ l* o# S
  62.     /* 等待发送完毕 */- v, k3 F5 [- Q7 I( {0 r, `: k6 w
  63.     while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);" {" ~8 {" c9 ]2 ^/ k0 P
  64. # b+ J8 Q8 U% \5 X! z# b
  65.     return (ch);3 k7 T7 R' K# k( b* `$ \
  66. }
    ( X  J' Z! n3 o9 |  g

  67. # G$ K# }" p, @% ]
  68. ///重定向c库函数scanf到USART1, X" O5 k" w# T! ?
  69. int fgetc(FILE *f)
    ) e1 v/ C9 c! J
  70. {
    # |" m0 W6 x8 T5 n3 b7 |) M
  71.     /* 等待串口1输入数据 */
    ( w, ?& G$ s, ?9 ?- t( u; Z* \
  72.     while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);! j$ \/ }* V: L  e  u

  73. 1 |8 T& g, ^5 F' t7 S
  74.     return (int)USART_ReceiveData(USART1);5 f3 [( Y6 V& [- y2 p0 j$ ]
  75. }3 ^  x! ]" A8 o
  76. / d+ O6 `4 b) L8 ]: t9 r3 n. v
  77. 2 V3 J2 @6 N1 h1 a  a
  78. - P% p* t! t& k; Q
  79. /*********************************************END OF FILE**********************/
复制代码

+ G+ ~* |, K- C; @
bsp_usart2.c
  1. /******************** (C) COPYRIGHT 2012 WildFire Team **************************
    / y$ s! O6 T& ^! ?( q7 ^
  2. * 文件名  :usart2.c  ?; m. }) Y$ {( I$ [" b5 P. Z
  3. * 描述    :将printf函数重定向到USART2。这样就可以用printf函数将单片机的数据
    2 X7 B2 t5 M5 E4 t4 x7 |- b- _
  4. *           打印到PC上的超级终端或串口调试助手。         
    # {; E& W) Y& C5 j: s5 A! D
  5. * 实验平台:野火STM32开发板
    % X# C! X  ]+ p5 K$ V, a
  6. * 库版本  :ST3.5.06 S5 @6 \( F# D8 X5 J$ a
  7. *
    0 A% _3 n8 d% X( ?0 m5 }
  8. * 作者    :wildfire team
    0 d1 S/ C+ {' Y* g. s0 \3 @
  9. **********************************************************************************/) ~2 M+ T0 R  d9 ~; A
  10. #include "bsp_usart2.h"
    2 ~% N( `* g) ~, t8 E0 [
  11. #include <stdarg.h>
    ) B4 q6 I* E# Y& Y1 C4 }5 ^
  12. , D3 Z  Q5 g! Q
  13. 1 w( d4 K3 F, E7 C" @
  14. /// 配置USART2接收中断
    ' T$ j7 g- X$ T, s8 Z
  15. static void NVIC_Configuration(void)( h) P$ w! ^* S$ e: I4 [& y! q9 O
  16. {1 s$ N& m) t! E8 n8 o
  17.     NVIC_InitTypeDef NVIC_InitStructure;
    8 M- R8 W% f4 p' @
  18.     /* Configure the NVIC Preemption Priority Bits */
    ' [; u0 y9 {$ W! o
  19.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    : p2 N2 i( ~* e- X" e4 F
  20. * ]# w. S* M! y3 t
  21.     /* Enable the USARTy Interrupt */
    8 U' E: `& O9 P# ^! n1 b! X9 F- U( e
  22.     NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
    0 `: K3 u: \. W) f; y. D" q! P
  23.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;$ z: b3 {" F1 Z$ F/ P
  24.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    - F% O5 c8 d/ o8 A2 x
  25.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;, S5 Z- H  X/ Z7 {1 g
  26.     NVIC_Init(&NVIC_InitStructure);
    4 i+ l$ X  @$ X8 x' V
  27. }
    ; ]5 d$ L3 Y7 Y4 Q
  28. 5 A+ n6 N8 X) ~: c% q; r* d: ?
  29. /*
      S9 U6 }8 j/ F' ^2 {+ H0 T+ B
  30. * 函数名:USART2_Config2 H9 t4 b1 N% B" M7 u/ t9 g& g9 ]
  31. * 描述  :USART2 GPIO 配置,工作模式配置' `6 Z& j- ~) }' k3 z
  32. * 输入  :无
    & i4 H- a/ f* A
  33. * 输出  : 无# ]& x4 J) v$ Y2 t$ |& C/ s5 D
  34. * 调用  :外部调用! R; G" e( U  g# h" ^; H
  35. */
    ( n, N& N! |! P
  36. void USART2_Config(void)
    ! g, G. w1 |4 v) ?  m) y$ A
  37. {
    * _: C: \/ A% x: m
  38.     GPIO_InitTypeDef GPIO_InitStructure;0 S1 a0 i9 O) j
  39.     USART_InitTypeDef USART_InitStructure;
    . W* ]! x% r7 D  _( }8 q  B
  40. 1 Y/ f9 o' J0 h2 r
  41.     /* config USART2 clock *// S- p# n" Y. K# G! ~
  42.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    ' `! q0 w. H; I7 L% e
  43.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
    $ Y& h+ I7 u' H+ E9 Z7 Z) s
  44. 5 E/ {" ?5 x; O2 P; B3 t  e' L
  45.     /* USART2 GPIO config */
    0 P  y9 G( d. S
  46.    /* Configure USART2 Tx (PA.02) as alternate function push-pull */' i: v, H/ h) c, N
  47.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    2 ]4 v0 B. w. q4 p# K0 u
  48.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    1 o3 g+ o$ F% o' h4 j
  49.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;! J$ R! {# q' Y, j* _4 s9 T
  50.     GPIO_Init(GPIOA, &GPIO_InitStructure);' j% I9 {3 ]! ~1 n  l% R
  51.         2 l6 S7 U2 J, n
  52.   /* Configure USART2 Rx (PA.03) as input floating */0 B9 g8 p. N" `# `
  53.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;- W  n' ^; a% v9 t' V* H
  54.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    ( i& ^3 S. A. `  J& T4 ]. ]
  55.   GPIO_Init(GPIOA, &GPIO_InitStructure);% \( ], z3 o7 f; O! F, h
  56.       & Y6 V) e. y" V: x. ]- x
  57.     /* USART2 mode config */
    ' j" @4 C& ^. J  m& h, H
  58.     USART_InitStructure.USART_BaudRate = 115200;
    ( ?- w) \/ z5 i) f9 r- G- a
  59.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;1 K+ W* U1 e! Z, z. K. l  X
  60.     USART_InitStructure.USART_StopBits = USART_StopBits_1;0 ^3 @8 u$ g! s# w, r  P. j
  61.     USART_InitStructure.USART_Parity = USART_Parity_No ;
    6 l" E7 [. }$ ]2 T
  62.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    0 w3 t& x  T$ T% w, S" P- [7 o2 c
  63.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;$ ^6 T8 K8 Q9 j2 p

  64. * s; |+ v6 y; R7 e4 J. C$ b
  65.     USART_Init(USART2, &USART_InitStructure);
    * l& A1 S6 t- a
  66.    
    + L- g: i) ]# C7 m  c
  67.     /*    配置中断优先级 */
    & }8 d- S6 B& q  l' ~1 f! D! W
  68.     NVIC_Configuration();
    ; G* F1 o. u) S: i$ R
  69.     /* 使能串口2接收中断 */& \9 N  S, i. c4 ^1 r1 M- g" t* ]3 ]
  70.     USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
      u+ U6 X" J' K6 N) {
  71. 5 L( l" f8 t3 p
  72.     : m# r8 R* L* V
  73.     USART_Cmd(USART2, ENABLE);
    6 R0 Z/ N( B8 ~) O& X
  74. }
    ! V" ]3 m$ ]/ n

  75. / B* l. S  v0 m; h/ K5 _6 i
  76. /*
    3 a% k! h+ A. t
  77. * 函数名:fputc" {; i* |3 Z* r) U, p, r
  78. * 描述  :重定向c库函数printf到USART2
    ! m. B* S5 `& ?4 n5 O* E
  79. * 输入  :无
    0 W0 ~9 Z6 q# J9 _& P$ g' W
  80. * 输出  :无, A5 Q1 w& W( S" M9 \
  81. * 调用  :由printf调用
    " D& ~( y2 W& D/ i
  82. */
    # f. _2 ~! o7 d# W  d, L8 w
  83. //int fputc(int ch, FILE *f)7 n) o/ r) O$ S) C3 P
  84. //{' t( |, @" z( M  X/ t# U  |. j. \* @
  85. ///* 将Printf内容发往串口 */
    0 z2 c' E- ^2 i8 K2 w) w9 J
  86. //  USART_SendData(USART2, (unsigned char) ch);. c4 N! f7 ^0 r5 Q% g  q0 |7 s
  87. //  while (!(USART2->SR & USART_FLAG_TXE));$ \3 c8 i' I  Y3 T* m% n
  88. //
    3 P4 D; R/ C- P  w% N% Z* s
  89. //  return (ch);  o" L1 {, K! H% B
  90. //}, [4 d2 [! T5 {  C( H* S
  91. 3 o! l5 P3 K& l  s7 ~+ m4 J9 l
  92. /*
    1 X2 C3 f. Z( z( }) R! z
  93. * 函数名:itoa6 v- U, L4 l6 Q2 P' `
  94. * 描述  :将整形数据转换成字符串2 Z' {, M) Q% k: d4 q$ l
  95. * 输入  :-radix =10 表示10进制,其他结果为0+ @9 O8 m- Y: B1 F  |% Q
  96. *         -value 要转换的整形数
    3 ?. A$ s! U) S# Y6 ?
  97. *         -buf 转换后的字符串4 r, P4 M4 d8 n
  98. *         -radix = 10% U* e; E" e7 ?2 |4 E7 E2 q
  99. * 输出  :无
    / `  `$ \) V' M' R" }# k! ]* J
  100. * 返回  :无4 K* H' b2 K/ T
  101. * 调用  :被USART2_printf()调用
    7 \% y% u2 U9 v8 R& q" N, H9 e4 o
  102. */3 h# E9 f# m* h% X2 p' s: ~
  103. static char *itoa(int value, char *string, int radix)$ h) z9 X) P  G0 |* l( x% j% p, i! U
  104. {
    3 @! e5 S, X  N- _
  105.     int     i, d;
    / m* v7 P* A! b. F2 g& ~: j
  106.     int     flag = 0;! I! ]8 m& i# f9 i& A
  107.     char    *ptr = string;
    6 v9 k( u3 F7 I* W) I0 z

  108. / ~, Z: {, u/ m# z9 K# |6 R
  109.     /* This implementation only works for decimal numbers. */3 j" ^" h. m/ X) Y8 s! [8 V# U
  110.     if (radix != 10)
    8 v& [+ c* H( `+ w, }. v
  111.     {
    9 U: l: k% M; ~7 Q; E/ d+ E
  112.         *ptr = 0;
    * I# {5 [3 T- S1 H: |
  113.         return string;
    0 Y: B& [* b9 P: k3 [5 K% X
  114.     }. q: b3 k7 z, F; l  q% M5 M
  115. ' o' q0 P4 ^. |. J
  116.     if (!value)
    & Q$ b2 r% Q6 t+ D+ n
  117.     {
    8 q# j" {& ^) P
  118.         *ptr++ = 0x30;/ J) R4 V& Z' w: w4 f
  119.         *ptr = 0;6 N4 s$ \$ X- a! d: a$ i" E( D3 v& T; t
  120.         return string;/ ~, c1 g4 `2 {6 a* t
  121.     }8 g& Y: |- S; R% \- n
  122.   H7 P( n0 U2 J6 g
  123.     /* if this is a negative value insert the minus sign. */
    ' x& z) C) e  j+ N; P: a- \
  124.     if (value < 0)
    1 W# A! V4 P' D% o' Q) Q
  125.     {
    5 ?/ ^/ z# i$ g
  126.         *ptr++ = '-';
    . r; w7 ~3 p) T, w& V
  127. 1 r6 J# s7 Y2 g
  128.         /* Make the value positive. */
    : T. \" C2 h9 i& d" S
  129.         value *= -1;
    : }" I2 M4 n( M/ t" q
  130.     }
    ! a* h: O, m& o4 K+ x9 f5 Q" Q5 A
  131. 1 e- t4 N$ M, g1 V( g( g
  132.     for (i = 10000; i > 0; i /= 10)
    7 @$ Q) I- S2 s' {$ o2 S
  133.     {  q5 h0 n' G2 m: {- W
  134.         d = value / i;
    ) D; [0 \; t1 ]- \
  135. 5 u2 a7 x6 X/ \% S* I1 p' }
  136.         if (d || flag)  q$ G: x7 a4 h3 X' u
  137.         {- X5 A( k2 o; @0 j8 W# D
  138.             *ptr++ = (char)(d + 0x30);
    5 m& r0 F" R' r4 ~5 ]+ U3 Y% O" s8 G/ y0 i
  139.             value -= (d * i);
    & E% J' Y" }5 \+ l
  140.             flag = 1;
    ) G' f  k6 u- M7 u- o5 f
  141.         }5 ^0 O* \/ m5 g8 n% [
  142.     }
    & u3 X& }' \  f- {1 G4 u
  143. ) N5 d0 L3 o: }! Z
  144.     /* Null terminate the string. */0 I( Y# d/ j+ h8 d$ Y
  145.     *ptr = 0;8 a- C# z: h) D8 q! u3 X* R' ^

  146. 8 a  ]5 i+ T/ V/ \. q9 c
  147.     return string;: @: w; @+ R' @; D) V- e9 ~7 ]5 U

  148. % ?4 ]& K! z( V, m- V/ v6 Y
  149. } /* NCL_Itoa */+ |! `; C# a; O& z" H- @8 F) D8 S

  150. / a; r, o3 L& e+ O2 B

  151. : L6 w0 H/ l/ o* v* Y5 ~0 o2 g
  152. #if 17 H7 M3 y6 |4 I4 p( f  |
  153. //中断缓存串口数据
    ) O: W4 n4 q+ ^: u& V; }9 o
  154. #define UART_BUFF_SIZE      255
    9 Y/ j+ Q( t9 i$ @
  155. volatile    uint8_t uart_p = 0;$ f5 G9 M1 i) G! p2 y8 `. X' r
  156. uint8_t     uart_buff[UART_BUFF_SIZE];
    . E4 n: @5 B; r9 B! [

  157. * [- M' o) C' t8 g2 A
  158. void bsp_USART2_IRQHandler(void)$ D2 P! Z2 `  t0 K6 U" C
  159. {7 @" y) a6 `& O6 b" x& c0 r
  160.     if(uart_p<UART_BUFF_SIZE)$ E0 \1 g' N4 C$ B5 T7 E
  161.     {
    & S% V2 F/ L$ f8 U
  162.         if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
    $ o! Y+ Q# [7 z1 O7 D
  163.         {
    % I4 T# C$ K7 r2 [# ~8 X
  164.             uart_buff[uart_p] = USART_ReceiveData(USART2);& Q+ D7 ~  n! h+ [; m# f1 O
  165.             uart_p++;
    % o* W* D3 N( S1 b3 T
  166.         }& G0 \/ x3 r# N5 Z5 v
  167.     }
    " c$ \0 G* F" q. m
  168. }
    4 m/ P" O( B2 E1 W
  169. 3 A" I0 M, m6 m8 Y
  170. 2 V; `4 ]6 K: Z( {3 X9 L7 l
  171. ! |8 T  N3 Q8 B1 ~
  172. //获取接收到的数据和长度, b3 E, B( \' `- ~7 i& u5 X4 w
  173. char *get_rebuff(uint8_t *len), g( s6 `' S1 C1 K) j# G6 @# l- I) O
  174. {
      N+ U3 g8 m7 Q. i
  175.     *len = uart_p;
    / w& P7 o0 x$ n
  176.     return (char *)&uart_buff;5 R6 \" x, m  V
  177. }; H  P6 o$ {* H3 V9 V; {, N
  178. 2 M) w; v- T: Q- Z/ J
  179. void clean_rebuff(void)& H" _( U4 M8 T3 A# s. k# J8 A
  180. {! r2 C  d4 J2 d4 W
  181.     uint16_t i=UART_BUFF_SIZE+1;6 m2 S9 n, h3 a; d
  182.     uart_p = 0;! w( i% _2 K$ C+ K# J; f# n. z
  183.     while(i)
    & h  b7 z, o4 H* c& E% F
  184.         uart_buff[--i]=0;
    4 n, Z) p+ z) h3 b, F
  185. }
      l( K/ l: U& k3 C+ d7 e
  186. . F  Y1 C: h5 ~: m  E
  187. #endif* p# \% Z" F% e4 l1 h. z
  188. 9 x5 I, n0 J3 n( Z( w1 D) I
  189. /*
    5 M$ C9 _2 R% ~$ K7 V
  190. * 函数名:USART2_printf/ A( c2 O( c  T. a
  191. * 描述  :格式化输出,类似于C库中的printf,但这里没有用到C库" v6 ]1 R+ V7 i$ ~% u
  192. * 输入  :-USARTx 串口通道,这里只用到了串口2,即USART26 I& _- k! ?: \
  193. *             -Data   要发送到串口的内容的指针
    ) V: R# X$ @0 z( o' ~$ f
  194. *               -...    其他参数
    , ]/ N) T( l; V2 X: O' o
  195. * 输出  :无
    9 Z& J, m4 T  s" k' K$ t
  196. * 返回  :无
    0 N$ i. ~  n( c8 h) B, O+ _
  197. * 调用  :外部调用
    - y( ~8 }0 l/ m2 }
  198. *         典型应用USART2_printf( USART2, "\r\n this is a demo \r\n" );# f. r! j& g% a$ t8 k7 ]7 {+ H
  199. *                     USART2_printf( USART2, "\r\n %d \r\n", i );
    ) a! o. S2 a, D" X
  200. *                     USART2_printf( USART2, "\r\n %s \r\n", j );
    " M3 J! N0 P# ]8 S* p3 q9 P9 @% J6 A
  201. */
    ! [" o! ]5 v2 \5 `$ u/ R
  202. void USART2_printf(USART_TypeDef* USARTx, char *Data,...), s/ {& O6 }/ Z) {
  203. {
    + t: ~* a+ R& D9 [' W
  204.     const char *s;# v- c( }2 |$ b0 P
  205.   int d;     w" |# \; L0 ]" A
  206.   char buf[16];
    3 }' ^6 C/ {7 e2 j: n- L

  207. 7 I( f: N/ t/ G$ u7 L
  208.   va_list ap;
    , r0 o5 b8 \. [4 X& M, F; T1 W
  209.   va_start(ap, Data);4 L3 F. j) S, \6 J# E& M

  210. , [; q6 D3 f/ @$ G
  211.     while ( *Data != 0)     // 判断是否到达字符串结束符
    : q8 l, y  f, v5 q- T, T0 E
  212.     {                                          ' V1 s& `0 F7 _0 b/ w5 R( Q- h
  213.         if ( *Data == 0x5c )  //'\'
    2 _7 m$ _, I; Q0 G/ f2 H* g
  214.         {                                      5 y! W& F3 \& [3 f; N) b0 T
  215.             switch ( *++Data )
    : M2 _4 i* W  [( D! }
  216.             {3 W  l9 ~1 r4 q0 r, D  W, I
  217.                 case 'r':                                      //回车符
    : L+ O/ H! E. ~& P. H
  218.                     USART_SendData(USARTx, 0x0d);8 ?+ B# b( W' n5 B0 J
  219.                     Data ++;
    & G( L0 o$ _, J) X
  220.                     break;
    ' h  G1 E3 f2 l% K9 d

  221. " }' i+ @- Z2 _
  222.                 case 'n':                                      //换行符: W: V! k% c& H) X% b# E' X2 l
  223.                     USART_SendData(USARTx, 0x0a);   
    * f& F; w! ~4 l  N
  224.                     Data ++;2 x/ ]2 g* |$ ~1 M  A* S# z
  225.                     break;
    5 F2 i3 K- Y; g( K; p0 z) ~
  226.                
    - Q  i% K7 J6 v9 Z$ N
  227.                 default:
    ! N5 t' J* d7 f9 Z2 u; p
  228.                     Data ++;4 t, Z3 I: J" r! }( U  Z
  229.                     break;2 p% `% i8 @' R  F/ B5 h( ~5 t
  230.             }             $ O0 H  N: B& J; U# f. c
  231.         }
      I2 G, \! J" A" U6 z
  232.         else if ( *Data == '%')
    5 S: t  L) e3 G% t( m) q9 M
  233.         {                                      //
    ) [9 h8 L5 W0 T. B5 [; g  w
  234.             switch ( *++Data ): r2 J3 a8 l- P
  235.             {               
    + G, @' Y) W! Q. _( t
  236.                 case 's':                                          //字符串* Y# j% V: X+ c8 k3 N2 V
  237.                     s = va_arg(ap, const char *);! Z. C, {2 ?! N
  238.           for ( ; *s; s++) 6 ~0 D! @- |8 d. |
  239.                     {
    $ e, p( H+ a0 L6 Z) E$ w4 R8 |8 [
  240.                         USART_SendData(USARTx,*s);
    + b( a" E- _; v# ^
  241.                         while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );! b) x( C; Z- B2 b; ~. B! S, _5 j
  242.           }0 B' o, Z' Y$ K8 X% w
  243.                     Data++;
    / t: }  r7 p# l7 L% G4 y7 L
  244.           break;1 L$ r1 H1 F! Z. w

  245. 8 u# c4 {& J- ^2 U0 S4 h. I. d
  246.         case 'd':                                        //十进制0 \" S9 Z* j  R. m
  247.           d = va_arg(ap, int);
    ( p! D  g' @8 E3 O- h& B
  248.           itoa(d, buf, 10);
    - Y) R: m2 P+ y
  249.           for (s = buf; *s; s++) " P* f; y9 k2 g
  250.                     {) a9 `/ G; R  L+ G" Y. P3 W* g( j
  251.                         USART_SendData(USARTx,*s);, T1 O# t& E' j- s3 w
  252.                         while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );3 B3 _5 f0 {- \- H
  253.           }
    # r9 e. f: W0 }5 t
  254.                     Data++;  I9 @  F" x; l. Y
  255.           break;
    ! x- }/ T0 Y! |7 Z
  256.                  default:" r5 ]  B# ?. R& {
  257.                         Data++;
    : a) c. w) m9 s* R
  258.                     break;7 S5 K1 F/ j8 Z& R7 |! h
  259.             }         
    ) j" f! M/ c; `1 b2 Q3 w
  260.         } /* end of else if */& A! g5 U# V' S$ R9 j
  261.         else USART_SendData(USARTx, *Data++);
    : A# T6 D1 q; M: ^& u* ]$ d
  262.         while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
    , I) K2 Z2 z' a. Y( U9 |6 F& |
  263.     }
    4 n: |! o( C1 Y4 e5 b( m/ H
  264. }
    % c; j2 ]0 \8 A1 J; ^7 l4 V
  265. /******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/
复制代码
; m/ F. u3 F8 v+ T  `' b; o
bsp_usart3.c
  1. /******************** (C) COPYRIGHT 2012 WildFire Team **************************
    % n: Z; x; x( f. W2 [1 L
  2. * 文件名  :usart3.c
    ( U2 d7 p8 s0 D3 R; `* Z: q& ^( x' W
  3. * 描述    :将printf函数重定向到USART2。这样就可以用printf函数将单片机的数据7 K: I4 h6 i! p' x% _- Z$ a
  4. *           打印到PC上的超级终端或串口调试助手。         ' G# W9 ~+ t2 ]1 t4 y, \3 R3 @
  5. * 实验平台:野火STM32开发7 P! h6 F9 M2 t: D: q7 k
  6. * 库版本  :ST3.5.0) p6 K* N& p9 B# _5 g* r6 X
  7. *
    - q: A+ \4 _7 D$ Q2 S5 r
  8. * 作者    :wildfire team
    3 |3 u, t, y/ A
  9. **********************************************************************************/0 o& q% W( G2 n
  10. #include "bsp_usart3.h"//头文件要在外面改头文件名,现只将其中内容改为usart3
    3 l; Z+ d( r# i( y* ~& L, b
  11. #include <stdarg.h>% G, e# ]# `3 P. O
  12. 0 G+ T3 y2 x# F
  13. - s+ z( n$ [- ^% U: \4 S$ i
  14. # A: q0 @; C) i, v' u' X+ ~4 S
  15. + _% c8 Y2 n0 Y& q
  16. /*, F7 k' k9 E) Q( t- E
  17. * 函数名:USART2_Config  v' B% V  `% b
  18. * 描述  :USART2 GPIO 配置,工作模式配置- v  m3 c# J. s5 I. [  d; Y6 p& ^
  19. * 输入  :无' t" W* N0 l3 g* R
  20. * 输出  : 无
    . Q6 w/ Q6 X( X1 o; j/ F! n- M" s4 |
  21. * 调用  :外部调用
    : h. J  n* Q* `- e* i/ b2 e" V
  22. */% _4 s) b3 S! {" W0 g' x( b  \
  23. void USART3_Config(void)
    / G3 o# G5 V. ]7 T! G
  24. {1 {: P8 z6 t& q% k, J
  25.     GPIO_InitTypeDef GPIO_InitStructure;
      ^+ ]! t+ N" S' V+ @% @4 {( `1 K
  26.     USART_InitTypeDef USART_InitStructure;
    : k* }$ F, \3 y: @

  27. 3 H  {+ p4 M, s
  28.     /* config USART2 clock */1 x5 j0 A$ `9 ^# R! T* e% f
  29.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//此处也要修改,修改为GPIOB
    - k6 \+ N3 y  W3 {  l
  30.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
    , G2 \3 _, i: x2 S. S) M

  31. , U* |+ {2 g6 ^2 A) M6 x
  32.     /* USART2 GPIO config */
    2 R- Z2 p# z. C
  33.   /* Configure USART2 Tx (PB.10) as alternate function push-pull *///此处改为b10
    0 |+ D0 i7 h- ^
  34.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    1 c/ T; L* M( q  _8 M7 z2 X
  35.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;1 J8 t' i% S+ J" R& G0 k* J* _
  36.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;- B1 i1 F" h% w7 T! x
  37.   GPIO_Init(GPIOB, &GPIO_InitStructure);
    9 ]) @* r6 J& l# S- ]( U& O
  38.         . |) c5 S, l- i+ v
  39.   /* Configure USART2 Rx (PB.11) as input floating */ //此处改为b11
    4 C0 [0 L/ s6 c2 W# \. v
  40.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    8 U5 Q0 I9 D, q% ?6 h( D+ @
  41.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;' m7 o4 H1 y2 q5 C+ A; q
  42.   GPIO_Init(GPIOB, &GPIO_InitStructure);0 L% u  K  N" [9 ~/ t& G; S
  43.       9 d% d" G+ Z! K( W
  44.     /* USART2 mode config */) J" o( j  m5 V9 o% J/ w. E7 H
  45.     USART_InitStructure.USART_BaudRate = 9600;                //GPS模块默认使用波特率:9600
    " g# S; e7 h( |, G" C$ x- W
  46.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    # S1 ~' L8 x; U
  47.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
    $ \# q8 R, G, ]* y
  48.     USART_InitStructure.USART_Parity = USART_Parity_No ;
    ! U$ Q/ \0 S5 H$ c9 E. {* n
  49.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;1 ~$ V: M+ O3 M6 n* h# J" C
  50.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    ) j3 b+ @9 ]7 `' d

  51. 0 k# q2 v% W8 L
  52.     USART_Init(USART3, &USART_InitStructure); # j5 X5 O3 `' Z. G0 N8 s$ U, B- z3 S

  53. ; ?& Y4 g! E% M+ }; O
  54.     USART_Cmd(USART3, ENABLE);$ I6 f% G8 i$ N: ^
  55. }
复制代码
4 z1 ]! U' B8 h/ W4 M
gps_config.c
  1. /**2 x. w6 L* ]1 t
  2.   ******************************************************************************
    + s; |0 b& ^! H. u7 w
  3.   * @file    gps_config.c: c" y! Z5 f4 ~$ u( M9 u9 V' ]& B* d- N
  4.   * @author  fire
    + v2 ^& X: ~$ m& I
  5.   * @version V1.0
    ) @" C) E1 A, |9 J1 @
  6.   * @date    2014-08-xx
    7 o7 _- T9 D5 w$ z, @( y( P
  7.   * @brief   gps模块接口配置驱动1 W- V2 L! q( E) i
  8.   ******************************************************************************
      P2 j0 Q" [6 j7 H' v
  9.   * @attention
    , n- S" p7 O* p' c7 s9 v. C: }6 f8 {8 M
  10.   ** h. s( q  a0 C1 t3 L
  11.   * 实验平台:野火 ISO-STM32 开发板+ f$ y4 G8 b4 V$ C/ Y$ p
  12.   *1 q2 b: Q  z8 g2 a& D: l  T
  13.   ******************************************************************************
    5 n( q5 a* u. Z; b  N, Q
  14.     */7 e& w5 s) ?4 P  t) H+ N, ?
  15. ) _2 I- b$ P  @0 u2 V# H; Y
  16. #include "gps_config.h"
      H* ?  E- O8 t' n" j7 \6 k! T/ J  w
  17. #include "bsp_usart3.h"
      j" }' S- i* V' w
  18. #include "nmea/nmea.h"
    ! f3 b- ?+ [' ~8 a& y

  19. 1 [2 s9 e6 O$ U6 J
  20. % z4 ]! e6 h$ I' [/ A3 Q
  21. /* DMA接收缓冲  */
    2 Z! g# c# G: A. y3 u( P
  22. uint8_t gps_rbuff[GPS_RBUFF_SIZE];
    6 w& J% k5 N' k+ Y
  23. & r! J; F. i1 g7 ~6 R+ E
  24. /* DMA传输结束标志 */0 B, p* z$ ]3 l8 T( l+ k
  25. __IO uint8_t GPS_TransferEnd = 0, GPS_HalfTransferEnd = 0;
    1 z, j' G- K  Z1 b  k
  26. 6 D# s6 F' H* l0 T3 Y1 R6 \

  27. 2 U1 T1 X2 A: Q  d* W1 d' i
  28. ( e1 I. f5 `- h. }( a, k' @" r/ Z
  29. /**
    ! D1 |# G8 R6 h) I9 R
  30.   * @brief  GPS_Interrupt_Config 配置GPS使用的DMA中断
    8 |% k! T  @  |
  31.   * @param  None.
    / ]. Z( _8 {& m4 N1 O6 y# u
  32.   * @retval None." s1 j9 M$ @4 \6 r
  33.   */( _7 v/ a1 g7 F
  34. static void GPS_Interrupt_Config(void)
    1 {6 K* w, \- i% {2 g
  35. {
    " ]  Y( U- c8 C9 S
  36.     NVIC_InitTypeDef NVIC_InitStructure;
    2 {. E; O6 _$ L
  37. 7 }1 S* L3 T' g$ U, v/ C1 d. v
  38.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);0 c: R0 c# _& S0 q! F
  39. * R5 S, L( r, a, T! E
  40.     // DMA2 Channel Interrupt ENABLE8 t# a" L' ]4 A0 Q
  41.     NVIC_InitStructure.NVIC_IRQChannel = GPS_DMA_IRQn;//中断用的是RX不是TX啊啊啊啊fuxx!!, N0 p. Q( p% o4 V5 k" j
  42.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;+ _& `/ \2 Q: K6 {' m* H1 N
  43.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    + g: K3 z1 y8 v
  44.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    3 x* Y0 p% G; c
  45.     NVIC_Init(&NVIC_InitStructure);( F6 q9 N) l" s
  46. : _3 w7 U: o, Q% k# ^! |
  47. }* o9 L3 R5 D& z9 L3 D
  48. 4 F- V: Y! N3 {3 E

  49. ; E" Z+ X% [0 I" @
  50. /**
    ) K# r8 v) n! C9 ^. A
  51.   * @brief  GPS_ProcessDMAIRQ GPS DMA中断服务函数
    4 \6 r/ d) g+ p7 e9 Y/ c4 v" K
  52.   * @param  None.
    0 H4 S4 \' R0 v, t* k5 r" Q
  53.   * @retval None.- a6 a% v7 s8 t+ Y5 O0 L; O6 G
  54.   */4 ]1 k; q( P9 p% ?# ]- V: B; M
  55. void GPS_ProcessDMAIRQ(void)4 i* y; E. y3 H! I) o- Z" B# N
  56. {: B1 q$ ^; P) F4 v+ w; Q( n
  57.   - |( ^( R+ o9 Y$ Y
  58.   if(DMA_GetITStatus(GPS_DMA_IT_HT) )         /* DMA 半传输完成 */
    3 b' ^' M2 @3 {' b
  59.   {
    4 F6 d# X6 |) [, ~, b+ S
  60.     GPS_HalfTransferEnd = 1;                //设置半传输完成标志位
    * O0 H; A0 D8 G* z
  61.     DMA_ClearFlag(GPS_DMA_FLAG_HT);0 O0 V  K5 }/ q5 y( ]$ ]; j# Z2 J, L
  62.         
    & T# Y1 U$ [/ c$ {; _, V; j
  63.   }& n5 b1 V/ R1 E& I9 j! v- Q
  64.   else if(DMA_GetITStatus(GPS_DMA_IT_TC))     /* DMA 传输完成 */
    0 o1 o7 @8 G# K0 E/ C0 N
  65.   {
    . \# ?. \' E+ O# E
  66.     GPS_TransferEnd = 1;                    //设置传输完成标志位. f" l6 P( H# ]1 I2 Z+ ?  s8 V9 h
  67.     DMA_ClearFlag(GPS_DMA_FLAG_TC);
    8 H; r2 X+ I6 E0 R: u" [+ C6 Y& |

  68. 6 o) n2 W4 h& j6 C& Z
  69.    }
      R7 M& N+ |  c$ S! C7 C% A! y
  70. }1 c3 p$ k6 ~+ q
  71. $ O1 i& f1 t: U0 N$ X

  72. 3 j/ C* {) V6 ^1 ^/ v
  73. /**
    / F; ~8 Y: K" z9 n
  74.   * @brief  GPS_DMA_Config gps dma接收配置
    " @5 W8 T8 j( F& R1 ~
  75.   * @param  无5 V$ G! i& g9 u4 ?0 k
  76.   * @retval 无
    3 D% S; f  p; |& @' J. c0 l! G
  77.   */
    $ V6 H* D0 F+ l; X
  78. static void GPS_DMA_Config(void) //其为一个函数) `* `* [; F( l+ F$ ~& g
  79. {; f& K$ d% u& y; G0 h
  80.         DMA_InitTypeDef DMA_InitStructure; //定义一个DMA_InitTypeDef类型的结构体,名为DMA_InitStructure
    ! \' x$ f  {0 ~2 {
  81.     * {4 ~( s1 ?; G& w% }# s8 S$ [
  82.         /*开启DMA时钟*/! l7 }$ m: a$ a+ \8 C# V4 a  ~
  83.         RCC_AHBPeriphClockCmd(GPS_DMA_CLK, ENABLE);3 K: P) c& }/ |% ^. z2 x4 [
  84. 6 a9 ^0 X2 h$ Y4 [( \: i# N$ j
  85.         /*设置DMA源:串口数据寄存器地址*/
    % \. D' a# I; U  T! O- H/ F6 l( `
  86.         DMA_InitStructure.DMA_PeripheralBaseAddr = GPS_DATA_ADDR;       //带点号为结构体内的成员,可直接赋值,相当于变量: M' {* o' B6 K& W. g
  87. //从该处进入gps.config.h可见,gps的串口通信定义为USart2,我们可从这里修改% a% }8 q; V5 f
  88.         /*内存地址(要传输的变量的指针)*/3 [& `* U9 G! L; q
  89.         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)gps_rbuff;
    : o8 N' B7 M; _
  90. 4 l2 Q# B( R4 T; u
  91.         /*方向:从外设到内存 */        
    ! S& i- F: q4 u( r3 G
  92.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;   
    : j; B5 m5 N% b3 B# R9 U6 h) z

  93. % _. D% K, V3 t
  94.         /*传输大小DMA_BufferSize=SENDBUFF_SIZE*/    " w+ }2 r3 f* P9 M$ }
  95.         DMA_InitStructure.DMA_BufferSize = GPS_RBUFF_SIZE;
    7 _& a6 Z- A. h" v. f
  96. 2 E( M9 {: o0 @/ ?! s
  97.         /*外设地址不增*/        $ T5 |9 _2 |0 T; [& i
  98.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //想修改可直接找到相对应的名字修改4 ^$ g+ K2 @1 h! Y+ K' h

  99. 2 ], {' k7 }* V8 c3 g5 {+ L
  100.         /*内存地址自增*/+ R( e6 t2 \5 n! U# {, h# u9 ?" F
  101.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;   
    * D# ^6 ?8 f3 L) z
  102. 8 J9 F' C7 _" A7 g1 Z" C. h
  103.         /*外设数据单位*/   
    & g/ O: W& l9 q- g- w6 y! i; v' {
  104.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;% b% Y, S9 A3 a' _; e& F

  105. 2 c% V5 _4 ~( H; T5 R. n, s
  106.         /*内存数据单位 8bit*/4 H# K  o% c$ Z0 [9 y: G+ B
  107.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;     
    + G) ]5 D9 U' m. [. v! c
  108. * T- f1 a9 s0 Y' J
  109.         /*DMA模式:不断循环*/) x8 o. c; O4 U3 H
  110.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;     " I- y6 B; K* ^
  111. 0 e" H6 S8 ^1 {. D
  112.         /*优先级:中*/    8 `8 [! m) `! z7 k+ n
  113.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  7 t2 P6 z  C1 s+ q- t
  114. ) q1 |5 K( o" O' j+ w$ j) C* r
  115.         /*禁止内存到内存的传输    */
    ; Z2 v1 g( x2 `' z
  116.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;% F$ w- N* p* A/ d

  117. 1 p; R3 A% c* r- n2 P1 I6 W+ r4 z& @
  118.         /*配置DMA的通道*/           8 E6 {- U$ \9 q2 Z% f
  119.         DMA_Init(GPS_DMA_CHANNEL, &DMA_InitStructure);        . M4 x. X4 d; S3 d' |
  120.     # o/ ^+ T* H6 V! d. P% ]/ }5 k4 m
  121.     GPS_Interrupt_Config();
    ) ~: J- O- W' \' g: Q$ }
  122.         
      j: O, R; s4 ?3 W) i% r. g- D
  123.     DMA_ITConfig(GPS_DMA_CHANNEL,DMA_IT_HT|DMA_IT_TC,ENABLE);  //配置DMA发送完成后产生中断
    8 y" H$ b/ R6 u8 R0 A; @9 p: K

  124. / k6 r* K' q; p( \1 w: {9 e
  125.         /*使能DMA*/
    * @8 c  U$ m$ @
  126.         DMA_Cmd (GPS_DMA_CHANNEL,ENABLE);        - X6 Q+ F) L  O; r" p6 a6 @
  127.     1 `9 Q, v3 h0 T
  128.     /* 配置串口 向 DMA发出TX请求 *// {2 R5 H' j. {8 m7 r- j
  129.         USART_DMACmd(GPS_USART, USART_DMAReq_Rx, ENABLE);
    ! ^) S: l# G& o7 z2 z

  130. % T* _! B8 j! o0 e. ^
  131. ) k" G' C- d% Y& u3 X5 C" y
  132. }* m( v# g$ u; u

  133.   D  {% T% O  k9 ]
  134. /**
    & \( W4 Z" j$ ]$ S6 j" i& z
  135.   * @brief  GPS_Config gps 初始化
    " ~. x5 a0 J7 f0 s1 M
  136.   * @param  无! v  _$ k6 j. P' B
  137.   * @retval 无/ b+ _* Y$ _! u: U9 ]+ o
  138.   */& s* y( t# t9 j3 l
  139. void GPS_Config(void): S* p) x& M5 U' `2 o
  140. {
    ! U- X$ e+ \+ U9 X' A, b
  141.   GPS_USART_INIT();   //初始化串口
    . O" `0 R( ~( p6 z
  142.   GPS_DMA_Config();  //初始化串口配套的DMA模式
      g" H0 M% G  H! N4 n
  143.   4 y: s" E( u  g- H, M
  144. }, b' I( g8 \, o' M# c! I

  145. : g8 b7 K* N( b: J( H- Z! D: Q& H
  146. / W6 U* U+ a2 c- r% K* b! X
  147. + b. U$ y( f6 u6 ~; D
  148. /**# A$ I: Q, F+ ~
  149.   * @brief  trace 在解码时输出捕获的GPS语句
    6 H. A2 |& Y% g6 H
  150.   * @param  str: 要输出的字符串,str_size:数据长度/ [6 }. o2 }9 R: t
  151.   * @retval 无
    3 D) d3 U4 V; [7 S5 x0 n9 w6 A( L
  152.   */
    0 Y8 V  v* v/ q; E* i" B
  153. void trace(const char *str, int str_size)( H; D$ t, K6 r6 ?: g
  154. {/ U6 {- n- a6 x5 Y% u. z, h
  155.   #ifdef __GPS_DEBUG    //在gps_config.h文件配置这个宏,是否输出调试信息% ?$ x3 X0 t6 R  ^
  156.     uint16_t i;8 l& l0 X5 A" c/ f  t& y4 B* A
  157.     printf("\r\nTrace: ");
    ) X4 U+ s$ h$ b2 q" a! K
  158.     for(i=0;i<str_size;i++)
    & E$ [' Y: V: s1 t
  159.       printf("%c",*(str+i));  N, F2 j  N4 z! v
  160.   9 h6 Y- F% Y) ~/ ]. v; W$ m
  161.     printf("\n");0 h; ?# f( r8 g" K4 ^1 ?7 w/ I
  162.   #endif7 U# X) M9 Z+ w2 T, J
  163. }' {1 b2 I! h3 O. N* s5 g! H
  164. 7 p2 e/ T( b: r& J0 U! U6 F8 c
  165. /**! C7 |5 ~( q* {& s/ o7 `& O3 [
  166.   * @brief  error 在解码出错时输出提示消息
    2 P8 q- V* K9 I) {  |" a
  167.   * @param  str: 要输出的字符串,str_size:数据长度& i2 D- ~4 H  i& T) r
  168.   * @retval 无
    / m+ h1 k0 l8 K! d! t
  169.   */+ `* Z$ a2 @8 G2 R+ m
  170. void error(const char *str, int str_size)
    6 Z! |0 Q; ?1 K7 \
  171. {4 ~5 R  Q4 ?9 w' u. ?8 b
  172.     #ifdef __GPS_DEBUG   //在gps_config.h文件配置这个宏,是否输出调试信息1 r; s0 g/ j# }: L! L% ]
  173. 7 g; j3 b: \3 }8 c7 T
  174.     uint16_t i;
    ! j" {- u: V* G) ~* }  v
  175.     printf("\r\nError: ");
    # ]- V5 s/ b6 \) I4 k- j
  176.     for(i=0;i<str_size;i++)
      N+ l$ ^; f( I; W* x/ L; U
  177.       printf("%c",*(str+i));* I1 g4 F  W& s. w% e
  178.     printf("\n");' n5 N- i2 D% Z2 |) c8 p1 C
  179.     #endif! i4 S; I" D) P& @9 O  k! m( q/ c
  180. }
    5 O' K$ y% o6 Q2 U, U
  181. - ?$ X* o! b7 n8 |% A/ m
  182. $ K$ [0 H5 y/ B6 q' D3 Y3 o9 L0 _

  183. 1 w* g. K! H: k" a# k, C9 G5 |" d
  184. /********************************************************************************************************
    3 g9 ]: u/ o, l. U7 D# ?7 B0 {
  185. **     函数名称:            bit        IsLeapYear(uint8_t    iYear) / l7 v  p* m6 ?: ?$ C) w# c- d; k
  186. **    功能描述:            判断闰年(仅针对于2000以后的年份)
    2 p# `! }' Z1 f
  187. **    入口参数:            iYear    两位年数 * G! }) ^# O) i/ ~. H, n
  188. **    出口参数:            uint8_t        1:为闰年    0:为平年
    : s6 C2 s$ A! l  g
  189. ********************************************************************************************************/
    % e0 @, D/ c6 t- d
  190. static uint8_t IsLeapYear(uint8_t iYear)
    8 u6 h7 j7 n3 Q; s
  191. { 4 v7 [  K/ G! X( w# X4 U% G  p% C
  192.     uint16_t    Year; 6 e0 m8 j; x$ X' Y
  193.     Year    =    2000+iYear;
    5 J! V% n9 K, j
  194.     if((Year&3)==0)
    , x8 T7 S" z) R
  195.     { # _+ p5 v* |( s" J7 ?* q0 [+ H0 X$ I
  196.         return ((Year%400==0) || (Year%100!=0));
    # W( t% h" f: P3 K2 b9 o: k9 y
  197.     }
    6 P: ?6 I% B1 P5 u4 H
  198.      return 0;
      O6 R# R% e2 ^4 k  P
  199. }
    % ~, U* O( T4 O" U8 u) v) E

  200. $ @7 e$ l) L' V: _1 ]5 |
  201. /******************************************************************************************************** ( V. K# `5 B0 ]  h  m
  202. **     函数名称:            void    GMTconvert(uint8_t *DT,uint8_t GMT,uint8_t AREA) 1 k' o7 X, P9 H# D
  203. **    功能描述:            格林尼治时间换算世界各时区时间
    $ T- _. K/ ]1 @, [7 A. k
  204. **    入口参数:            *DT:    表示日期时间的数组 格式 YY,MM,DD,HH,MM,SS
    2 [# u2 q0 p3 T0 Z8 |6 F
  205. **                        GMT:    时区数
    " G. V0 G: r" x* r
  206. **                        AREA:    1(+)东区 W0(-)西区 7 o, R: }7 o7 n
  207. ********************************************************************************************************/ + c$ S/ g  |6 y) v
  208. void    GMTconvert(nmeaTIME *SourceTime, nmeaTIME *ConvertTime, uint8_t GMT,uint8_t AREA)
    5 z/ E/ R" y  R' i* a7 Z
  209. {
    . C. E5 r. `  X4 @8 ^
  210.     uint32_t    YY,MM,DD,hh,mm,ss;        //年月日时分秒暂存变量
    & E0 n- p! b4 |
  211.      
    / x$ O, U* z1 ~' ?
  212.     if(GMT==0)    return;                //如果处于0时区直接返回
    , Y) [) s, |+ U  ]7 |
  213.     if(GMT>12)    return;                //时区最大为12 超过则返回         
    8 Q' ]! _7 n3 Z7 F$ v

  214. ; W8 o8 t5 u5 S# b2 z$ i
  215.     YY    =    SourceTime->year;                //获取年 ! S( _/ z6 o" R8 a! H. F
  216.     MM    =    SourceTime->mon;                 //获取月 ; z1 D, S  J' E7 q( N3 p
  217.     DD    =    SourceTime->day;                 //获取日
    ( \# ^8 ^" C  A* R% }2 F/ O1 v9 h4 \
  218.     hh    =    SourceTime->hour;                //获取时 ' |( }' M  u' c0 m( ]8 l" i) ^2 U$ ?+ K
  219.     mm    =    SourceTime->min;                 //获取分 $ S$ F) {- c" ^6 h, U) x2 v% ]
  220.     ss    =    SourceTime->sec;                 //获取秒
    / s& B, _9 r* z8 n
  221. 9 u$ Y. X% a! o% z8 z8 F
  222.     if(AREA)                        //东(+)时区处理 ( t- p( ]; [6 P% \/ t" s
  223.     {
    ( S! r% @, l' g
  224.         if(hh+GMT<24)    hh    +=    GMT;//如果与格林尼治时间处于同一天则仅加小时即可
    4 P0 f2 Z$ q6 B5 A# P
  225.         else                        //如果已经晚于格林尼治时间1天则进行日期处理 $ q# ?- J* w5 ~2 N" g7 K+ Q
  226.         {
    5 @8 }9 o" P5 d
  227.             hh    =    hh+GMT-24;        //先得出时间 + @1 s: g1 ~, S% I- E
  228.             if(MM==1 || MM==3 || MM==5 || MM==7 || MM==8 || MM==10)    //大月份(12月单独处理)
    " G. u# e  E' A5 o
  229.             { # h% K. i- a7 s
  230.                 if(DD<31)    DD++;
    3 m6 K  l+ N/ u
  231.                 else
    , U9 T  j% R; }
  232.                 { ; a  G7 N- [% y6 Q/ x
  233.                     DD    =    1; : C5 n" ]+ A0 E
  234.                     MM    ++; " \9 F) v' ^3 Z4 G0 e: \
  235.                 } / ~: }: m& g6 V! w- n; C4 `+ Z- p
  236.             }
    0 p- p" ^/ {2 p8 s3 ~& x& ]& f
  237.             else if(MM==4 || MM==6 || MM==9 || MM==11)                //小月份2月单独处理)
    . c0 R  ^7 |! t1 |) y
  238.             { ' E6 m0 w" F$ {- ~/ x; E
  239.                 if(DD<30)    DD++;
    ) S( [  W2 P* g7 V" R/ w- C
  240.                 else
    3 J& K. t8 Q" M4 o% t- n
  241.                 { 3 c6 n8 O# y- t, g. y7 W6 F  g0 d
  242.                     DD    =    1;
    * `# {) P/ F2 [" F! R1 Y
  243.                     MM    ++;
    8 z0 ]2 {* t+ J$ m* w/ A
  244.                 }
    " z) G6 D6 P7 n" n* e% s6 o
  245.             }
    - G2 c" I' i% O3 ~5 ]* g3 ]) `
  246.             else if(MM==2)    //处理2月份
    8 {; g  B% s" x. j( A
  247.             {
    " y( @  q  ~# L4 z3 L$ W6 T- i
  248.                 if((DD==29) || (DD==28 && IsLeapYear(YY)==0))        //本来是闰年且是2月29日 或者不是闰年且是2月28日 3 T/ z; v7 S0 O8 t
  249.                 {
    1 {; B! ~. V4 d- e+ [
  250.                     DD    =    1; 7 ]% ?. b: y9 o- W
  251.                     MM    ++;
    . n, E( }7 n/ u1 Q' l) }: |/ w
  252.                 } 2 p# Q% Y/ z; s) K/ ~+ z
  253.                 else    DD++;
    % L. l7 a) G# Q; q  T
  254.             }
    . E* C( H1 j2 G
  255.             else if(MM==12)    //处理12月份
    & }' @1 K1 b8 t$ h
  256.             { / h0 d) M2 z) {5 ]
  257.                 if(DD<31)    DD++; ' d: a4 ~0 @! G' F4 X1 p
  258.                 else        //跨年最后一天
    3 Y  f: v) @3 f3 f3 h- Y
  259.                 {               
    4 V4 V$ [7 F* s7 x+ V$ V
  260.                     DD    =    1;
    4 {' E. Y, m/ V- E5 \
  261.                     MM    =    1; 6 b6 y- Y" V( w: w0 l
  262.                     YY    ++; : D9 D6 q; K, K8 Y. D# [0 v
  263.                 }
    - O9 V3 l9 Q+ a- g
  264.             }   I" B& Y$ t8 A: B/ u1 F# f
  265.         } - K' r6 ~' }& |, I' @' J
  266.     } 2 @' I/ F. U& k8 @
  267.     else
    8 r! u, O- X/ N* z  A
  268.     {     . B: u+ o# a8 G; _0 {3 H
  269.         if(hh>=GMT)    hh    -=    GMT;    //如果与格林尼治时间处于同一天则仅减小时即可
    & h7 }: i" j' X) I* v+ k
  270.         else                        //如果已经早于格林尼治时间1天则进行日期处理
    7 H  l# H$ y4 O8 d9 G4 _4 f8 F$ k
  271.         {
    $ {+ V/ T# E. @6 Q; e: v' r# a1 i
  272.             hh    =    hh+24-GMT;        //先得出时间 - y# g+ H4 }; ]5 g, P  W( T/ s
  273.             if(MM==2 || MM==4 || MM==6 || MM==8 || MM==9 || MM==11)    //上月是大月份(1月单独处理) : h2 n$ j6 G  _$ A" H6 Y4 ^
  274.             {
    , t3 ]" |" W( ~8 j( K6 }
  275.                 if(DD>1)    DD--; # h: b4 ]$ U+ v. s; F% d
  276.                 else
    : H( B7 m, |2 x: F
  277.                 { ( D  J; ]' U. a1 U8 y; {6 N9 [
  278.                     DD    =    31;
    # _2 s% r4 K( g: v: }' t
  279.                     MM    --; ) r4 r9 h" ]5 B4 n  ^) a; `
  280.                 }
    5 e0 L5 R3 q$ l6 C6 M4 Z
  281.             } ' k7 W7 l# ]: |4 }8 p+ E
  282.             else if(MM==5 || MM==7 || MM==10 || MM==12)                //上月是小月份2月单独处理)
    . u' J+ v% Y* U4 ^+ t( i1 ]  h4 _
  283.             {
    " K% q! U1 \- P! }! o
  284.                 if(DD>1)    DD--; " P5 I: n' z' R- }7 a( P- j9 p2 B1 I
  285.                 else " v- d6 p6 \) R% b! T6 ?
  286.                 {
    2 o/ m% I5 f* O3 L: ~5 U$ b
  287.                     DD    =    30;
    ( p4 I- D& A+ s9 a1 L
  288.                     MM    --;
    ( ?, M/ u7 [& ?' k* p( |
  289.                 }
    + A# o* O" H* H6 p7 V
  290.             } 4 s5 e" H$ L  i
  291.             else if(MM==3)    //处理上个月是2月份 ) I7 g0 N" M6 [4 B
  292.             { ( m; T1 `# ^" {0 {& ]
  293.                 if((DD==1) && IsLeapYear(YY)==0)                    //不是闰年
    ; h& z  p9 |# M3 q! V$ d2 I4 I. [! f9 F
  294.                 {
    1 U0 C2 F) F0 k- x0 X' v4 _+ i
  295.                     DD    =    28; 9 G5 o8 Y$ w; Q" c+ `2 T
  296.                     MM    --;
    $ h- W& J! Z" G2 T4 n: _6 [
  297.                 } # I3 F& i' [& `# \4 t$ f- N
  298.                 else    DD--; # g3 y) |6 e5 X2 u+ V3 }
  299.             }
    1 h* `$ A- K$ C0 p/ j: Z" R% F% G
  300.             else if(MM==1)    //处理1月份
    * F- s, S  _( c; L" |" }; q
  301.             {
    ! A0 ]% [3 W9 A7 C# E  J
  302.                 if(DD>1)    DD--;
    % o5 i  g' w  F0 W3 ?
  303.                 else        //新年第一天 2 E, Z4 b* o6 U6 D# t+ L
  304.                 {               
    ) Y! U' ~1 d3 g3 a. o8 K$ c% f
  305.                     DD    =    31;
    2 l- y: u7 v/ R
  306.                     MM    =    12;
    7 Z5 F! {5 N/ c$ N6 G' l
  307.                     YY    --;
    7 u1 ~7 G$ _7 L% _& L4 r
  308.                 }
    8 L7 _0 _) t6 ^& i* ]& P1 n5 v
  309.             } ) T  u* B" v1 I
  310.         } 5 A9 y1 \7 D3 R6 M% T
  311.     }         
    ( c0 a' d% A. O4 @' a9 {/ m

  312. + o7 E! X, Y* G3 c7 C) B
  313.     ConvertTime->year   =    YY;                //更新年 + S/ A/ B3 b! a7 Y8 g% }
  314.     ConvertTime->mon    =    MM;                //更新月 - e! o1 `3 p: H
  315.     ConvertTime->day    =    DD;                //更新日 % E/ i7 h  u' {3 D2 v& C- s& k
  316.     ConvertTime->hour   =    hh;                //更新时 / R8 z0 Y' ~3 J2 R# D
  317.     ConvertTime->min    =    mm;                //更新分
    ( ~+ O0 q+ j7 w: b  N
  318.     ConvertTime->sec    =    ss;                //更新秒
    * |  B/ Q6 J2 d. o/ v0 K
  319. }  
    # J# s! u4 U: e

  320. 6 L! B0 ^- y' q2 A

  321. ; x* @2 @6 g0 l

  322. , V* e+ M5 k0 \8 Y9 `

  323. ' C( U8 C5 D# r
  324. % `+ N& P& P) R. a

  325. * k. V- B* Q2 `6 d8 [% q: F7 w+ Z
  326. /*********************************************************end of file**************************************************/
复制代码
nmea_decode_test.c
  1. /**
    & T* l& T8 f1 S. \& A8 [
  2.   ******************************************************************************' c0 U- `. l' Y! L7 p
  3.   * @file    nmea_decode_test.c
    ; a/ {. h; U8 A; `& o  I) g7 v& @
  4.   * @author  fire0 X# t/ S/ c& T) e! Z
  5.   * @version V1.0
    , f$ m+ b* T8 i1 j
  6.   * @date    2013-xx-xx
      L) o. k, Q2 m  W) K
  7.   * @brief   测试NEMA解码库
    , }- @6 q+ l. R$ N/ V- [/ ]
  8.   ******************************************************************************- Y2 y, a& I: U' \( n
  9.   * @attention) a) x! q1 H0 b; l" I
  10.   *
    & v2 e* o! H/ {7 ^3 }' f3 r: r
  11.   * 实验平台:野火 iSO STM32 开发板 6 {* u. T1 S6 I" E* ]- \; Q
  12.   * 论坛    :http://www.chuxue123.com0 w1 N+ ^! H; q9 J
  13.   * 淘宝    :http://firestm32.taobao.com- g- |5 R0 j7 w2 o! R8 n
  14.   *
    ( E* a) B* i( j; z) \
  15.   ******************************************************************************5 R3 ~/ P' d9 T! @5 V
  16.   */ 1 M2 S% D, C/ k" m  W
  17.   $ k7 U0 z# s- H/ ]! p$ S5 R0 X4 H
  18. #include "stm32f10x.h"7 u5 }. N0 m0 j9 f, A# [
  19. #include "bsp_sdio_sdcard.h"
    $ T1 J# U6 |& ~: {/ d. b+ J
  20. #include "bsp_usart1.h"   
    # M0 b  |+ \# |" S$ n6 L0 m
  21. #include "bsp_usart3.h"
    , L/ u- b, R7 q( f( d% Q
  22. #include "nmea/nmea.h"4 Y& n% w  c7 |* K; ~& E
  23. #include "gps_config.h"
    $ R: L$ k' G8 K- h0 g1 \
  24. $ c) U7 N7 q" e9 w) K  G3 a
  25.   0 I$ w, G/ T/ T8 }+ t
  26. % ~# c$ S0 h, O/ c1 u1 \$ Y* R

  27. ) }# f3 M1 L: W$ ~* h
  28. ! f2 E  m% E* ]0 ]( F
  29. /**
    , L+ O! I3 T7 j. [
  30.   * @brief  nmea_decode_test 解码GPS模块信息
    " Y3 F# x% {5 z2 H0 _2 `
  31.   * @param  无
    4 i  ?$ P  g' m/ Z) Q0 ~: e6 g5 @
  32.   * @retval 无
    ( g! n$ O1 ?8 B& v- T
  33.   */
    : [: x& P7 V9 r$ e
  34. int nmea_decode_test(void)//文件中使用的应该是这个函数
    * @! m( G8 g0 F& E' K8 D
  35. {/ [. f7 r/ {  O8 {2 @  }# X2 b; I
  36.     6 F# J, N2 @9 P5 Q$ |, g
  37.    
    + a( Y" i9 L5 }
  38.     nmeaINFO info;          //GPS解码后得到的信息,为结构体7 I; L+ K7 i/ B1 U) C" j
  39.     nmeaPARSER parser;      //解码时使用的数据结构  
    9 \/ s& X! k* V+ Q
  40.     uint8_t new_parse=0;    //是否有新的解码数据标志
    + m& ]- O: g  ?2 `: o* K/ V5 w
  41.   
    3 ^/ ~; ~, c/ J9 a4 t
  42.     nmeaTIME beiJingTime;    //北京时间
    4 \2 o0 f: _9 D" N* E" v2 q4 s( [
  43.         
    : {$ O0 C* `( ?$ F" L3 [$ [# J9 {- h
  44.     /* 设置用于输出调试信息的函数 */
    ( p6 Q+ o; Z# d# M( Y- P
  45.     nmea_property()->trace_func = &trace;
    ) `* V/ s, G  b% Y! n
  46.     nmea_property()->error_func = &error;
    # A+ x  d0 h( v( W  i

  47. ) q/ k+ X- P) |
  48.     /* 初始化GPS数据结构 */
    $ W, }2 q. a: T
  49.     nmea_zero_INFO(&info);
    2 A2 V: U8 a9 o  u3 L# M& @
  50.     nmea_parser_init(&parser);
    3 c6 w0 `5 G) F& R  d8 v( J: \. m
  51.    
      _  V1 b6 Y6 C5 c
  52. while(!GPS_HalfTransferEnd);      7 ]& t2 v1 Y8 S+ Q, c  L/ a6 b2 Y
  53. while(GPS_HalfTransferEnd)
    + a; Q" T' N+ \  `/ ]8 i+ p
  54.   {
    ; h2 x% {( p4 W  W' p
  55.       if(GPS_HalfTransferEnd)     /* 接收到GPS_RBUFF_SIZE一半的数据 */
    ' H2 L, D6 z& Z$ l8 A
  56.       {3 \" |: V8 F6 d5 _' f5 r
  57.         /* 进行nmea格式解码 */
    . w% [/ |1 z' u+ k; `+ _9 R
  58.         nmea_parse(&parser, (const char*)&gps_rbuff[0], HALF_GPS_RBUFF_SIZE, &info);* u1 `6 c6 M7 ?7 i) |# X! V
  59.         
    ! z2 x4 X: |; e7 X6 V
  60.         GPS_HalfTransferEnd = 0;   //清空标志位
    3 A% f; w  {. H- F  w, N9 q1 m  ?
  61.         new_parse = 1;             //设置解码消息标志      ////////////////////////////////////////////
    ) D2 _/ y1 D0 W' \# |
  62.       }7 [( M' q1 f4 k5 b# a* |1 O
  63.       else if(GPS_TransferEnd)    /* 接收到另一半数据 */////////注意每一半的缓存区都足够储存一次完整的GPS的数据,此处不是把一次GPS数据分成两部分;
    4 N6 D: Y2 A- g; b% w
  64.       {* R0 H$ q" F( [7 f8 n/ G3 P  S) z& R
  65. ! X4 n% x' I# {/ Q
  66.         nmea_parse(&parser, (const char*)&gps_rbuff[HALF_GPS_RBUFF_SIZE], HALF_GPS_RBUFF_SIZE, &info);
    ) y: p' a. ]  n
  67.       
    + h, R% @. L. p4 m$ c8 f
  68.         GPS_TransferEnd = 0;
    5 G  b: ?! o  x* j
  69.         new_parse =1;
    9 `# g' u  V. _. d2 Q
  70.       }
    & Y6 j: _( s9 O+ Q3 @4 B2 u7 z
  71.       
    ; U) l# }- P! D9 L
  72.       if(new_parse )                //有新的解码消息   
    . K/ p( ?: p% t6 |4 W
  73.       {   $ b$ ?) F2 Z, t- s/ g$ e" S  l$ q5 y
  74. 1 d/ i# D; ]4 R9 ~0 H7 I8 u
  75.                 zaishichua=info.lat;///////////////////////////////////////////////////////////( v  A% I9 m4 Q# s0 i* l( c
  76.                 zaishichub=info.lon;/////////////////////////////////////////////////////////////+ b- P. |. b) q/ [0 w
  77.         /* 对解码后的时间进行转换,转换成北京时间 */# F( \4 Q3 g8 |. v* e3 T! w
  78.         GMTconvert(&info.utc,&beiJingTime,8,1);# C3 r* X# A  p7 @8 P
  79.         ! J* {# w5 a. \4 L& j
  80.         /* 输出解码得到的信息 */5 W* q3 u: B5 T$ I3 X. [- Z
  81.         printf("\r\n时间%d,%d,%d,%d,%d,%d\r\n", beiJingTime.year+1900, beiJingTime.mon+1,beiJingTime.day,beiJingTime.hour,beiJingTime.min,beiJingTime.sec);* k9 E& G+ B7 d3 q
  82.         printf("\r\n纬度:%f,经度%f\r\n",info.lat,info.lon);
    6 ]. e0 F$ ~/ @
  83.         printf("\r\n纬度:%f,经度%f\r\n",zaishichua,zaishichub);///////////////////////////////////////////0 E  _) ~7 m- ^3 I
  84.                 printf("\r\n正在使用的卫星:%d,可见卫星:%d",info.satinfo.inuse,info.satinfo.inview);
    5 _" j% ^' M  c! p9 E$ j
  85.         printf("\r\n海拔高度:%f 米 ", info.elv);/ w# ?8 k! l9 O/ W/ E/ s
  86.         printf("\r\n速度:%f km/h ", info.speed);
    , J5 k2 |' I5 Q7 y- {
  87.         printf("\r\n航向:%f 度", info.direction);
    ) S& m2 k$ m" F0 ~# V: x: Y
  88.         
    ' }4 q+ t8 Q8 P$ ]( i2 g
  89.         new_parse = 0;" r! e. R: _$ G+ L) u1 \% {+ r7 O
  90.       }/ `9 `+ E" t# ~
  91.     8 t# i. x+ ^6 f, R
  92.     }# t3 x5 v- F, ?, s; ]8 |; |

  93. 5 V  Y$ n7 T4 u
  94.     /* 释放GPS数据结构 */
    , |0 r" C& S+ d* N' ^2 V
  95.     // nmea_parser_destroy(&parser);
      ~3 j! ~4 m% R) G# M. P; t: Z3 [# c

  96. 7 `# L- {$ S' Z, j% @  x! s- i
  97.    
    . l; J( M" f# F8 G* w* {0 @6 D( D
  98.       return 0;  N5 \7 Z$ |5 D$ }
  99. }
    % V" x) M. I  g; V
  100. ' l9 M, h3 M, B( }) J! c5 _
  101. ' M; @$ {: T& E! Z1 O8 D

  102. / |) e+ W3 a5 X; h; ]
  103. 5 J( G; i4 m4 {" h) [9 v+ ]
  104. 5 f& n' L  L4 z( A1 `

  105. : b- q3 h1 m- X7 y0 x- r6 g# R

  106. . f5 a3 [3 L# h
  107. 2 x1 J3 m  i# X$ W* m# G4 K

  108. " y9 `& b8 l: G! H: g. Q: Q
  109. /**************************************************end of file****************************************/
复制代码
% m& j2 L, w* E$ m+ n2 W. F4 \
gsm.c
  1. #include"gsm.h"
    + k% ?7 k3 H% \2 h9 ]  Y
  2. const char num[]="18112728175";//大帅比的手机号
    7 p! W5 L6 ]5 a$ T
  3. int gsm(char *p1,char *p2)
    ! a& E! X9 r" u0 C3 H( L: y
  4. {
    0 r7 U. H6 o3 [" }
  5.     USART2_Config();
    6 z& ?! q) i+ V7 F
  6.     SysTick_Init();
    % n7 J! b' e4 c+ l! A' q: b# K! L: `
  7.     sim900a_sms((char *)num,strcat(strcat(p1,","),p2));
    & X& D3 H9 B# `4 l% n: N0 \( T
  8.         SIM900A_DELAY(5000);               //////////////////////////延时是必须的,因为模块接收信息再传输需要时间$ p5 f2 Q! Y" h4 a& A
  9.         //sim900a_sms((char *)num,p2);% n+ K+ I; r3 O, @- l4 ]1 u
  10.   . D+ x5 h) J' R6 f) T0 P
  11.     return 0;* a3 ]9 i9 l& }& u% ?, v
  12. }
复制代码

4 p. b1 ]+ R  _bsp_SysTick.c% [" r( {% R% x+ H& g0 B
  1. /**
    - C! p! G, g7 c2 @" @% g+ O
  2.   ******************************************************************************! N! U8 X$ C& X7 e
  3.   * @file    bsp_SysTick.c' B/ z, |. u! }7 o
  4.   * @author  fire/ M8 g$ V8 N  v4 P9 j3 a; p
  5.   * @version V1.0: G/ [6 Y: H9 b  Y
  6.   * @date    2013-xx-xx
    8 {7 J7 r6 }8 [  L6 d
  7.   * @brief   SysTick 系统滴答时钟10us中断函数库,中断时间可自由配置,$ P0 A' s$ w! p
  8.   *          常用的有 1us 10us 1ms 中断。     & Y8 A6 y! x. Q! r# A, B
  9.   ******************************************************************************9 t" O4 e1 S% K; P( i6 q6 |3 z
  10.   * @attention* ]9 ]& M: l% d6 X
  11.   *: U3 t. \0 d& L+ U7 }. ]
  12.   * 实验平台:野火 iSO STM32 开发板
    * r$ y+ P  [! k
  13.   *
    : ^) J" I. o8 [- d! R+ \/ u  T( W
  14.   ******************************************************************************
    , d7 Z, D2 ?' n. R6 x5 e5 ]( |
  15.   */  h. |- L" T9 r# C$ V4 [/ ?
  16.   ' V8 y- {7 }) i
  17. #include "bsp_SysTick.h"
    # R! `8 k9 b6 M: Q' N  H

  18. 1 ]5 d7 `+ x$ z2 j- ^. C
  19. static __IO u32 TimingDelay;/ t- _9 R' Q8 X. {
  20. 9 }1 U' }& r1 R) |, ^$ v* H" J! o" F
  21. /**( E, R+ _5 B; `9 z
  22.   * @brief  启动系统滴答定时器 SysTick
    4 f( q0 U# p; Y7 x1 K2 X# P% e  H
  23.   * @param  无
    & Q4 L" x2 ~, Z, S) n
  24.   * @retval 无
    ' |/ G% s  \- z+ C
  25.   */9 `) a, {, c: n1 F1 C9 R
  26. void SysTick_Init(void)( u* T, C. \1 I8 n+ J  F
  27. {
    $ [- z! L5 l3 y+ r; W/ {6 i
  28.     /* SystemFrequency / 1000    1ms中断一次6 b: w- |* L  _: O) p
  29.      * SystemFrequency / 100000     10us中断一次
    9 I% g; e9 ?/ k! u( V; C
  30.      * SystemFrequency / 1000000 1us中断一次
    - t# c' L0 H" l
  31.      */0 |$ J' ?2 l2 D* F( s/ Z, N1 ]% m
  32. //    if (SysTick_Config(SystemFrequency / 100000))    // ST3.0.0库版本
    1 K) f! E6 E& v1 x$ a
  33.     if (SysTick_Config(SystemCoreClock / 1000000))    // ST3.5.0库版本
    0 A6 i/ Y7 n  K$ z+ u( T* I
  34.     {
    % M( c" P; a1 h5 A' \
  35.         /* Capture error */ ) {5 ]- i2 ~7 R2 D2 ^- R
  36.         while (1);
    * X; w: P3 y" d' m% i
  37.     }
    " ~1 l- P6 a6 b; o) Q3 {' k* _( _
  38.         // 关闭滴答定时器  3 }7 @' L  @+ r$ f  Q/ a! C
  39.     SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
    # E2 M1 [2 X$ D: H8 ]8 R( k
  40. }
    7 x# F/ K3 I) @% ^9 @

  41. 2 y5 E9 R8 @1 J" i
  42. /**7 q4 l- j$ Y  e5 v
  43.   * @brief   us延时程序,10us为一个单位
    4 Q. `9 }  d! a0 ~! \' a
  44.   * @param  1 y4 X' n* E/ \! @0 U
  45.   *        @arg nTime: Delay_us( 1 ) 则实现的延时为 1 * 10us = 10us
    8 {1 n. p' s6 c! A7 x( ]1 g0 O
  46.   * @retval  无" r9 u* Y# m- `7 a1 r4 x$ n" D
  47.   */4 |! {8 x) i( ]2 @8 s0 `7 Y8 s
  48. void Delay_us(__IO u32 nTime)- G& L7 g- v) c/ P
  49. {
    4 g) Q! c/ }& t4 r
  50.     TimingDelay = nTime;   
    / R4 \" g* h( I6 e1 @) a
  51. ' Z* e5 e# D6 \- m9 F" C/ b
  52.     // 使能滴答定时器  
    ; ~3 W  |6 W0 f/ e; t3 Y
  53.     SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;
    ; z+ J% o1 V( J
  54. 3 y' E+ G. ^) [3 R% M
  55.     while(TimingDelay != 0);; _# L' ~8 x2 y- _0 E+ c- n8 ~1 k
  56. }$ Q% n3 B% I$ R5 p0 @% _- E

  57. + V+ v# _$ D8 ~4 W# h; G6 x
  58. /**. K3 y* C- y; n4 R; f0 y' a
  59.   * @brief   us延时程序,10us为一个单位5 M* K4 {, n9 f, t
  60.   * @param  
    ! w/ R9 J: j9 _& k0 e$ h
  61.   *        @arg nTime: Delay_us( 1 ) 则实现的延时为 1 * 10us = 10us; t! P6 J0 k9 [- Y
  62.   * @retval  无  X9 R# Y; T! f+ @
  63.   */" g$ w8 q4 f: C9 Z1 q' e
  64. void Delay_ms(__IO u32 nTime)
    $ d7 H5 i5 T4 K' j
  65. { , T! s; `  Z  M4 k/ s
  66.     while(nTime--), g" d0 Z0 H0 q" |
  67.     {
    " t' Z/ n- \! \- R" u$ E1 S* A  V
  68.         Delay_us(1000);
    ! z- F& X1 |3 {) O# c6 m9 r2 Y, W1 f0 B
  69.     }
    , R) m3 o$ R# u% ]! v+ A" A
  70. }. [% z! O# c# V# `, [$ M
  71. , }, O: M6 K' J/ }$ F9 t& [3 u
  72. /**2 p( h- j* Q5 \8 F2 a
  73.   * @brief  获取节拍程序
    . m6 z" d$ x8 ~/ E$ ?7 p1 r- u6 ^
  74.   * @param  无8 c3 a8 L5 }, A8 Q5 E
  75.   * @retval 无( E* a( ?8 g& |6 E/ Z! X
  76.   * @attention  在 SysTick 中断函数 SysTick_Handler()调用
    ' o7 v* l/ W, m* U9 E# H
  77.   */
    / h: o1 p# p+ T  I
  78. void TimingDelay_Decrement(void)& l/ a) O9 C; J: n3 g5 v3 ]$ Y% C* |/ k
  79. {  T9 q0 h. o3 p) ^
  80.     if (TimingDelay != 0x00)
    ) o  @& |7 h+ r' n: W
  81.     {
      V( L% M# W+ l
  82.         TimingDelay--;8 ^8 A. F2 v4 n
  83.     }
    1 O0 p( @. c( z. E
  84. }2 z. ^# u" J4 e8 P9 ~% @8 M0 a3 N
  85. /*********************************************END OF FILE**********************/
复制代码

. T) m" Q% }" t% `
sim900a.c
  1. #include <stdarg.h>) M1 ]* i3 D- g! p6 z) n) v
  2. #include <string.h>
    8 M, Q3 r/ F4 _; D# H7 W# ?+ Y
  3. #include <stdlib.h>$ y; R( [2 v" x$ J
  4. //#include "bsp_usart1.h"
    2 S' R+ g3 y8 g/ ?2 _8 }; t, k. Q
  5. #include "bsp_usart2.h"
    & l9 x: }% C# U6 ?# ~+ K  q" g
  6. #include "sim900a.h"
    # `$ z* D+ H  K% Q
  7.   0 c$ w( [! l3 J$ k) f) d& f
  8. 2 `" E+ J: ^4 f8 x. a* a. @

  9. % m2 q( ?' z0 \, k
  10. void sim900a_sms(char *num,char *smstext)7 y# ]6 R' j4 t2 o: ]7 T
  11. {
    * a2 B! [$ C  T: Z' b* O  R  i0 ~
  12.   //  char ucsbuff[160];; d9 [1 B3 c* h- v( n- G$ r
  13.     SIM900A_CLEAN_RX();                 //清空了接收缓冲区数据
    : X9 c9 q' T5 l5 A: _* {0 E; v
  14.         //英文
    8 X: L: l7 S$ D0 R+ Z4 d
  15.         sim900a_tx_printf("AT+CSCS="GSM"\r");     //"GSM"字符集' C. w- }0 {/ L% b! _  T& W
  16.         SIM900A_DELAY(100);$ z4 S- n( H( R8 A2 r
  17.         
    , O9 g- i9 F) h2 N. q* D
  18.         sim900a_tx_printf("AT+CMGF=1\r");           //文本模式, t, B# b5 E& G( P! s% S
  19.         SIM900A_DELAY(100);6 [, j; G. x* R6 R  D
  20.         
    5 g( G" t6 a( l- Y5 u7 e
  21.         sim900a_tx_printf("AT+CMGS="%s"\r",num);  //电话号码
    ) [4 G( n  ^/ i* f& S& D
  22.         SIM900A_DELAY(100);- L% C' \! Z+ M) p" C5 a  e) t( _

  23. + X) P% @, a5 z' n( U' a
  24.         sim900a_tx_printf("%s",smstext);            //短信内容$ I# ]2 q* u2 n3 R
  25.         //SIM900A_DELAY(100);          # n- a( v; B2 u
  26.    
    : V4 W* z$ c3 h* i) c/ q
  27.      
    0 y# \' |( Q! W& z
  28.     SIM900A_DELAY(1);
    ; G/ ]  @. j& R1 E% R
  29.     USART2->DR=(u32)0x1A;        //发送十六进制数:0X1A,信息结束符号//////////////////(gsm模块中以此为标志位,才发送短信)+ m8 ]5 \4 F/ y0 T7 J
  30. }
    , Q3 C5 Z0 |4 V9 ^7 C
  31. # s" A7 m/ k4 ?

  32. 4 T) b* f2 H( Z

  33. ) Q& f! K2 |$ f

  34. 7 n* \0 M1 ~( X5 o1 {
  35. " J8 d& p( c) g6 s. X, R
  36. /*---------------------------------------------------------------------*/
复制代码
; o* z* |( I6 z, X9 P) ^/ |6 w5 i5 c
收藏 评论0 发布时间:2022-2-3 19:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版