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

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

[复制链接]
STMCU小助手 发布时间:2022-2-3 19:00
总的来说就是实现了一个GPS数据通过串口发送给STM32,
STM32进行解码,
在通过串口把解码提取出的经纬度发送给GSM,
GSM根据给定的手机号发短信过去。
" `3 i& \8 ?" z# _; @6 j
main函数里的最后一个while循环是每隔5s发一个位置出去
延时函数写在sim900a.c里,可以自行调节时间间隔。
就是这么任性。
! |7 w- A: q: O% |
main.c
  1. /*" L6 |! h7 @4 V) N/ \' \/ I8 N2 A
  2.   ******************************************************************************) O* H6 A  }, `
  3.   * @attention8 A8 F( A1 X: }8 R
  4.   *% K$ H, z6 y( ^& H
  5.   * 实验平台:野火 ISO-STM32 开发板
      |' S6 b7 t; G: H- }  U1 K
  6. 8 E' L& e. B3 I5 o& ?, A
  7.   ******************************************************************************$ s# V* U- q2 T9 ~2 w% F
  8.     */) k" u& z- `# v, a% \: l" k
  9. #include "stm32f10x.h"- w9 a" v& P8 r& Y  e( i2 _. j6 ?
  10. #include "bsp_usart1.h"
    ; i3 P2 N8 Z9 w
  11. #include "gps_config.h"
    8 s8 Q/ i/ I  \, u, w9 h
  12. #include <string.h>
    . s8 S* B# z( i$ |& v
  13. #include "gsm.h"
    : u( j# R: `, z# T
  14. #include <stdio.h># y+ H. r8 U8 n; ]+ h% Q

  15. , w2 B" N% x# ]; B. e
  16.         6 C7 J7 w9 [/ l. B/ W
  17. - h) g+ S7 R1 x3 ?/ X4 f
  18. extern void nmea_decode_test(void);
    , b! d3 j" s( C) E; v- n# @  G5 T

  19. ) Z5 R3 ~7 ]0 I2 V$ T
  20. /*
    ! g1 n" c1 J; h! K. e
  21. * 测试GPS模块功能
      H; X, C2 R1 F4 x- L/ t$ _  n
  22. *
    ! B4 L: u4 {% Z9 j6 O
  23. */
    8 s$ |" B6 x* e- X& d6 M: d
  24. 0 ~9 [+ O: m  x! X
  25. # m, S* {3 u0 f2 b9 |8 D
  26. double  zaishichua;
    # T2 K$ T2 J* m
  27. double  zaishichub;+ G3 {" R+ F7 V6 T  L) h
  28. int main(void)
    5 B+ |2 a6 P4 r/ h# u+ P" O4 ~3 D
  29. {( @; U; n  ]! i
  30.     char zaiship1[14];
    , s, k6 h1 \3 [: t
  31.     char zaiship2[14];5 D2 P! w. j$ g& d
  32.     /* 配置USART1 用于向电脑printf调试信息*/
    1 e& h" A" |7 W& K: T/ g
  33.    USART1_Config();                          
    8 V8 ]; x2 o) i# t+ Q8 o: B% V
  34.     /* 初始化GPS模块使用的接口 *// o- ^# p: ?: Y
  35.     GPS_Config();
    + @1 l8 Y3 L9 F7 H' A( r
  36.     printf("\r\nGPS模块测试例程\r\n");8 W1 K& O9 L0 L( T' Z

  37. 4 o1 F: T6 x' X. F$ _7 r
  38.     printf("\r\nGPS模块测试例程\r\n");      /////////////////////////////////
    $ L8 y0 {  D9 [4 n" T3 X6 f& f9 D
  39.          while(1)
    , K9 t2 M- H: E
  40.          {/* GPS解码测试 */
    ; m& _, F, H) K9 O7 i8 U$ p/ R
  41.     nmea_decode_test();8 r4 e" \: {. ^/ C; i* N& X
  42.     printf("\r\n纬度:%f,经度%f\r\n",zaishichua,zaishichub);
    , Y# E, y' ]) [+ v' V
  43.      printf("\r\n纬度:%f,经度%f\r\n",zaishichua,zaishichub);7 S( P9 w- `6 P3 h, O3 I
  44.    + i5 F3 x3 {: J7 k0 E& h
  45. % O9 y7 d( ]* j/ H9 n. a- k
  46.       sprintf(zaiship1,"%013.6f",zaishichua);& y( c( e" ^8 }+ l$ J
  47.       sprintf(zaiship2,"%013.6f",zaishichub);
      c' t* J1 L0 H0 k) C3 ~7 C; {3 g' q  B
  48.        gsm(zaiship1,zaiship2);: P, A3 z( \: X+ m- Z0 x+ x
  49.          }
    # T% V2 E4 q9 Q7 W
  50. . O# [9 ~! G$ B  t) i( m
  51.   
    4 O, K& r9 Q+ `' V$ G9 J( B
  52.   7 `. z! S- g: v" J, d
  53. }
复制代码
2 t! Z6 g4 M$ P( C$ j3 F& q
bsp_usart1.c
  1. /**4 f/ k0 h) s2 _. Q% d
  2.   ******************************************************************************
    ; \7 Y) P$ J: q4 H+ q" V
  3.   * @file    bsp_usart1.c' T0 y$ ~3 l2 K; K5 w" P4 U
  4.   * @author  fire. _& _: ~* X6 ?1 {; G
  5.   * @version V1.0' }/ C$ ?- E% ?
  6.   * @date    2013-xx-xx
      z+ C5 I$ F9 t$ V4 p1 K3 `
  7.   * @brief   重现c库printf函数到usart端口0 ?: c4 L$ _1 D& \. h6 C! r! w) A! m3 U
  8.   ******************************************************************************
    5 }8 G5 {! x  z. J- g( \
  9.   * @attention
    6 S% p9 l( U# Z3 k# p4 S
  10.   *
    ) l5 s( j4 `0 ^: Q) \7 U2 x
  11.   * 实验平台:野火 iSO STM32 开发板
    5 {( ?* @! V6 D" s3 ~! b: m
  12.   *
    ) q! H; V2 H* l( O) X' q
  13.   ******************************************************************************
    3 E% `. H- U8 `) f. s1 A
  14.   */( T4 {, C+ l( X9 ?' V% k" T# o% h

  15.   B2 u  U& A& P# V1 a& l1 K5 @7 F0 w
  16. #include "bsp_usart1.h"/ O2 n# A6 B/ g; F1 _+ N
  17. ! D3 d( ?' g3 i( y9 ~$ R$ Q- b

  18. 3 ?( t% I1 s5 l7 J
  19. /**: k: }3 d$ T3 |  N  n
  20. * @brief  USART1 GPIO 配置,工作模式配置。115200 8-N-1
    ' ]! y7 j1 ]7 Q; I. t- S
  21. * @param  无1 O$ S& Q9 L0 r" P  [. N( l9 h) g
  22. * @retval 无" o7 H+ n. u% u1 A# d4 L# G% F
  23. */5 ?9 D+ c  U; C8 _, H3 u5 T
  24. void USART1_Config(void)% v( @) `9 t  i9 F4 v; z, O7 y
  25. {
    3 B+ P+ D: F- h- n* |/ z
  26.     GPIO_InitTypeDef GPIO_InitStructure;
    ! x" \- l1 o) s1 B
  27.     USART_InitTypeDef USART_InitStructure;
    9 a. c! Z' O. l* W2 E0 @# U: ?) |% h
  28. . ?3 I  Z/ U1 q+ q2 V. ?) z
  29.     /* config USART1 clock */
      ^! y! Y: Z- H) ~6 x% m9 E& T  s
  30.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);" h0 d; Z+ ~& o8 T
  31. 7 X; E# s5 X2 K5 r6 }: r
  32.     /* USART1 GPIO config */& r& W& v5 ~# `! ?  h
  33.     /* Configure USART1 Tx (PA.09) as alternate function push-pull */
    ' L" r8 b/ z* h& c8 ^! d8 w
  34.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;1 n1 v/ b$ e- l8 K
  35.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    8 u" e% g+ b: x. H! }& C8 O
  36.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;. c7 M  j% W4 ?1 Y& F3 k, p
  37.     GPIO_Init(GPIOA, &GPIO_InitStructure);
    # z, F3 d$ w3 [9 y' M# s

  38. ' \& g& t; k6 N
  39.     /* Configure USART1 Rx (PA.10) as input floating */
    ( y6 L* M- T/ r* ^. l  ^- H8 w( W
  40.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    , c  Z5 g2 [( n) O2 _
  41.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;, U) N6 h! m) w' S) a
  42.     GPIO_Init(GPIOA, &GPIO_InitStructure);8 ^" O6 v+ o0 a) O  h6 I

  43. + P; m1 W1 z3 x* k- H
  44.     /* USART1 mode config */( I* l! I% k1 q" ]
  45.     USART_InitStructure.USART_BaudRate = 115200;( ?+ i" z; B5 T
  46.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;5 ~  N9 H2 F' o3 Y+ X
  47.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
    3 ]! J. k% Z* a% m$ C" r/ {# x
  48.     USART_InitStructure.USART_Parity = USART_Parity_No ;
    2 e7 Q% j* g: G$ \4 Z8 Z
  49.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;" Z/ a3 n( z) c! H0 e) g2 D) C, u
  50.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  p6 j. @9 u4 Z, B) O6 Z. a% q
  51.     USART_Init(USART1, &USART_InitStructure);
    " g' e" p' B; n2 Z4 F

  52. 3 v5 k8 N* Y$ i: ]; P6 B
  53.     USART_Cmd(USART1, ENABLE);& o0 E8 y: w% A8 e6 u, e
  54. }
    4 E& r4 Q, o6 l% c

  55. 3 _8 U6 ]# e" O2 v
  56. ///重定向c库函数printf到USART1
    ( p" a# Q+ f, X9 B
  57. int fputc(int ch, FILE *f)
    6 p5 u" w. x" _$ ]6 b
  58. {. ]. D' F, ~) p% |, J* l
  59.     /* 发送一个字节数据到USART1 */
    - S1 W7 n( ~1 e% K1 A  T' u7 O
  60.     USART_SendData(USART1, (uint8_t) ch);
    6 {5 N& f2 \+ [3 ~
  61. 5 R. T: I+ v; Z6 `# ?3 Z5 u, c
  62.     /* 等待发送完毕 */: M/ q/ R* s/ p3 _- Q
  63.     while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);0 S: K: v7 z* T- X% v* [( l
  64. 6 P. n8 a; A. E: u% U
  65.     return (ch);
    8 K) X+ _. A9 X8 o/ n$ c. Z
  66. }& B; G  u+ Z! q
  67. * R. w# v7 w. a# e
  68. ///重定向c库函数scanf到USART1, R# ?$ ?! l: _1 _% P
  69. int fgetc(FILE *f)
    ' _! p- x& a4 ]: ~/ Z" z
  70. {% M& o. c3 t1 V. F7 J
  71.     /* 等待串口1输入数据 */+ R2 {, `3 S: b# U) ?8 N
  72.     while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
    5 G0 ^' o6 ?+ b" W( P* r, B7 m+ t7 b

  73. # _7 |8 x7 E' }7 ^) @  S
  74.     return (int)USART_ReceiveData(USART1);
    : N: n' ~. H3 F1 x9 z: I- N
  75. }8 ]5 }/ C2 }, C0 J
  76. & |0 x( `. D' M1 [4 y# i. _
  77. # {# f4 [4 [, [1 V4 O: S, P
  78. 4 I' y& n' B' D* f
  79. /*********************************************END OF FILE**********************/
复制代码
' i0 f) r1 M( ]1 c5 z
bsp_usart2.c
  1. /******************** (C) COPYRIGHT 2012 WildFire Team **************************: g' o  T9 s: n
  2. * 文件名  :usart2.c' u* J2 P+ i! W: ~2 M! e
  3. * 描述    :将printf函数重定向到USART2。这样就可以用printf函数将单片机的数据
    4 p7 p6 O: `' N/ u$ O% h
  4. *           打印到PC上的超级终端或串口调试助手。         3 Z# G6 v" J  \2 H) d9 o2 s# l
  5. * 实验平台:野火STM32开发板
    5 t4 W* I: o9 A! U5 O1 v3 ~# z% J* ^
  6. * 库版本  :ST3.5.0! E* |$ e& j6 T! k: B6 f0 O
  7. *
    " \0 ]3 `7 g+ Q" x* q- P% M1 i
  8. * 作者    :wildfire team , O5 S/ D( |* q1 }) b
  9. **********************************************************************************/. }$ I0 h2 [! Q0 S
  10. #include "bsp_usart2.h"- F1 ^3 w* i$ `. Y4 B
  11. #include <stdarg.h>
    ' i' V) \  Y; i. \/ I; q; x/ _$ b
  12. - C* f7 S; t' P( Z0 z1 d

  13. & o' ~% h; Z0 A/ ~2 u# L+ [
  14. /// 配置USART2接收中断
    2 v! @( `$ R/ _/ k  O
  15. static void NVIC_Configuration(void); E+ }2 A+ ]! q* E3 X) P. ?5 K2 |7 C
  16. {- J7 j" h" F' t+ c& i3 L. F
  17.     NVIC_InitTypeDef NVIC_InitStructure;4 [& t# `5 Y3 P+ N& L6 H+ c
  18.     /* Configure the NVIC Preemption Priority Bits */$ r% e5 s- y/ J: p
  19.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);3 p" h- [& W& x5 r: e$ B
  20.   J8 ?5 _7 z4 K* _) I( a; L5 W
  21.     /* Enable the USARTy Interrupt */
    & v% B8 S2 `9 ~: U
  22.     NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;5 s3 s& s2 g6 |
  23.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;
    $ o2 H& N( V- g$ Q
  24.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;8 b% z! ^- r# _4 W+ ^2 V
  25.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;. N) ?" g5 ?6 @1 ^# M- s0 ~
  26.     NVIC_Init(&NVIC_InitStructure);6 P) k" j* c" ^! [* I1 e, ?0 ?" u
  27. }4 J) V8 Q' O5 r7 a: O# E0 b! L* d
  28. 5 c( Z! k7 D; t* t; r  F
  29. /*
    6 _; D, |+ {; F- T- @1 C
  30. * 函数名:USART2_Config" W% Q8 @- H/ j1 A6 r- f( i# ~% U- |
  31. * 描述  :USART2 GPIO 配置,工作模式配置* a, U# i9 D4 L& l$ @
  32. * 输入  :无
    " H7 {/ A! d' ^8 I3 S- D
  33. * 输出  : 无  A. C0 Y. j5 L. J1 o' _
  34. * 调用  :外部调用
    9 J2 N! R% U! T8 ^
  35. */
    ) b4 m% ^- Z7 D* V$ p+ D: w
  36. void USART2_Config(void)7 T6 E, n: w7 _" e
  37. {" v; t. C$ \) o1 S
  38.     GPIO_InitTypeDef GPIO_InitStructure;
    7 T' O8 Z  x) W, H- J* `% f
  39.     USART_InitTypeDef USART_InitStructure;
    0 C( h) a  v0 t- K! ~
  40. 4 `* l7 C: K# G6 i+ @1 i; J! H
  41.     /* config USART2 clock */
    7 V& L( B, ?) v8 ]
  42.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
      Z+ f  y* m6 k# ~# ?1 k: Z* @0 `0 [
  43.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);  ^5 u& \+ e2 ^8 |3 k' ^; ?

  44. 0 k0 \  D. Q# g% a, i1 z
  45.     /* USART2 GPIO config */
    ( B) T7 f4 J( g9 r. `, ~! i: g2 K' J
  46.    /* Configure USART2 Tx (PA.02) as alternate function push-pull */
      v! q% o  D/ t8 i4 b! X
  47.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;: d( {' |+ F' {5 B7 Z
  48.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;+ O0 |; b* d* |
  49.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    : _+ w* |3 N6 X$ q# n
  50.     GPIO_Init(GPIOA, &GPIO_InitStructure);" z& ^" h  G- h% [$ `) t! n
  51.         
    : [* r: R' n, f) R9 F
  52.   /* Configure USART2 Rx (PA.03) as input floating */
    + k5 K% l1 `! A: }+ l/ O# Z& }
  53.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;  O0 V/ ]6 n7 W
  54.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    # T5 H  D8 c, p. @& m5 p
  55.   GPIO_Init(GPIOA, &GPIO_InitStructure);
    . K& s7 U* R  H
  56.       
    + `' }7 ]: V4 V2 F, M: w
  57.     /* USART2 mode config */- Z2 f2 Q9 Z( a  U( I4 v1 n. j
  58.     USART_InitStructure.USART_BaudRate = 115200;
    0 N, B3 L; _$ k5 _: H- P/ [0 g
  59.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    7 h/ R3 m: c. p0 {1 T
  60.     USART_InitStructure.USART_StopBits = USART_StopBits_1;4 I  L0 k4 k. X/ {9 F3 K
  61.     USART_InitStructure.USART_Parity = USART_Parity_No ;, K, {4 y0 l: x- g, v
  62.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    ( m2 s- ~$ u, v+ {
  63.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;! Q' {5 k5 @) a- E: n
  64. ' T. z, U$ @% r1 J
  65.     USART_Init(USART2, &USART_InitStructure); # ?" Q0 t8 ?9 \/ ?3 w6 p
  66.    
    / S( d- K0 l* T6 @+ n: z( w
  67.     /*    配置中断优先级 */. L3 m2 R. a7 t0 u4 O
  68.     NVIC_Configuration();
    / c9 U) V0 U4 J2 L: s9 [/ Y! N
  69.     /* 使能串口2接收中断 */
    " _% ~0 U; l9 x  e) Y5 z6 f
  70.     USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
    + q0 x( K: G5 ~: z
  71. 5 b" E% m7 O8 Y7 ?5 y
  72.    
    7 B- U# z0 ?& _/ i0 ~/ q
  73.     USART_Cmd(USART2, ENABLE);
    : I5 i1 m' \. D8 k8 H* I
  74. }
    9 w; i2 M2 Q) B

  75. ( j" M3 a& {& |. T* K9 `
  76. /*( p1 o5 W/ X+ i
  77. * 函数名:fputc0 h+ d6 n( b& c6 W
  78. * 描述  :重定向c库函数printf到USART20 m; k+ g" U& F& |" Z: d
  79. * 输入  :无1 F% w" E; D( m9 s
  80. * 输出  :无
    9 e0 T% I  Z3 S" A( k
  81. * 调用  :由printf调用5 {. l4 C. D0 ?* |) a& ]8 q
  82. */! g2 ~6 `. X; V3 l: D. A
  83. //int fputc(int ch, FILE *f)3 e) [/ {7 s6 T+ F% b$ @7 r
  84. //{, d. y4 @2 y% m' _/ h
  85. ///* 将Printf内容发往串口 */
    " f# G& ]# }0 `7 P
  86. //  USART_SendData(USART2, (unsigned char) ch);: p& G+ |" f4 \1 c
  87. //  while (!(USART2->SR & USART_FLAG_TXE));0 G, t( Z% i& x) r& B; E
  88. // # n, T. `+ j" b6 c$ L8 ^, V/ E
  89. //  return (ch);
      q# z+ N( o% w( {5 V
  90. //}* k: r1 `  M/ ^' L( Z/ j# G
  91. # k* C5 c- ~; @" o& Q2 U3 U, S2 B
  92. /*- ?6 y( `0 d. q  V8 ^4 ?) G* {
  93. * 函数名:itoa+ I8 N) g* }% J# ?
  94. * 描述  :将整形数据转换成字符串! V0 Y% b2 S4 H: J/ x2 ]* [
  95. * 输入  :-radix =10 表示10进制,其他结果为0
    . C' Y- I1 h: i! d& O2 p* x
  96. *         -value 要转换的整形数9 x1 z$ |9 J2 W
  97. *         -buf 转换后的字符串  [  R& `: t8 U; S' o
  98. *         -radix = 10
    1 [# H3 E, `2 V" g- k- f1 Y
  99. * 输出  :无
    ' L& D" K# b, u# [. G
  100. * 返回  :无; O: f3 R& f7 p& u
  101. * 调用  :被USART2_printf()调用2 w; }: \! ?3 q9 D
  102. */
    " V- C8 D) D# B+ W* [' s
  103. static char *itoa(int value, char *string, int radix)6 v) M  Z$ Y4 F- G% D& J
  104. {
    " ?" D% @1 F1 Z
  105.     int     i, d;
    ' q" d% Y& E- z
  106.     int     flag = 0;
    2 K& y% L# G3 m+ E% x$ F) s4 v; b
  107.     char    *ptr = string;
    ; B6 d7 b$ _& m, ?0 y8 Q3 z

  108. 1 G6 `0 a- M0 ], M0 e; ^( _
  109.     /* This implementation only works for decimal numbers. */5 W! Y8 N, J: O/ w$ ~6 ~
  110.     if (radix != 10)
    # V( [! C& h9 m
  111.     {
    8 \3 [. ~5 W! U
  112.         *ptr = 0;
    3 l4 P  ]- o: ^
  113.         return string;" P) b7 ~: O' p
  114.     }- @8 e- s1 e, |+ J# s4 j
  115. ! r) U4 T6 @& ~1 M9 b8 R8 R% N% w
  116.     if (!value)' i4 {# u5 k9 w5 a4 n
  117.     {
      n+ w; _8 L* n, H
  118.         *ptr++ = 0x30;) |) K5 ~1 }4 C7 G7 `8 _' a& o. C
  119.         *ptr = 0;
    ) p4 R/ h2 {; R/ @5 q1 z' D
  120.         return string;1 ~6 I7 S$ ]. W9 [( h
  121.     }/ [' k  x" Z4 C/ a
  122. : X' F5 x9 S5 {% \* S
  123.     /* if this is a negative value insert the minus sign. */
    - l. ]% D0 K4 C* A: t, l' b
  124.     if (value < 0)
    2 m  z* E7 t/ v; I7 t
  125.     {' S+ n+ d9 y9 a7 r% m1 f
  126.         *ptr++ = '-';
    " O5 I( N" s9 p/ A9 o9 y# M
  127. & J" S9 u- Z' k. _, ?
  128.         /* Make the value positive. */* g0 }2 s7 R- E' R6 c- D7 K
  129.         value *= -1;
    - j; o$ P* s" p
  130.     }1 T1 B* P1 W: T
  131. ! T, K* Y7 j( n. R
  132.     for (i = 10000; i > 0; i /= 10)4 s  M, N2 V% M) d* h0 T# g
  133.     {
    0 {$ J' C, y& H* L! r: m' |
  134.         d = value / i;
    9 \' [, r8 v4 n+ F- x

  135.   K9 Z: x) ?, L  v5 s2 L7 K' ~
  136.         if (d || flag)9 x) r# G/ v- v* [1 t
  137.         {
    ) L2 ^4 r; h3 C( B
  138.             *ptr++ = (char)(d + 0x30);7 }- \7 `- C! j% X, Q  Q
  139.             value -= (d * i);
    # E3 O$ r7 L: F5 `7 m" g  U, F) ^
  140.             flag = 1;
    2 M% T, _% N3 |- U; |
  141.         }" S6 \! |: N" g, i+ c
  142.     }6 \4 a+ V% e- `- S, t  Q  B; E

  143. & k* Y* S) z( w) P
  144.     /* Null terminate the string. */1 t5 X+ w8 R6 Y) b! H/ Z: Y
  145.     *ptr = 0;
    * E) S3 [4 `2 w. J* z" u1 g

  146. . v; L1 |# W1 G# s4 V2 B5 w/ h2 K% E+ s
  147.     return string;" O" {; q' v0 w& W3 j( T+ Q

  148. ' i9 P  V, }3 d0 B
  149. } /* NCL_Itoa */
    # T5 ~" k' o5 e/ s

  150. 9 X. [8 d* J, D# g$ N
  151. 6 F2 B# n; P* C% N( C3 s) B; ]
  152. #if 13 F6 w: N" z( r. Y  X$ ?
  153. //中断缓存串口数据
    4 z- G$ G" Z$ I
  154. #define UART_BUFF_SIZE      2550 Z. j- t7 D' c7 ?
  155. volatile    uint8_t uart_p = 0;
    . N( B: d$ [6 a9 b. V
  156. uint8_t     uart_buff[UART_BUFF_SIZE];9 E  n2 f- m( \7 _

  157. 6 O% ^6 A% i+ I8 k
  158. void bsp_USART2_IRQHandler(void)
    ' K& W4 A' f1 K4 }# g  A1 I9 ]# w
  159. {* v' z, w) ?9 J" W+ L* x7 E
  160.     if(uart_p<UART_BUFF_SIZE). Y! k6 \# Z7 W
  161.     {* r5 ?: {* c: ]& M# M
  162.         if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
    , n% g; S5 D/ C  y" Q9 U4 T  D
  163.         {
    $ G$ U: [) s$ U$ S. r4 C/ S
  164.             uart_buff[uart_p] = USART_ReceiveData(USART2);  d6 q4 ?4 O. F7 ]
  165.             uart_p++;
    3 e1 A. t4 y- A# L2 z5 Z, Q. @7 _
  166.         }
    , P* @7 L  L5 D$ _; {/ x
  167.     }
    8 B; B! K5 S1 t; L7 o% p( B  y
  168. }9 R& \1 l3 F$ H' s1 [

  169. * u3 s- Z  Y) u, _( _
  170. & Y" A+ o9 s. c1 V2 s" t% u8 y

  171. 0 C) o4 ?* H5 d# ?( r/ `6 G1 g; c  X
  172. //获取接收到的数据和长度, y8 E/ t! N1 {; e
  173. char *get_rebuff(uint8_t *len)
    & W/ o" o; d: O) `* X
  174. {7 A, D5 ^2 \$ N/ p
  175.     *len = uart_p;
    & I* K8 p( @3 `+ a& L. ]
  176.     return (char *)&uart_buff;- Y3 t; L3 W. U/ |5 h; v
  177. }
    ' V! ]; G) g. |% ~* @& g

  178.   ]& ^. j5 q) e% r, `
  179. void clean_rebuff(void)! w- n. z) C/ o$ X  m: I! Z
  180. {
    + U. j1 l" I$ l
  181.     uint16_t i=UART_BUFF_SIZE+1;7 x  |6 H3 J( O# @( u% A$ ^& M
  182.     uart_p = 0;
    - _# j, d1 Y$ ~
  183.     while(i)
    + m) M9 {& A! W" v9 ~; m
  184.         uart_buff[--i]=0;
    / r5 D9 ]) f" P+ S4 y6 G
  185. }( v, n4 z1 z, n/ g/ [6 {
  186. , P4 X# S3 U4 s/ F& j( y/ N
  187. #endif
    ! l. T5 a& W( d. M3 V

  188. ! b! @3 g6 X/ w( o& [
  189. /*7 I* Q9 f' x+ |2 t4 `1 E9 s
  190. * 函数名:USART2_printf
    * r! v! o- \: l$ v
  191. * 描述  :格式化输出,类似于C库中的printf,但这里没有用到C库5 h9 {( n+ k1 q& G, l" _
  192. * 输入  :-USARTx 串口通道,这里只用到了串口2,即USART2
      x2 D  u$ J- x9 C/ ^; |
  193. *             -Data   要发送到串口的内容的指针; u- q8 A7 K0 [% [5 r, z& r
  194. *               -...    其他参数
    " F- z- g! n  y; |. r( G5 ?: }9 n9 r6 y
  195. * 输出  :无
    ; E9 s2 P' v7 z
  196. * 返回  :无
    ' \2 }( K  Z! b$ q* P/ n: ]
  197. * 调用  :外部调用
    , A5 c$ R3 D" \
  198. *         典型应用USART2_printf( USART2, "\r\n this is a demo \r\n" );
    & p( W. a) Q5 s$ z* Q8 s
  199. *                     USART2_printf( USART2, "\r\n %d \r\n", i );* }1 q7 [$ S3 S0 {6 I1 b
  200. *                     USART2_printf( USART2, "\r\n %s \r\n", j );
    7 }& \: L% ], M
  201. */
    5 B0 t$ ^0 p4 v( ], w  x% v3 `
  202. void USART2_printf(USART_TypeDef* USARTx, char *Data,...)
      s! e, t" w2 _/ g$ l
  203. {
    , g/ F/ V8 s  ]. d
  204.     const char *s;
    / x' l! X/ S' _+ N& H9 d
  205.   int d;   / l, H' h. J' p$ O( H3 X' n
  206.   char buf[16];
    4 S6 A' I5 ]5 D3 F! k' v
  207. % H% A- n2 U2 c; ?
  208.   va_list ap;  w* M" @2 Q2 l9 f- N2 ^, r1 o: |. }
  209.   va_start(ap, Data);
    8 s9 }9 g5 x: M4 e
  210. 1 U2 Q  ^. ]4 N
  211.     while ( *Data != 0)     // 判断是否到达字符串结束符
    1 C! C, j0 l) ^" B' }
  212.     {                                          
    . t  E0 X/ i9 Z
  213.         if ( *Data == 0x5c )  //'\') j! {4 ~% z* Y9 ?$ ?
  214.         {                                      ; g( q7 K2 T7 Y) r9 G
  215.             switch ( *++Data )
    $ W3 Q, p1 \3 w' U$ w& c* g( N$ l
  216.             {) z) i( }+ \& i( @( v+ f4 Y
  217.                 case 'r':                                      //回车符" p. k& @; K1 y& _, {9 Z
  218.                     USART_SendData(USARTx, 0x0d);
    ) W0 E0 M% M; P- ~: @- Q, o
  219.                     Data ++;( L' L( N/ E" D9 ]$ P
  220.                     break;$ P. m' e! A' c+ i
  221. & U& L# e7 Q9 p! J) t0 e" I
  222.                 case 'n':                                      //换行符: g4 [3 ?! ^) _$ j# `' I: [! U/ w
  223.                     USART_SendData(USARTx, 0x0a);    $ H5 d. D2 h, U2 D
  224.                     Data ++;
    4 R0 b6 Y! b4 Z2 S9 o% Y; W; t
  225.                     break;- w6 f  J8 N. N% w9 t
  226.                 - y' h/ R$ H% ]/ |& d* r1 N
  227.                 default:
    4 g. r1 u# ?' j/ X/ T
  228.                     Data ++;$ V8 n8 l) N4 M# r, y
  229.                     break;
    / v  I6 L# f- p5 j- d5 Z
  230.             }             ' K" h% w/ S- `- Z
  231.         }! z. X+ ~& ^- p; u$ }6 Q; ]" j
  232.         else if ( *Data == '%')% l9 }8 }+ _. T2 R7 N! G
  233.         {                                      //
    1 G8 \9 e" A6 l' c7 q. s# @
  234.             switch ( *++Data )
    . z) i" }7 |* r* g6 ^
  235.             {               
    4 M: P; a  q; E
  236.                 case 's':                                          //字符串( i4 o) B3 e# }; s( _3 }
  237.                     s = va_arg(ap, const char *);
    / Q* s* i! w9 O! Z& W. [2 K
  238.           for ( ; *s; s++) 2 A% ~' k" \5 X7 `0 R9 P3 C
  239.                     {
    8 o/ k( v' }$ n% S. x
  240.                         USART_SendData(USARTx,*s);
    ) E) j1 I) M- p$ n
  241.                         while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
    . B4 \+ _! ?3 _* J7 ?
  242.           }
    ' O. G, ^! G# g0 q& i
  243.                     Data++;
    ) G) t0 f) v& x# Z4 I) s7 _
  244.           break;
    * e5 v9 A. K" C7 C  f

  245. 1 b, ]0 S" j9 S8 |" ]
  246.         case 'd':                                        //十进制
    : i. R. G3 V( h2 }: h
  247.           d = va_arg(ap, int);0 B" w8 v0 c. L0 ]6 ?/ D2 P
  248.           itoa(d, buf, 10);) D+ y8 ?2 E2 {, q' ]- v) I
  249.           for (s = buf; *s; s++) " v+ t6 J5 H  Z& @6 L
  250.                     {
    " J% C. m; d2 n
  251.                         USART_SendData(USARTx,*s);
    0 k9 R& O4 Z5 k7 O8 T1 N0 J
  252.                         while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );1 {& ?# A# `5 R2 {) N! c
  253.           }4 S7 Q* p; F7 N5 E5 v! C: L! V. |- E
  254.                     Data++;. D4 f; }+ q/ k% W% ]% h
  255.           break;0 q% `+ F# V' m: a& {  x5 r
  256.                  default:; |5 j: y& Q; d1 M: ^$ i' {3 s
  257.                         Data++;# \+ g1 R$ X' ^1 z8 a6 `" i0 d6 q
  258.                     break;: l* b! |; ?' Y1 R: X) Z" m1 c
  259.             }         
    / Q4 N/ P5 D( s7 s6 C" E
  260.         } /* end of else if */
    * E, @) }& M! M0 O
  261.         else USART_SendData(USARTx, *Data++);4 D( [4 r$ f, Q7 W. D; @$ ^$ q
  262.         while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
    0 f; J4 d. |& `9 k% i6 g
  263.     }
      {; |8 v7 _# k" H
  264. }
    0 k$ X' D$ C# L
  265. /******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/
复制代码

) j1 ?% t" I/ E9 u8 k# |7 |
bsp_usart3.c
  1. /******************** (C) COPYRIGHT 2012 WildFire Team **************************  g' B' ]: [2 R6 V1 s/ s1 |7 [
  2. * 文件名  :usart3.c8 d6 \% d; r8 z- i
  3. * 描述    :将printf函数重定向到USART2。这样就可以用printf函数将单片机的数据3 r, [4 {9 l8 \7 p+ U
  4. *           打印到PC上的超级终端或串口调试助手。         
    " E3 q) j) X8 f+ m
  5. * 实验平台:野火STM32开发
    ; I4 j; t7 c7 Q9 |/ W8 |
  6. * 库版本  :ST3.5.0/ a, o$ S3 A2 K. B3 x% v, }* U
  7. *' ?# W* [) v) V9 i
  8. * 作者    :wildfire team ) `% \: Y  r) _4 S- U) U. T; a5 ^
  9. **********************************************************************************/7 u! e4 t4 G. \0 C/ K9 r
  10. #include "bsp_usart3.h"//头文件要在外面改头文件名,现只将其中内容改为usart3
    , @1 o1 a# g! A! \- M! p$ T5 _
  11. #include <stdarg.h>
    & p, g5 K/ p* Z# M; w( w/ G
  12. * N% }9 s! e: F  \' x: T4 Q8 d
  13. " V; @) G) X& t2 B+ f3 h% X

  14. & S, h1 n5 w# P/ D: G) j- {" J
  15. 6 r- G# ]2 q. A. F. A
  16. /*
    ! G! Y- x) r* e1 k8 u" g
  17. * 函数名:USART2_Config
    . z( f; ?* S5 t) \$ g
  18. * 描述  :USART2 GPIO 配置,工作模式配置) M% p! e# N; A, D2 w/ W( o; m
  19. * 输入  :无
    9 m( ?* {: i/ O' X& N2 q$ B2 B: c
  20. * 输出  : 无: ?* q8 u8 u9 C9 H
  21. * 调用  :外部调用# `6 {. H( e' t/ N: w' D! U
  22. */! v- u! s9 `8 ^, L1 g# P. C$ `
  23. void USART3_Config(void)/ ^+ c2 O" l' y* S6 F- G
  24. {
    / Y2 c; Q5 K( Y, y- T+ B" h
  25.     GPIO_InitTypeDef GPIO_InitStructure;* Q- b+ Z7 e( v
  26.     USART_InitTypeDef USART_InitStructure;# P" V; |1 u0 p+ F
  27.   |$ M; B7 t* i- H% f# [
  28.     /* config USART2 clock */) F1 k& w) |3 Q" j6 e7 T& k
  29.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//此处也要修改,修改为GPIOB
    + i& C9 C0 y1 A
  30.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);) x9 q+ e% O0 L5 [# F

  31. # C) j$ D, p8 I9 w3 h
  32.     /* USART2 GPIO config */
    $ A' e2 W# t3 P) |* m" t
  33.   /* Configure USART2 Tx (PB.10) as alternate function push-pull *///此处改为b10# J1 \! @9 ?$ C" h1 V$ J5 {
  34.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;1 }# M% z1 F5 T, z" x7 w5 }/ F
  35.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    8 t7 ~1 R+ ^# f* X* ~  M2 |' b9 J
  36.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    7 o" }( E- ]* Y' t7 _
  37.   GPIO_Init(GPIOB, &GPIO_InitStructure);) k5 D  F' h3 I8 i$ W* q, J
  38.         
    ; |) r& t+ p% ~
  39.   /* Configure USART2 Rx (PB.11) as input floating */ //此处改为b11
    % }' u" ?! Z/ g: E1 f4 ?7 L4 Y
  40.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    2 z7 D7 S& ~. ^( ]4 p' B" j
  41.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;7 N* W2 N& d$ }1 w9 b7 V
  42.   GPIO_Init(GPIOB, &GPIO_InitStructure);
    + i3 [( m& |7 T% e! c
  43.       8 V1 l! U% m4 f; R
  44.     /* USART2 mode config */
    ! Y7 V# U; h: {1 k9 D
  45.     USART_InitStructure.USART_BaudRate = 9600;                //GPS模块默认使用波特率:9600# P$ E+ j/ `5 }; G
  46.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;3 |0 E8 X4 ^1 g* X/ w1 b
  47.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
    ) d& @8 l* a# W" ~0 E1 k
  48.     USART_InitStructure.USART_Parity = USART_Parity_No ;
    8 i, \# E8 s6 C& c- I2 P  ^% o
  49.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    2 S' p. L7 J, ]" c- k
  50.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    : W  _, R3 ~0 G5 g3 e
  51. 7 ?4 T  P6 \2 Q$ e; E: ]! j% K. D
  52.     USART_Init(USART3, &USART_InitStructure);
    % |5 b1 o9 v- m9 _7 p
  53. ' Z- \. M/ W1 V5 i  Z; l
  54.     USART_Cmd(USART3, ENABLE);
    % l  y! `! M/ G1 ]/ N
  55. }
复制代码
# p* {0 q) K- I* p  R( s5 r
gps_config.c
  1. /**) F5 H& ?3 `+ n# G( w
  2.   ******************************************************************************! Y) a* Y6 U- B6 P& q
  3.   * @file    gps_config.c( ^: I/ x, X9 L: Q
  4.   * @author  fire8 Z7 S4 v/ W$ q% Z6 R5 {
  5.   * @version V1.0/ n2 u5 a! {+ @! |0 I: E" W! h
  6.   * @date    2014-08-xx* ~0 Y8 F4 g3 L7 G) E4 J* O; M
  7.   * @brief   gps模块接口配置驱动; ^- d& H  G3 A
  8.   ******************************************************************************& W1 S: D) |; j; `& s/ s
  9.   * @attention
    6 b* B- p/ _, _
  10.   *
    9 B; t, ]; o0 l) L( R
  11.   * 实验平台:野火 ISO-STM32 开发板
    8 F: q$ @* b- ~: @/ L) g9 ~
  12.   *) I0 }) g8 D, n
  13.   ******************************************************************************
    % E* b. O8 q( N: F- q
  14.     */
    , F  R$ m% i$ ]+ y; V; n4 B

  15. 4 j- P1 |! c2 q: B& ?
  16. #include "gps_config.h"! m3 J* u' d2 F
  17. #include "bsp_usart3.h"
    * S& E7 b; }& V# ?) x# f2 Q
  18. #include "nmea/nmea.h"
    3 `+ ]4 Z: R! y
  19. ; U9 }" J$ ]1 `* Z; E; @) v
  20. % |/ e& N: d  C0 v& `# m- k  B5 M
  21. /* DMA接收缓冲  */6 T- X/ p6 c+ Z5 N' C3 |; A, x0 l
  22. uint8_t gps_rbuff[GPS_RBUFF_SIZE];
    0 j5 k) u, d4 u( X$ q" A
  23. , n. x/ m# t$ n- I9 a' ]' {8 @
  24. /* DMA传输结束标志 */
      Q+ V) a: v8 B' f* ?" P
  25. __IO uint8_t GPS_TransferEnd = 0, GPS_HalfTransferEnd = 0;  D: v: X+ j7 k4 X. o8 X

  26. + M* {4 e5 E8 M: q

  27.   J% M! k5 h0 A4 i8 F8 ^

  28. ( N2 Q$ M9 X( d! n: A# t) f
  29. /**6 I' X# s) [  @1 }: s5 l2 D
  30.   * @brief  GPS_Interrupt_Config 配置GPS使用的DMA中断
    3 T$ S+ @5 W' p+ i
  31.   * @param  None.3 P$ O' E: x! n+ F2 A* h+ R
  32.   * @retval None.( j) w- T2 U/ E  k: S
  33.   */
    8 q3 H& n( m/ d3 h5 e* T- |4 N
  34. static void GPS_Interrupt_Config(void)
    5 S8 M. G" M2 b5 J
  35. {: Q$ L& N; z" R. k: \# M
  36.     NVIC_InitTypeDef NVIC_InitStructure;+ d" a0 J( T! S0 ?3 o: Y( e, s1 Y
  37. 1 V1 C" t+ r' Q1 \- ]! A' i
  38.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);: D  m9 y' k$ U  c6 |+ j$ _$ G
  39. 4 k1 ?5 T$ q  f+ c7 u7 `
  40.     // DMA2 Channel Interrupt ENABLE
    2 `* i3 ~- y9 T( {
  41.     NVIC_InitStructure.NVIC_IRQChannel = GPS_DMA_IRQn;//中断用的是RX不是TX啊啊啊啊fuxx!!
    % c9 |3 w7 A( w7 X( C2 r
  42.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;! H& h$ A2 F* a) M8 G7 K' D
  43.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;3 X. V7 S/ v3 a
  44.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    4 D$ ?% g3 s- p. N3 B3 i% x: p& K
  45.     NVIC_Init(&NVIC_InitStructure);2 V& f- c4 u8 O" c- f
  46. 0 x" @  Z9 ]* p
  47. }
    / W1 M2 W. J  Q6 A; G
  48. / q4 L0 F8 U, n" [' q# h  k$ P3 D% H4 q
  49. ! k; N" s  s" {' e8 h/ L0 d
  50. /**# _2 G1 J' a% @! Y3 ~: ?
  51.   * @brief  GPS_ProcessDMAIRQ GPS DMA中断服务函数: x1 Z+ P: P& o5 F
  52.   * @param  None.
    ! @2 l' \5 \4 n8 v& K# I
  53.   * @retval None." R5 \; p0 R+ \! n) u
  54.   */
    + Y$ {" [1 s5 h, u: e" E0 g1 I6 A
  55. void GPS_ProcessDMAIRQ(void)8 b$ b2 L( H( q3 ]% G# {- A6 p
  56. {/ P% {- U4 C" v+ S: B: V( g; f# ~
  57.   
    1 D; h! h6 ~5 i4 D' t
  58.   if(DMA_GetITStatus(GPS_DMA_IT_HT) )         /* DMA 半传输完成 */( @5 p& r; P6 i; }( n# Z
  59.   {
    + s5 Z: M8 X* S; @; X7 w, ?) s: p
  60.     GPS_HalfTransferEnd = 1;                //设置半传输完成标志位5 e4 j$ G9 Y3 G0 g- V" n+ D/ Y
  61.     DMA_ClearFlag(GPS_DMA_FLAG_HT);
    * ~3 L/ @& V$ {8 }7 L# `" a
  62.         * x( Q1 c4 A% Y  n
  63.   }' I& R: {# @+ m. s* a. r
  64.   else if(DMA_GetITStatus(GPS_DMA_IT_TC))     /* DMA 传输完成 */
    ; X7 J. T# s4 g0 x1 o6 H6 M3 j
  65.   {1 w- {/ `$ S5 {8 ]
  66.     GPS_TransferEnd = 1;                    //设置传输完成标志位
    " u4 H8 a3 `+ b% W7 Z2 q" M) W3 e6 D
  67.     DMA_ClearFlag(GPS_DMA_FLAG_TC);& _( e. U9 l0 K

  68. % o0 F4 q* j* c6 O' D/ x( D
  69.    }5 U! k6 g1 X1 L) S
  70. }6 x0 `- y6 r6 t! E

  71. 3 E( v% r. {% ^. r2 T# _; m* H$ u

  72. % |( v; g! n* A, @, M
  73. /**
    # F# ^# d& F: V
  74.   * @brief  GPS_DMA_Config gps dma接收配置" ?5 Y( r' d4 y# C2 w! \* A- X3 }
  75.   * @param  无' o' z# c; ]6 S! I" G$ y0 I: G
  76.   * @retval 无* K0 H1 P! P  e1 e% ?) Y
  77.   */; U$ `6 I# c' P; j* f
  78. static void GPS_DMA_Config(void) //其为一个函数9 I+ R# v7 D; e) [- W5 q
  79. {2 x. f# S* ]- D  Z
  80.         DMA_InitTypeDef DMA_InitStructure; //定义一个DMA_InitTypeDef类型的结构体,名为DMA_InitStructure% u) a) k& N$ G. Z2 F
  81.    
    % Z# S+ j! O4 S$ t% }0 o
  82.         /*开启DMA时钟*/9 f" s" m+ l- \1 B& g) A5 R/ `0 G
  83.         RCC_AHBPeriphClockCmd(GPS_DMA_CLK, ENABLE);
    7 y- `3 u; [2 M# n1 g( F' V
  84. ! T* l' Q, W/ H
  85.         /*设置DMA源:串口数据寄存器地址*/
    0 t7 P) I1 n& Q
  86.         DMA_InitStructure.DMA_PeripheralBaseAddr = GPS_DATA_ADDR;       //带点号为结构体内的成员,可直接赋值,相当于变量& U3 a' H$ W' x. p+ n
  87. //从该处进入gps.config.h可见,gps的串口通信定义为USart2,我们可从这里修改( D7 j) s# t* E$ A  [
  88.         /*内存地址(要传输的变量的指针)*/
    . A" M3 P5 ]9 l9 k2 Y
  89.         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)gps_rbuff;( A) b! Q3 G' M- q% N2 O
  90. / L- I/ |( E3 O6 R  V+ r
  91.         /*方向:从外设到内存 */        0 j: S% y1 c/ i- R
  92.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;   
    0 A# S4 C" ?2 w9 n

  93. + I2 e/ B* V; t3 t
  94.         /*传输大小DMA_BufferSize=SENDBUFF_SIZE*/   
    9 K; {: M* I, M0 Y6 J. t0 k8 b
  95.         DMA_InitStructure.DMA_BufferSize = GPS_RBUFF_SIZE;
    9 j2 g6 a0 J1 U- I! w+ F. m
  96. 1 b7 i- x9 @# D$ u8 K
  97.         /*外设地址不增*/        # ]5 S$ s, P2 V7 V! Q7 Z
  98.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //想修改可直接找到相对应的名字修改% i( ~" I7 D  \- l1 W/ Q$ Q

  99.   _) x5 n! ?8 S. @3 e& I# I
  100.         /*内存地址自增*/
      X8 ]% s! F2 ~+ |( o
  101.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;      d& K' O5 n$ G7 y7 o
  102. 9 [  \5 \+ i& W( z. f$ N  {! f! ^
  103.         /*外设数据单位*/   
    ' |6 r4 Y6 d4 \5 F
  104.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;% k  a9 j/ ?$ z, V

  105.   \: }1 y6 ?3 D3 f: s) l
  106.         /*内存数据单位 8bit*/4 Q) F: e+ U7 q2 \9 i( e) Z
  107.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;     * N& ^) V/ [1 ^) V9 q( J# [6 L5 @

  108. - ~1 u% s4 A. y# J) Q) ^8 t
  109.         /*DMA模式:不断循环*/) z) {  l4 z, w
  110.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;     ; z4 c5 T  m. m+ j$ Z

  111. 3 o# l. Y3 g0 H
  112.         /*优先级:中*/   
    ' @2 y4 M) m, w7 q0 Q. ?, i8 W, _; a
  113.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  & U: w! W+ F) r; ^3 ~* S

  114. " N3 U% g- j/ U/ s4 Z
  115.         /*禁止内存到内存的传输    */* z4 H9 \& w, F1 H( _6 v" h0 Y
  116.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;6 s) v" b2 D# h
  117. 1 ?- Q9 g& M# L& }
  118.         /*配置DMA的通道*/           6 D* N/ C" l- V4 v7 U, e
  119.         DMA_Init(GPS_DMA_CHANNEL, &DMA_InitStructure);        & _5 a3 b3 a( F3 B! F
  120.    
    1 Z- C6 F0 Z( W" H5 v5 }& Q
  121.     GPS_Interrupt_Config();
    # S: p% O( R* o& u
  122.         ' x% e& _7 e2 z' }* x' V9 t
  123.     DMA_ITConfig(GPS_DMA_CHANNEL,DMA_IT_HT|DMA_IT_TC,ENABLE);  //配置DMA发送完成后产生中断
    . z- u! ]/ b4 d4 v; c
  124. " F0 k/ T$ f* E
  125.         /*使能DMA*/
    . i8 Y) Y$ `; @6 K) K/ Q
  126.         DMA_Cmd (GPS_DMA_CHANNEL,ENABLE);        - d% ~; O$ z5 ]* [0 u
  127.     " [* W8 F& ?+ u; Q( ?
  128.     /* 配置串口 向 DMA发出TX请求 */
    $ N; {; w3 L" ]# f( N- G3 i. X
  129.         USART_DMACmd(GPS_USART, USART_DMAReq_Rx, ENABLE);
    # w- P- ?9 s1 B6 y" ?. g" T
  130. ! M0 r' \6 X, d2 u3 J8 E+ U, L
  131. % k- Y4 k2 @5 Y- K1 X
  132. }
    + W; H, L4 o& }, z8 O& i

  133.   k  E& |/ p% d! \3 [( s% a
  134. /**9 L" B7 N# c8 ]1 [/ M7 @
  135.   * @brief  GPS_Config gps 初始化
    ' ~# b2 _/ t1 u3 J" b( _' t
  136.   * @param  无$ J0 `2 z0 i! D( o/ N6 U1 _3 G$ D
  137.   * @retval 无
    / T$ p+ t+ G1 @* ?8 t
  138.   */
    . ]; F+ {, b; R+ S- f7 B
  139. void GPS_Config(void). C, L4 z) a& h
  140. {1 N& v0 ]# t+ x$ x% Z8 B+ p9 Z
  141.   GPS_USART_INIT();   //初始化串口$ e3 K; y: e% e$ `8 Y" x
  142.   GPS_DMA_Config();  //初始化串口配套的DMA模式. B% [3 e8 M) Z1 N# `3 O4 ?
  143.   
    1 _5 I3 x9 P5 i
  144. }3 \, n$ ^! Z2 S* L' `; L" b- N

  145. / d6 Y* M# C# L3 j  ]
  146. + ~; X/ y+ ~# K+ S$ K" S4 r' t6 f
  147. - k7 d% W+ i& |* F
  148. /**: B5 `! T0 A+ L) t, S; p
  149.   * @brief  trace 在解码时输出捕获的GPS语句& C& a. m+ e8 @7 Q
  150.   * @param  str: 要输出的字符串,str_size:数据长度
    + o* ]9 s* D5 l9 S- x" N2 ?' y
  151.   * @retval 无
    1 ]0 M7 ?: k0 C* q
  152.   */0 v9 e$ F* A" J% r1 |
  153. void trace(const char *str, int str_size)/ I; M2 f% t/ E) f$ U+ I* f" g0 M
  154. {
    / a. l( K  b! {* z! X" h
  155.   #ifdef __GPS_DEBUG    //在gps_config.h文件配置这个宏,是否输出调试信息! L: x6 @: }1 R! m0 j6 ~( t
  156.     uint16_t i;
    ( E+ g3 o7 t$ K; x$ p
  157.     printf("\r\nTrace: ");$ ^  o  h9 e  p
  158.     for(i=0;i<str_size;i++)
    2 s  m! L: A  }$ p5 D! o6 w
  159.       printf("%c",*(str+i));' O$ ~: \( R8 T& L: C0 c8 y+ |
  160.   : E( x4 v/ t  [( @3 Y3 r
  161.     printf("\n");5 N% ^" D% }! Q. U$ Y$ Z2 e7 I( g# X- J
  162.   #endif+ i' R* f+ U3 F) b0 d6 W- W4 _
  163. }6 M" i4 {# z; j: J- T" e4 z# D
  164. 9 H3 H5 O5 Y8 s
  165. /**
    7 q) ?. g  U8 k, |  H
  166.   * @brief  error 在解码出错时输出提示消息1 ]* _0 ]: m, i& n
  167.   * @param  str: 要输出的字符串,str_size:数据长度" X' }1 p/ Z* U3 o" E; J3 v
  168.   * @retval 无
    3 u1 o5 p2 H  c
  169.   */0 T" J% F& x: _7 E
  170. void error(const char *str, int str_size)
    + ?  \$ p8 @1 `! Y5 o: V* ]
  171. {
    - x" l0 ~# B( F# m: c. s
  172.     #ifdef __GPS_DEBUG   //在gps_config.h文件配置这个宏,是否输出调试信息
    - G- u) o9 Y. b3 L3 C
  173. ' x( S4 @; L$ n: \+ {+ t
  174.     uint16_t i;
    2 X. ^# Y/ D$ g/ v" H+ |3 J
  175.     printf("\r\nError: ");
    7 B0 K* i# r( \- Y2 a+ V
  176.     for(i=0;i<str_size;i++). M0 [1 i* j! G3 J! L1 l5 R
  177.       printf("%c",*(str+i));
    4 A6 o. }$ K2 u+ i' ^, n
  178.     printf("\n");
    % h7 @+ s' _( E) |0 B
  179.     #endif
    2 t7 h4 K8 p* Z
  180. }& }  o. A; R; c; y- F& [: g; ?

  181. . F  O. a- t1 X6 n
  182. & I/ f5 v2 m/ q# g0 ^; o

  183. $ ]1 q, m; A1 S2 G
  184. /********************************************************************************************************
    9 D  D1 M; b8 |( j4 \
  185. **     函数名称:            bit        IsLeapYear(uint8_t    iYear) - ^* R$ Y/ Z0 x4 r: w! [9 z
  186. **    功能描述:            判断闰年(仅针对于2000以后的年份) 0 M/ w- h; O& P/ G3 p' J& v
  187. **    入口参数:            iYear    两位年数
    - c/ A6 X( `' W. @
  188. **    出口参数:            uint8_t        1:为闰年    0:为平年 / x/ b4 D2 L- p
  189. ********************************************************************************************************/ ; m9 L) a3 s" S7 u0 `
  190. static uint8_t IsLeapYear(uint8_t iYear) ( x, p* |+ g6 x9 i, @
  191. { * e' q: b5 `8 d, @
  192.     uint16_t    Year; 5 D. x9 b4 M( @. u1 v& `6 n9 v
  193.     Year    =    2000+iYear; 6 E- Q4 G' q" V% p& I  R
  194.     if((Year&3)==0)
    / }" }9 X/ J0 R& {. E4 ~6 y' B, P
  195.     {   e- |3 `$ z. k
  196.         return ((Year%400==0) || (Year%100!=0));
    5 ~* {- a! X( e1 Y3 j
  197.     } 8 r: W6 T, P& N
  198.      return 0;
    * j- z% @* }2 b  V# L) M6 f- \
  199. }
    + k8 D* P2 o9 H- G
  200. ) \* \& l- z1 @
  201. /********************************************************************************************************
    / D. Q" @8 R# o7 ^& F5 [* M
  202. **     函数名称:            void    GMTconvert(uint8_t *DT,uint8_t GMT,uint8_t AREA) % h/ o9 o; F  ]: f& e) |3 o
  203. **    功能描述:            格林尼治时间换算世界各时区时间 " J+ b* o: U$ A
  204. **    入口参数:            *DT:    表示日期时间的数组 格式 YY,MM,DD,HH,MM,SS
    " ]. [. H9 `4 P  h& R4 G; R8 e
  205. **                        GMT:    时区数
    % N' [; u' U" e- {. U9 w( ]
  206. **                        AREA:    1(+)东区 W0(-)西区 ) b& q% w% n" Q% V$ |
  207. ********************************************************************************************************/ 7 j  q" S4 E3 W
  208. void    GMTconvert(nmeaTIME *SourceTime, nmeaTIME *ConvertTime, uint8_t GMT,uint8_t AREA)   Q: G6 E+ k$ Z/ T% I: k
  209. {
    ( ^2 c. |% K( H
  210.     uint32_t    YY,MM,DD,hh,mm,ss;        //年月日时分秒暂存变量
    8 U5 S8 z: D2 _( K$ X$ \
  211.      * x- G9 p4 C( {/ q+ p) O, J' o4 i1 \
  212.     if(GMT==0)    return;                //如果处于0时区直接返回 7 j% B  Y7 N4 j& ]+ r
  213.     if(GMT>12)    return;                //时区最大为12 超过则返回         % K, o8 T9 \! V
  214. ) }; C% E3 K/ N& f) O* U
  215.     YY    =    SourceTime->year;                //获取年 & e& a5 w9 C. F  S! e7 T+ {3 V( Z
  216.     MM    =    SourceTime->mon;                 //获取月
    , P: l- j: P. G" h
  217.     DD    =    SourceTime->day;                 //获取日
    # K2 R9 o3 S  A9 `: g0 {$ H
  218.     hh    =    SourceTime->hour;                //获取时
    0 S6 r" g% E9 U! B) C+ N+ C3 O" V
  219.     mm    =    SourceTime->min;                 //获取分 , e: R+ D0 J( L0 V
  220.     ss    =    SourceTime->sec;                 //获取秒 ' P* T. O( Z* U5 Z! k7 `

  221. 1 b/ t+ V2 |, K# W& |' R5 }" j
  222.     if(AREA)                        //东(+)时区处理
    * U6 }6 B' j! i. p
  223.     {
    $ w7 ?4 g+ [2 G* X& k6 ^# ^
  224.         if(hh+GMT<24)    hh    +=    GMT;//如果与格林尼治时间处于同一天则仅加小时即可
    $ W5 d) `% I8 z8 G. d5 u9 a; |4 i) H
  225.         else                        //如果已经晚于格林尼治时间1天则进行日期处理 * T( _% F" |- `( M3 y& @  q* c9 t
  226.         { $ g5 e: w1 r* k: H
  227.             hh    =    hh+GMT-24;        //先得出时间
    + d" ^4 f  `1 t1 K! D( T
  228.             if(MM==1 || MM==3 || MM==5 || MM==7 || MM==8 || MM==10)    //大月份(12月单独处理) # x  d! S8 g/ [; B
  229.             { 3 X" n8 P; B" r
  230.                 if(DD<31)    DD++; : f) q1 s) [% {3 k
  231.                 else $ }7 K7 \2 U1 a7 a: w2 r
  232.                 { % E5 n5 D- g  |$ i, z- e
  233.                     DD    =    1;
    ! m$ q4 v" q) m$ c/ t6 Q; Y
  234.                     MM    ++;
    4 |3 ?- w* k  _+ m' I5 M& A
  235.                 }
    " x/ A* q' P! d* o* j
  236.             } & i8 u3 O; N0 q3 F! U& W6 V
  237.             else if(MM==4 || MM==6 || MM==9 || MM==11)                //小月份2月单独处理)
    7 c# l+ b1 Q) j  |) N, b5 Y! D
  238.             { + e8 M: C; U& {, r
  239.                 if(DD<30)    DD++; 0 ?$ C$ e* ?5 B7 W) g
  240.                 else
    ! [$ \; b  U& b' T! d
  241.                 { ! S/ ]8 d0 S, m, y8 V5 V( M
  242.                     DD    =    1; ; P0 }0 i$ ^+ Q
  243.                     MM    ++;
    ! n2 C2 u! b( o6 |
  244.                 } 3 P+ R4 O4 E* F+ ~3 _) y  j
  245.             }
    , P) w% E/ v9 S8 M
  246.             else if(MM==2)    //处理2月份 1 a9 \1 b* G1 t6 O# D3 e- |
  247.             { / G& D* k! r8 m: B
  248.                 if((DD==29) || (DD==28 && IsLeapYear(YY)==0))        //本来是闰年且是2月29日 或者不是闰年且是2月28日
    - o, \6 L- z& B
  249.                 {
    9 D! {" t* B' L' V6 R; D+ @9 j4 M
  250.                     DD    =    1;
    & \- p! {5 n' V6 a/ [6 v
  251.                     MM    ++; 9 N  m4 @/ O3 o' o& A
  252.                 } , _7 ^5 T, t2 A
  253.                 else    DD++; ( y4 j  {: H5 @
  254.             } 5 d; _, k, L6 ^/ c) W2 X/ H( Q
  255.             else if(MM==12)    //处理12月份 # Y" ?) o1 |+ R. h( p1 P
  256.             {
    - b2 D" D3 c# K5 P# {) i
  257.                 if(DD<31)    DD++;
    " R8 q( D* j4 W& s3 n
  258.                 else        //跨年最后一天
    * {9 y0 u5 e. K! M% [8 n
  259.                 {               ! O  L4 b; J7 E" T# L
  260.                     DD    =    1; 1 [1 b; E2 ~0 Z- P
  261.                     MM    =    1; $ P  S5 e* ^' P& K2 W, k- F
  262.                     YY    ++;
    2 u) z; V. u0 K+ h, ?5 L( k
  263.                 }
    " F; }0 M# f" l& s7 V
  264.             } % D$ s! v6 c, x' y8 ?
  265.         } . A' Q3 l0 P9 z! b: r
  266.     } 9 m$ p1 b1 B8 E5 Q1 u
  267.     else ( ~, M" \% J' j" `. w' p3 Y* z3 ]
  268.     {     
    7 F  H1 u+ [  v  g# k, {% V* M
  269.         if(hh>=GMT)    hh    -=    GMT;    //如果与格林尼治时间处于同一天则仅减小时即可
    7 ^8 U, [' s; S; n
  270.         else                        //如果已经早于格林尼治时间1天则进行日期处理 4 ^- k  t. }' U" T5 ]2 g
  271.         { ; X- n# z' M& B; [- r
  272.             hh    =    hh+24-GMT;        //先得出时间 6 J" W6 i' t" H1 L/ j
  273.             if(MM==2 || MM==4 || MM==6 || MM==8 || MM==9 || MM==11)    //上月是大月份(1月单独处理) 4 P7 \1 `" Q0 h
  274.             {
    - }1 i; p8 U% g3 J) a
  275.                 if(DD>1)    DD--; - r; Q. E' ]: a5 U0 ^! c
  276.                 else 9 I' I1 K5 v  n3 j
  277.                 {
    ) ]) ~6 y. }  S* W( B
  278.                     DD    =    31;
    # m. v' j9 v9 S1 z
  279.                     MM    --; & U; Q* s4 n; L# \/ u' g
  280.                 } + }5 H% B+ ~; F, @
  281.             }
      i) a; H& O0 N! C$ U4 I' O
  282.             else if(MM==5 || MM==7 || MM==10 || MM==12)                //上月是小月份2月单独处理)
    ) D% f, L( o, |: r+ k
  283.             { . q4 ~' j4 u% t* \6 q
  284.                 if(DD>1)    DD--; ' f0 P9 Z6 n- U! [/ a0 w% a" M
  285.                 else
    ' N! `, b' f4 @$ V7 @
  286.                 { ; d- P3 a4 z9 x
  287.                     DD    =    30; - X8 Q( C% `' O% @! o- l% S
  288.                     MM    --;
    # {) u: n: I' \( {. N2 o
  289.                 }
    0 t0 Y- T1 ]% t3 w% M" Z2 m
  290.             } 3 a4 q" o0 U6 x  x. o
  291.             else if(MM==3)    //处理上个月是2月份 9 w5 `3 R9 }; h) p; w
  292.             {
    5 K# @) l$ l" u. [
  293.                 if((DD==1) && IsLeapYear(YY)==0)                    //不是闰年 , d& _& |* P+ N( s0 p; `
  294.                 {
    1 w( ?0 w8 p% E% H3 \% \# s( g: }
  295.                     DD    =    28;
    # [0 \2 b, v# o6 }7 K4 U0 F0 w
  296.                     MM    --; + M/ |. H, Z* h! d3 k& B! p
  297.                 }
    ) l: ]) A* I( p' h4 J. l# f
  298.                 else    DD--; 2 N$ O9 z: Y% `- M% }4 q$ B
  299.             }
    ' q7 P+ t3 a2 d- N2 r% p- f
  300.             else if(MM==1)    //处理1月份 & N4 r, D3 v8 B6 n
  301.             { 9 n1 T5 u1 ?3 \# g; W/ A+ g( i
  302.                 if(DD>1)    DD--; " }1 f. u3 y( ^* |. J; V! i
  303.                 else        //新年第一天 + o' {: U8 v9 [/ k4 E4 L/ P& e5 ~
  304.                 {               5 _" n; ^( p; \7 q- j5 _( C
  305.                     DD    =    31;
    & w  l9 R3 n* W) ?9 I
  306.                     MM    =    12;
    2 i$ x% Y  f4 L1 L; ]  \
  307.                     YY    --; ; S" K  q0 C( n
  308.                 } 1 h7 k5 d- B+ S( C/ W1 X
  309.             }
    % w. @  b. E$ J! Z' y. j3 r
  310.         } ; b) H. n) r3 C  I2 J0 T4 n% h
  311.     }         , |- I: ^5 \7 `+ H/ c8 V
  312. / q8 v( L7 E0 H8 }8 l. e- q
  313.     ConvertTime->year   =    YY;                //更新年 ! d4 m, R/ Q6 M/ [; Y5 `3 B
  314.     ConvertTime->mon    =    MM;                //更新月 - S5 S! j0 Z3 [# H. g  m. A
  315.     ConvertTime->day    =    DD;                //更新日 % N3 E: O. E0 f8 V2 j3 A# u
  316.     ConvertTime->hour   =    hh;                //更新时
    3 j, @2 Z0 A/ \
  317.     ConvertTime->min    =    mm;                //更新分
    ( t2 G) N4 T. Z8 t$ e0 q& z
  318.     ConvertTime->sec    =    ss;                //更新秒
    # _; \1 g  ~  E9 u* Q; H
  319. }  6 K& x, g  g6 F- S% d; F

  320.   o7 x; Q% {4 C4 N5 A  f- M
  321. / [; x# m+ [7 y# l6 a
  322. + H9 E  V) R' T
  323. " W% _$ ]8 _' x2 R) t, q

  324. 3 E" [3 Q3 l# _( n

  325. : o5 q) t4 o9 N- E9 M% X
  326. /*********************************************************end of file**************************************************/
复制代码
nmea_decode_test.c
  1. /**
    0 s; E$ z- t: s
  2.   ******************************************************************************
    # j8 e( }: u0 q& V7 o6 s
  3.   * @file    nmea_decode_test.c
    & {) r* h- b2 V  l& `5 B
  4.   * @author  fire
    ' S" [2 m* r1 j% V. y5 a( _2 w
  5.   * @version V1.0
    : v! a' b) y8 y2 @
  6.   * @date    2013-xx-xx" g% Q: d  [  ^+ q# d
  7.   * @brief   测试NEMA解码库3 k5 T- U: P2 z% x, p2 {
  8.   ******************************************************************************
    % C8 W. y6 T0 f/ U! @- b( f
  9.   * @attention
    5 j# D% c: o$ m; y
  10.   *; }) ]2 [% T% D. t9 y/ \3 U8 M
  11.   * 实验平台:野火 iSO STM32 开发板
    8 b! P  w8 _' o, z4 ~
  12.   * 论坛    :http://www.chuxue123.com% j5 x- i8 t7 |7 {; p& L8 N: f
  13.   * 淘宝    :http://firestm32.taobao.com) n1 i3 N1 Y+ s! T' u) V2 \# x
  14.   *$ K) E+ x; w8 b3 Z7 _! u4 a
  15.   ******************************************************************************+ M  \  H' L* v* s1 C% ^( @5 o
  16.   */
    + ~/ K, ^, g! |) y* K
  17.   
    - \+ Z9 U) y( m8 C
  18. #include "stm32f10x.h"( U0 r& N% Q( f2 Q! ]# ]& W8 R
  19. #include "bsp_sdio_sdcard.h"
    " e3 N# z- E# {6 J% x3 t  w' r
  20. #include "bsp_usart1.h"    - f$ Z2 M: B0 @$ s
  21. #include "bsp_usart3.h"' A# i* T; v$ y8 N+ {/ n
  22. #include "nmea/nmea.h". L' }8 U$ c! D1 T
  23. #include "gps_config.h"
    - u6 d# D& h( e- g+ s7 W: z* r5 x% X
  24. - N/ y1 I. G7 R3 \3 `: |$ g2 y: G
  25.   + s" E- w! r5 w1 E
  26. / b. t+ B  ?8 v
  27.   H: e  j* i1 w# ^
  28. / ]; q1 |4 x' G
  29. /**; b  H6 b# \" y" Z
  30.   * @brief  nmea_decode_test 解码GPS模块信息# o# v# T8 t* S. z+ x& ?4 c
  31.   * @param  无
    : e7 P. _# d) S* b5 w2 i% c
  32.   * @retval 无$ e8 J2 ?! |/ `: v
  33.   */
    ( Y* r, k& e/ U) p& V  s
  34. int nmea_decode_test(void)//文件中使用的应该是这个函数
    1 V# ^& c( z: N9 X: l
  35. {
    3 s, Y. o: m6 [0 \/ }/ R
  36.    
    4 n0 L) h( B" U4 T
  37.    
    ' p2 y+ V. ~4 [( F  _
  38.     nmeaINFO info;          //GPS解码后得到的信息,为结构体
    & @, ?6 J! H. p% H6 ^! g) C
  39.     nmeaPARSER parser;      //解码时使用的数据结构  2 N. J; e  E( P& }
  40.     uint8_t new_parse=0;    //是否有新的解码数据标志
    7 [4 q. ?% H: e+ V$ v  [
  41.   
    9 P- [/ s7 H- G6 m
  42.     nmeaTIME beiJingTime;    //北京时间
    9 Z1 |( K! J# q: H, ^9 i1 b: Y
  43.         
    : m7 R) E$ _; G" k4 B- @
  44.     /* 设置用于输出调试信息的函数 */
    7 y, [: _2 F  a
  45.     nmea_property()->trace_func = &trace;
    6 c9 G7 k9 Y- z" R: S7 D" X
  46.     nmea_property()->error_func = &error;
    5 o/ E9 C, ~4 {# U/ i) v1 I% w
  47. ! _4 `! g  z. P) n$ O
  48.     /* 初始化GPS数据结构 */, z6 ], W+ j" i6 Q) p2 Y" S9 W4 z
  49.     nmea_zero_INFO(&info);
    ' p8 R' f9 H# x8 d0 S0 Y
  50.     nmea_parser_init(&parser);
    - }' S& T1 z6 ^% ]6 t  ~+ h3 d
  51.     ! f/ ^; w. A' Q& M
  52. while(!GPS_HalfTransferEnd);      
    ' p  V! h0 }1 l% J. r4 z& @  A
  53. while(GPS_HalfTransferEnd)
    7 l2 A6 b, c. t1 _( y
  54.   {
    5 T' N9 J' r9 t( A
  55.       if(GPS_HalfTransferEnd)     /* 接收到GPS_RBUFF_SIZE一半的数据 */
    ! P* s( L9 V; h/ V& K: Y  T
  56.       {+ ^; v4 ~8 I. d- ]4 J5 t
  57.         /* 进行nmea格式解码 */. B" H) Z' \' X( G& P* Y
  58.         nmea_parse(&parser, (const char*)&gps_rbuff[0], HALF_GPS_RBUFF_SIZE, &info);3 u8 k8 U, X+ F5 |
  59.         0 R: @; K! @. M& f
  60.         GPS_HalfTransferEnd = 0;   //清空标志位
    / c8 U+ x5 c' T6 m: S; x$ i
  61.         new_parse = 1;             //设置解码消息标志      ////////////////////////////////////////////: A: H' {; ~4 f. D. Q* f% r" O
  62.       }' m( h+ S' K0 J& g7 J, k+ ]
  63.       else if(GPS_TransferEnd)    /* 接收到另一半数据 */////////注意每一半的缓存区都足够储存一次完整的GPS的数据,此处不是把一次GPS数据分成两部分;
    6 [% d+ h0 |: @" f1 z
  64.       {
    ) i$ i/ w+ ~  e
  65. 2 S3 t+ x6 w) A6 o8 d5 g' ^
  66.         nmea_parse(&parser, (const char*)&gps_rbuff[HALF_GPS_RBUFF_SIZE], HALF_GPS_RBUFF_SIZE, &info);+ n* w6 A% o$ r/ T$ n. O
  67.       
    0 y1 z' N3 _/ e8 u0 F2 a
  68.         GPS_TransferEnd = 0;# x) m& ~$ L, d6 S
  69.         new_parse =1;! ]  x% N  W1 M/ e
  70.       }
    / m* U6 R! N8 X" R- m& ~
  71.       & g2 r8 r4 I) f$ N' {9 y
  72.       if(new_parse )                //有新的解码消息   9 ^/ d3 j( s" f9 c
  73.       {   . q9 k) `7 I2 ~2 Z0 q6 j9 |7 P
  74. ' _# Q( \* H! d5 \; x$ ~
  75.                 zaishichua=info.lat;//////////////////////////////////////////////////////////// e" x8 N- e! x- E: A" E6 Q9 n
  76.                 zaishichub=info.lon;/////////////////////////////////////////////////////////////
    - b% d! Z8 v: k9 d; z0 J+ K; S% g- a. x
  77.         /* 对解码后的时间进行转换,转换成北京时间 */8 a) \0 y. Y# K
  78.         GMTconvert(&info.utc,&beiJingTime,8,1);7 C# e1 c7 s5 N2 K1 N6 h' D- R
  79.         ; J$ i0 J' Z8 o6 v
  80.         /* 输出解码得到的信息 */$ J2 A* a4 [3 V1 r% ]; ^' X9 [
  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);" c+ a6 A" L& L6 J: ?  n1 ^
  82.         printf("\r\n纬度:%f,经度%f\r\n",info.lat,info.lon);4 w4 \) @0 O% K$ F
  83.         printf("\r\n纬度:%f,经度%f\r\n",zaishichua,zaishichub);///////////////////////////////////////////8 u7 H5 K$ U* d8 r
  84.                 printf("\r\n正在使用的卫星:%d,可见卫星:%d",info.satinfo.inuse,info.satinfo.inview);  K" L$ F: \3 e, E5 G; ]
  85.         printf("\r\n海拔高度:%f 米 ", info.elv);
    1 o# x2 D% d& C, u; n1 R. \
  86.         printf("\r\n速度:%f km/h ", info.speed);) v9 Y* V! l3 f
  87.         printf("\r\n航向:%f 度", info.direction);
    ' O) e3 P$ u, Z9 K
  88.         
    . |% l4 s* j* K5 v
  89.         new_parse = 0;* ^7 k# I! D* n" U7 u/ N
  90.       }5 ?: T2 x. G5 j2 G/ c$ C; |" k6 ?% |
  91.    
      N; _( H5 Y9 g$ G5 F5 Z
  92.     }
    3 k! C, j8 X: k0 |0 a
  93. $ y8 n) v# P# d" \
  94.     /* 释放GPS数据结构 */
    . ^- t( k) N- L4 p$ f+ L" [
  95.     // nmea_parser_destroy(&parser);
    1 g5 u. f# P3 u
  96. : w  B7 w% Z( M1 ?
  97.    
    , u3 s; z6 ?2 p6 O  o
  98.       return 0;
    6 B) `1 t/ ?( H5 o: J' p6 ]
  99. }
    7 D6 |( K1 Q# [4 ?4 y7 O- d- {

  100. # q4 W. N4 E' c+ W: K

  101. 3 c% ^! E& p) S7 B  ]% R

  102. " h5 U  g1 z7 k: f$ S7 K8 A, _# n

  103. , g; @- z; e2 ~

  104. : J9 S7 g0 A; P4 I7 @

  105. # Z/ f, Q3 D0 m- `- G$ `9 @
  106. % Q8 r5 G  ^0 S
  107. 8 R) L+ ~2 b9 M3 T
  108. ( P- E7 m6 k1 f- ^2 T, }
  109. /**************************************************end of file****************************************/
复制代码
; q3 I% j/ w6 X# _
gsm.c
  1. #include"gsm.h"
    ; ^' a4 e: u% w
  2. const char num[]="18112728175";//大帅比的手机号
    6 Q/ W8 B  B5 u4 N0 z
  3. int gsm(char *p1,char *p2)
    5 Z' _( Y0 D8 S8 R8 h! `. l
  4. {! Q/ `/ R! `$ m/ K) Z8 s
  5.     USART2_Config();% K# Y0 U0 S5 R5 I0 a2 a# V
  6.     SysTick_Init();
    2 t  g4 X9 P1 @; y5 x5 h
  7.     sim900a_sms((char *)num,strcat(strcat(p1,","),p2));
    ! W, a$ j- P! X! t. D
  8.         SIM900A_DELAY(5000);               //////////////////////////延时是必须的,因为模块接收信息再传输需要时间
      W# {) p5 e& |0 u- |
  9.         //sim900a_sms((char *)num,p2);" Y% o3 e+ W1 ?) \# t
  10.   * }$ m( W: w  _7 f( _/ K
  11.     return 0;
    % m' ^0 e, J, \8 M8 _) s9 z
  12. }
复制代码
* j: E/ m, [8 q3 N/ \1 q
bsp_SysTick.c9 O! C' D1 ^& u3 p
  1. /**0 W5 N! R+ u* l) B3 C( l1 Y3 e
  2.   ******************************************************************************. O1 F$ q2 h7 z
  3.   * @file    bsp_SysTick.c; ~% s9 Z, |9 ~5 B' E  N' [
  4.   * @author  fire4 O" J1 v: e, ?1 M9 V% H3 ^. B  f
  5.   * @version V1.0
    . q0 j0 }0 T7 y/ ^
  6.   * @date    2013-xx-xx
    % N# B& \5 A2 H, M1 O
  7.   * @brief   SysTick 系统滴答时钟10us中断函数库,中断时间可自由配置,
    9 n9 i7 I" M, z( M: d4 T. |
  8.   *          常用的有 1us 10us 1ms 中断。     
    1 s) g/ S0 v5 A( Z% {, z
  9.   ******************************************************************************" A* Y* X' i. ~0 p# M% J
  10.   * @attention* j" I) r6 W" a+ I2 g
  11.   *: o3 n" Q# ~9 ^0 P' Y' Y+ A9 p! @& z) g
  12.   * 实验平台:野火 iSO STM32 开发板
      n0 F$ S6 e5 \
  13.   *
    4 Q# Y! O, U1 ]
  14.   ******************************************************************************2 p* X2 j) [3 r3 s3 m0 M( k7 j
  15.   */+ p; ]- s* i# M$ L$ A
  16.   
    : T7 Z! F- v& H* C1 S
  17. #include "bsp_SysTick.h"
    ! \3 ?  ~9 Y0 Q/ n* Z5 K3 O
  18. # ~) o9 z/ D9 j2 Q
  19. static __IO u32 TimingDelay;
    & F# z0 ?% a# r( E, M  k. h
  20. 0 S/ f1 K. j* n" B  D  c- l! i* K# l
  21. /**
    # T4 [: l/ ]* H" m
  22.   * @brief  启动系统滴答定时器 SysTick8 a" @# W$ l, d6 E2 R! ^3 y
  23.   * @param  无
    . H$ O  X' V9 q1 G. F& Z3 Z: T
  24.   * @retval 无
      Y7 ^' \& J- K' N" W$ R7 K
  25.   */3 R0 U& f$ B  K3 {) W- z
  26. void SysTick_Init(void)
    $ v4 d& T' G% y' g" G$ n
  27. {
    0 b0 ~1 ~+ H: b$ t- r3 t
  28.     /* SystemFrequency / 1000    1ms中断一次
    7 R; h, p9 Z0 ]
  29.      * SystemFrequency / 100000     10us中断一次$ J( R& R% O& e* t; ~# u
  30.      * SystemFrequency / 1000000 1us中断一次) @1 w3 S9 v8 a
  31.      */8 v8 j0 H( i6 I9 J
  32. //    if (SysTick_Config(SystemFrequency / 100000))    // ST3.0.0库版本
    ! ?( _9 V* f0 C  D. M  d2 U* g8 [
  33.     if (SysTick_Config(SystemCoreClock / 1000000))    // ST3.5.0库版本
    ; x) ~- @; M" l7 z: f9 x" ]9 E
  34.     {
    * K( E+ i0 _* w, K# I' S+ d$ [
  35.         /* Capture error */ 5 b( `. L& c! x, }9 a2 r% [
  36.         while (1);5 f. V( }2 y$ f7 ~
  37.     }' n  Z+ l" m5 M/ L/ K3 k$ O# z
  38.         // 关闭滴答定时器  
    - Z2 {+ `; y; l+ {/ G
  39.     SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;" [8 k1 }8 e, J# m3 w0 ?, |
  40. }
    9 @5 t* i7 |: _6 O1 Z: d. l7 `

  41. 8 m6 ]2 {9 e0 |  S/ J
  42. /**
    , V5 C6 a3 Y" X- b
  43.   * @brief   us延时程序,10us为一个单位  ]7 w. r1 c1 T' r4 |5 y: d
  44.   * @param  ' D# Q% Q+ ~9 w
  45.   *        @arg nTime: Delay_us( 1 ) 则实现的延时为 1 * 10us = 10us
    0 i* g  {5 w% I1 B7 G
  46.   * @retval  无& b0 M7 {2 o' X& L2 c+ }% Z
  47.   */
    8 k$ D/ G& {. \
  48. void Delay_us(__IO u32 nTime)
    0 c: p% c- W% Y; Y7 ^# Q" e8 J: {/ {$ [
  49. {
    " g5 E7 m9 T2 O+ \; I! w
  50.     TimingDelay = nTime;    , C7 r0 v' B$ S0 g6 w  M7 ~1 c
  51. 8 j4 `# U) R5 J% J. Y+ e. L
  52.     // 使能滴答定时器  
    0 d  y8 ?9 D+ _. i) X
  53.     SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;4 z. `- H, I$ S, ~
  54. ; B# z* `6 g9 h+ j
  55.     while(TimingDelay != 0);
    $ V$ T5 o( B" b+ _& H( D5 W% x5 V- |
  56. }
    ; e2 Q2 L; p' k  V
  57. 3 S1 L1 L! R0 b4 i! ~8 z' R# f
  58. /**: o/ n0 Z5 u/ ~' C4 i/ A: f
  59.   * @brief   us延时程序,10us为一个单位9 H6 T. \  u7 c1 [1 c% Z: ]
  60.   * @param  ' ^: x, E7 z' f* M3 q) }  r" `
  61.   *        @arg nTime: Delay_us( 1 ) 则实现的延时为 1 * 10us = 10us
    9 v- D. g) d$ d( d9 y
  62.   * @retval  无
    # m" G# \& Y6 ]3 p, I
  63.   */
    7 a& K  E8 `4 t- ]2 A( I6 H& G
  64. void Delay_ms(__IO u32 nTime)
    3 m  N; s  k. v0 r$ M! ?; C( J2 o
  65. {
    ! d9 G! s8 k& B$ N! k* @/ K5 C
  66.     while(nTime--)
    & `7 M* _  M) Q! K( W5 ^: s0 t
  67.     {
    8 d4 S% k; c! |* l" w1 K0 O% |
  68.         Delay_us(1000);
    " ?. J# g: E  U6 u% a0 D
  69.     }* p" z/ }1 C! r7 T
  70. }5 u7 Y& G$ {' [: W/ `! q& K

  71. : _5 d& Z8 i# T3 v9 m6 K
  72. /**
    6 X! }5 O2 B4 u4 p. m( E% i0 `
  73.   * @brief  获取节拍程序; x! S: I: B4 q9 T
  74.   * @param  无
    4 e4 s6 I8 `+ k
  75.   * @retval 无
    0 G( H, [& U& z/ \9 `, [" p0 p
  76.   * @attention  在 SysTick 中断函数 SysTick_Handler()调用6 W5 _3 S2 s% k  l  Z
  77.   */
    " u3 c& @3 I4 @% ~, q3 L# X9 ~
  78. void TimingDelay_Decrement(void)
    , u5 T$ M, l+ s" A9 z4 @1 |
  79. {' c7 D7 S8 `; J# {: f# m! b
  80.     if (TimingDelay != 0x00)4 ?( X1 j( I$ s7 b0 G' p
  81.     {
    2 a! G1 b* [: h6 I; }9 D4 ~1 |
  82.         TimingDelay--;
    , O( @9 H2 K7 S- ^
  83.     }" i, b. N+ C+ d0 |# R  l
  84. }# J, q( Q) N! X: a. E2 D
  85. /*********************************************END OF FILE**********************/
复制代码
0 s8 ^$ b: O& Z  h# h6 O4 X
sim900a.c
  1. #include <stdarg.h>
    ) m9 O1 a- Y5 U: x
  2. #include <string.h>
    * Y* u+ p) R; {( W3 S# C
  3. #include <stdlib.h>
    4 Q& d" z, T9 o( L$ N
  4. //#include "bsp_usart1.h"  I- f3 u$ _9 w8 K1 [+ o
  5. #include "bsp_usart2.h"
    . d# b3 q1 d. U( S' {
  6. #include "sim900a.h"  Q; H' i. w5 e
  7.   ; O  x- L& n, P* {) M+ |! p

  8. . P* L1 A8 S8 j9 ?" B1 ]- A6 F# t

  9. ; ~# U, n: [# q) ~" m# V
  10. void sim900a_sms(char *num,char *smstext)
    ( [* b: c. f" e' m) j  V
  11. {& y' d6 K, v% g! Y+ g' {# [
  12.   //  char ucsbuff[160];
    6 N+ d( b$ b; x& [3 a/ U. N5 @$ t
  13.     SIM900A_CLEAN_RX();                 //清空了接收缓冲区数据6 `6 l# g& G. j$ [/ J; I# U1 K9 w
  14.         //英文
    & r0 N% l4 t7 W5 C" [, P
  15.         sim900a_tx_printf("AT+CSCS="GSM"\r");     //"GSM"字符集
    * i1 S8 x2 k, g
  16.         SIM900A_DELAY(100);
    0 k7 ]# D, x2 n7 i* A% f" x& U( P
  17.         + L7 ~2 N3 u# o7 B, N$ e$ c7 {
  18.         sim900a_tx_printf("AT+CMGF=1\r");           //文本模式" I: U# x  h, I& U( `; Y7 Z# G, t$ s8 k
  19.         SIM900A_DELAY(100);
    8 N$ J$ `; {8 O5 B% a
  20.         7 o( R3 r3 A1 S  [' P5 E) W5 @
  21.         sim900a_tx_printf("AT+CMGS="%s"\r",num);  //电话号码* g6 F; p6 Q$ F# K
  22.         SIM900A_DELAY(100);
    ( E; d4 Q$ s0 D: H! u4 ~9 k
  23. ) a" ^: s- w- {! x7 l) d9 e
  24.         sim900a_tx_printf("%s",smstext);            //短信内容3 u8 i. r( ]2 n. s
  25.         //SIM900A_DELAY(100);          8 H4 x7 [. R: b" @. v, b
  26.     3 E( Z4 y8 h! s" V- b
  27.      1 T: k" e/ E/ @# J1 F4 Z
  28.     SIM900A_DELAY(1);
    ! \# |6 s% B* \$ B) j
  29.     USART2->DR=(u32)0x1A;        //发送十六进制数:0X1A,信息结束符号//////////////////(gsm模块中以此为标志位,才发送短信)
    # s/ `% |8 @7 [, c$ J
  30. }7 n1 p& m" I0 }! Z5 L+ _' h

  31. ( f" E+ r9 `: X
  32. ' y# r& |4 d, y

  33. 7 z- ^" ?' C, x

  34. # P- m. ]8 G1 S# {" f
  35. % x9 {$ l: u2 i! o2 U% _: F
  36. /*---------------------------------------------------------------------*/
复制代码
9 r% _/ L& {* H2 u( m) u3 x3 B% Y
收藏 评论0 发布时间:2022-2-3 19:00

举报

0个回答

所属标签

相似分享

官网相关资源

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