总的来说就是实现了一个GPS数据通过串口发送给STM32, STM32进行解码, 在通过串口把解码提取出的经纬度发送给GSM, GSM根据给定的手机号发短信过去。 " `3 i& \8 ?" z# _; @6 j
main函数里的最后一个while循环是每隔5s发一个位置出去 延时函数写在sim900a.c里,可以自行调节时间间隔。 就是这么任性。 ! |7 w- A: q: O% |
main.c - /*" L6 |! h7 @4 V) N/ \' \/ I8 N2 A
- ******************************************************************************) O* H6 A }, `
- * @attention8 A8 F( A1 X: }8 R
- *% K$ H, z6 y( ^& H
- * 实验平台:野火 ISO-STM32 开发板
|' S6 b7 t; G: H- } U1 K - 8 E' L& e. B3 I5 o& ?, A
- ******************************************************************************$ s# V* U- q2 T9 ~2 w% F
- */) k" u& z- `# v, a% \: l" k
- #include "stm32f10x.h"- w9 a" v& P8 r& Y e( i2 _. j6 ?
- #include "bsp_usart1.h"
; i3 P2 N8 Z9 w - #include "gps_config.h"
8 s8 Q/ i/ I \, u, w9 h - #include <string.h>
. s8 S* B# z( i$ |& v - #include "gsm.h"
: u( j# R: `, z# T - #include <stdio.h># y+ H. r8 U8 n; ]+ h% Q
, w2 B" N% x# ]; B. e- 6 C7 J7 w9 [/ l. B/ W
- - h) g+ S7 R1 x3 ?/ X4 f
- extern void nmea_decode_test(void);
, b! d3 j" s( C) E; v- n# @ G5 T
) Z5 R3 ~7 ]0 I2 V$ T- /*
! g1 n" c1 J; h! K. e - * 测试GPS模块功能
H; X, C2 R1 F4 x- L/ t$ _ n - *
! B4 L: u4 {% Z9 j6 O - */
8 s$ |" B6 x* e- X& d6 M: d - 0 ~9 [+ O: m x! X
- # m, S* {3 u0 f2 b9 |8 D
- double zaishichua;
# T2 K$ T2 J* m - double zaishichub;+ G3 {" R+ F7 V6 T L) h
- int main(void)
5 B+ |2 a6 P4 r/ h# u+ P" O4 ~3 D - {( @; U; n ]! i
- char zaiship1[14];
, s, k6 h1 \3 [: t - char zaiship2[14];5 D2 P! w. j$ g& d
- /* 配置USART1 用于向电脑printf调试信息*/
1 e& h" A" |7 W& K: T/ g - USART1_Config();
8 V8 ]; x2 o) i# t+ Q8 o: B% V - /* 初始化GPS模块使用的接口 *// o- ^# p: ?: Y
- GPS_Config();
+ @1 l8 Y3 L9 F7 H' A( r - printf("\r\nGPS模块测试例程\r\n");8 W1 K& O9 L0 L( T' Z
4 o1 F: T6 x' X. F$ _7 r- printf("\r\nGPS模块测试例程\r\n"); /////////////////////////////////
$ L8 y0 { D9 [4 n" T3 X6 f& f9 D - while(1)
, K9 t2 M- H: E - {/* GPS解码测试 */
; m& _, F, H) K9 O7 i8 U$ p/ R - nmea_decode_test();8 r4 e" \: {. ^/ C; i* N& X
- printf("\r\n纬度:%f,经度%f\r\n",zaishichua,zaishichub);
, Y# E, y' ]) [+ v' V - printf("\r\n纬度:%f,经度%f\r\n",zaishichua,zaishichub);7 S( P9 w- `6 P3 h, O3 I
- + i5 F3 x3 {: J7 k0 E& h
- % O9 y7 d( ]* j/ H9 n. a- k
- sprintf(zaiship1,"%013.6f",zaishichua);& y( c( e" ^8 }+ l$ J
- sprintf(zaiship2,"%013.6f",zaishichub);
c' t* J1 L0 H0 k) C3 ~7 C; {3 g' q B - gsm(zaiship1,zaiship2);: P, A3 z( \: X+ m- Z0 x+ x
- }
# T% V2 E4 q9 Q7 W - . O# [9 ~! G$ B t) i( m
-
4 O, K& r9 Q+ `' V$ G9 J( B - 7 `. z! S- g: v" J, d
- }
复制代码 2 t! Z6 g4 M$ P( C$ j3 F& q
bsp_usart1.c - /**4 f/ k0 h) s2 _. Q% d
- ******************************************************************************
; \7 Y) P$ J: q4 H+ q" V - * @file bsp_usart1.c' T0 y$ ~3 l2 K; K5 w" P4 U
- * @author fire. _& _: ~* X6 ?1 {; G
- * @version V1.0' }/ C$ ?- E% ?
- * @date 2013-xx-xx
z+ C5 I$ F9 t$ V4 p1 K3 ` - * @brief 重现c库printf函数到usart端口0 ?: c4 L$ _1 D& \. h6 C! r! w) A! m3 U
- ******************************************************************************
5 }8 G5 {! x z. J- g( \ - * @attention
6 S% p9 l( U# Z3 k# p4 S - *
) l5 s( j4 `0 ^: Q) \7 U2 x - * 实验平台:野火 iSO STM32 开发板
5 {( ?* @! V6 D" s3 ~! b: m - *
) q! H; V2 H* l( O) X' q - ******************************************************************************
3 E% `. H- U8 `) f. s1 A - */( T4 {, C+ l( X9 ?' V% k" T# o% h
B2 u U& A& P# V1 a& l1 K5 @7 F0 w- #include "bsp_usart1.h"/ O2 n# A6 B/ g; F1 _+ N
- ! D3 d( ?' g3 i( y9 ~$ R$ Q- b
3 ?( t% I1 s5 l7 J- /**: k: }3 d$ T3 | N n
- * @brief USART1 GPIO 配置,工作模式配置。115200 8-N-1
' ]! y7 j1 ]7 Q; I. t- S - * @param 无1 O$ S& Q9 L0 r" P [. N( l9 h) g
- * @retval 无" o7 H+ n. u% u1 A# d4 L# G% F
- */5 ?9 D+ c U; C8 _, H3 u5 T
- void USART1_Config(void)% v( @) `9 t i9 F4 v; z, O7 y
- {
3 B+ P+ D: F- h- n* |/ z - GPIO_InitTypeDef GPIO_InitStructure;
! x" \- l1 o) s1 B - USART_InitTypeDef USART_InitStructure;
9 a. c! Z' O. l* W2 E0 @# U: ?) |% h - . ?3 I Z/ U1 q+ q2 V. ?) z
- /* config USART1 clock */
^! y! Y: Z- H) ~6 x% m9 E& T s - RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);" h0 d; Z+ ~& o8 T
- 7 X; E# s5 X2 K5 r6 }: r
- /* USART1 GPIO config */& r& W& v5 ~# `! ? h
- /* Configure USART1 Tx (PA.09) as alternate function push-pull */
' L" r8 b/ z* h& c8 ^! d8 w - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;1 n1 v/ b$ e- l8 K
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
8 u" e% g+ b: x. H! }& C8 O - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;. c7 M j% W4 ?1 Y& F3 k, p
- GPIO_Init(GPIOA, &GPIO_InitStructure);
# z, F3 d$ w3 [9 y' M# s
' \& g& t; k6 N- /* Configure USART1 Rx (PA.10) as input floating */
( y6 L* M- T/ r* ^. l ^- H8 w( W - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
, c Z5 g2 [( n) O2 _ - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;, U) N6 h! m) w' S) a
- GPIO_Init(GPIOA, &GPIO_InitStructure);8 ^" O6 v+ o0 a) O h6 I
+ P; m1 W1 z3 x* k- H- /* USART1 mode config */( I* l! I% k1 q" ]
- USART_InitStructure.USART_BaudRate = 115200;( ?+ i" z; B5 T
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;5 ~ N9 H2 F' o3 Y+ X
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
3 ]! J. k% Z* a% m$ C" r/ {# x - USART_InitStructure.USART_Parity = USART_Parity_No ;
2 e7 Q% j* g: G$ \4 Z8 Z - USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;" Z/ a3 n( z) c! H0 e) g2 D) C, u
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; p6 j. @9 u4 Z, B) O6 Z. a% q
- USART_Init(USART1, &USART_InitStructure);
" g' e" p' B; n2 Z4 F
3 v5 k8 N* Y$ i: ]; P6 B- USART_Cmd(USART1, ENABLE);& o0 E8 y: w% A8 e6 u, e
- }
4 E& r4 Q, o6 l% c
3 _8 U6 ]# e" O2 v- ///重定向c库函数printf到USART1
( p" a# Q+ f, X9 B - int fputc(int ch, FILE *f)
6 p5 u" w. x" _$ ]6 b - {. ]. D' F, ~) p% |, J* l
- /* 发送一个字节数据到USART1 */
- S1 W7 n( ~1 e% K1 A T' u7 O - USART_SendData(USART1, (uint8_t) ch);
6 {5 N& f2 \+ [3 ~ - 5 R. T: I+ v; Z6 `# ?3 Z5 u, c
- /* 等待发送完毕 */: M/ q/ R* s/ p3 _- Q
- while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);0 S: K: v7 z* T- X% v* [( l
- 6 P. n8 a; A. E: u% U
- return (ch);
8 K) X+ _. A9 X8 o/ n$ c. Z - }& B; G u+ Z! q
- * R. w# v7 w. a# e
- ///重定向c库函数scanf到USART1, R# ?$ ?! l: _1 _% P
- int fgetc(FILE *f)
' _! p- x& a4 ]: ~/ Z" z - {% M& o. c3 t1 V. F7 J
- /* 等待串口1输入数据 */+ R2 {, `3 S: b# U) ?8 N
- while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
5 G0 ^' o6 ?+ b" W( P* r, B7 m+ t7 b
# _7 |8 x7 E' }7 ^) @ S- return (int)USART_ReceiveData(USART1);
: N: n' ~. H3 F1 x9 z: I- N - }8 ]5 }/ C2 }, C0 J
- & |0 x( `. D' M1 [4 y# i. _
- # {# f4 [4 [, [1 V4 O: S, P
- 4 I' y& n' B' D* f
- /*********************************************END OF FILE**********************/
复制代码 ' i0 f) r1 M( ]1 c5 z
bsp_usart2.c - /******************** (C) COPYRIGHT 2012 WildFire Team **************************: g' o T9 s: n
- * 文件名 :usart2.c' u* J2 P+ i! W: ~2 M! e
- * 描述 :将printf函数重定向到USART2。这样就可以用printf函数将单片机的数据
4 p7 p6 O: `' N/ u$ O% h - * 打印到PC上的超级终端或串口调试助手。 3 Z# G6 v" J \2 H) d9 o2 s# l
- * 实验平台:野火STM32开发板
5 t4 W* I: o9 A! U5 O1 v3 ~# z% J* ^ - * 库版本 :ST3.5.0! E* |$ e& j6 T! k: B6 f0 O
- *
" \0 ]3 `7 g+ Q" x* q- P% M1 i - * 作者 :wildfire team , O5 S/ D( |* q1 }) b
- **********************************************************************************/. }$ I0 h2 [! Q0 S
- #include "bsp_usart2.h"- F1 ^3 w* i$ `. Y4 B
- #include <stdarg.h>
' i' V) \ Y; i. \/ I; q; x/ _$ b - - C* f7 S; t' P( Z0 z1 d
& o' ~% h; Z0 A/ ~2 u# L+ [- /// 配置USART2接收中断
2 v! @( `$ R/ _/ k O - static void NVIC_Configuration(void); E+ }2 A+ ]! q* E3 X) P. ?5 K2 |7 C
- {- J7 j" h" F' t+ c& i3 L. F
- NVIC_InitTypeDef NVIC_InitStructure;4 [& t# `5 Y3 P+ N& L6 H+ c
- /* Configure the NVIC Preemption Priority Bits */$ r% e5 s- y/ J: p
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);3 p" h- [& W& x5 r: e$ B
- J8 ?5 _7 z4 K* _) I( a; L5 W
- /* Enable the USARTy Interrupt */
& v% B8 S2 `9 ~: U - NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;5 s3 s& s2 g6 |
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;
$ o2 H& N( V- g$ Q - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;8 b% z! ^- r# _4 W+ ^2 V
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;. N) ?" g5 ?6 @1 ^# M- s0 ~
- NVIC_Init(&NVIC_InitStructure);6 P) k" j* c" ^! [* I1 e, ?0 ?" u
- }4 J) V8 Q' O5 r7 a: O# E0 b! L* d
- 5 c( Z! k7 D; t* t; r F
- /*
6 _; D, |+ {; F- T- @1 C - * 函数名:USART2_Config" W% Q8 @- H/ j1 A6 r- f( i# ~% U- |
- * 描述 :USART2 GPIO 配置,工作模式配置* a, U# i9 D4 L& l$ @
- * 输入 :无
" H7 {/ A! d' ^8 I3 S- D - * 输出 : 无 A. C0 Y. j5 L. J1 o' _
- * 调用 :外部调用
9 J2 N! R% U! T8 ^ - */
) b4 m% ^- Z7 D* V$ p+ D: w - void USART2_Config(void)7 T6 E, n: w7 _" e
- {" v; t. C$ \) o1 S
- GPIO_InitTypeDef GPIO_InitStructure;
7 T' O8 Z x) W, H- J* `% f - USART_InitTypeDef USART_InitStructure;
0 C( h) a v0 t- K! ~ - 4 `* l7 C: K# G6 i+ @1 i; J! H
- /* config USART2 clock */
7 V& L( B, ?) v8 ] - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
Z+ f y* m6 k# ~# ?1 k: Z* @0 `0 [ - RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); ^5 u& \+ e2 ^8 |3 k' ^; ?
0 k0 \ D. Q# g% a, i1 z- /* USART2 GPIO config */
( B) T7 f4 J( g9 r. `, ~! i: g2 K' J - /* Configure USART2 Tx (PA.02) as alternate function push-pull */
v! q% o D/ t8 i4 b! X - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;: d( {' |+ F' {5 B7 Z
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;+ O0 |; b* d* |
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
: _+ w* |3 N6 X$ q# n - GPIO_Init(GPIOA, &GPIO_InitStructure);" z& ^" h G- h% [$ `) t! n
-
: [* r: R' n, f) R9 F - /* Configure USART2 Rx (PA.03) as input floating */
+ k5 K% l1 `! A: }+ l/ O# Z& } - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; O0 V/ ]6 n7 W
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
# T5 H D8 c, p. @& m5 p - GPIO_Init(GPIOA, &GPIO_InitStructure);
. K& s7 U* R H -
+ `' }7 ]: V4 V2 F, M: w - /* USART2 mode config */- Z2 f2 Q9 Z( a U( I4 v1 n. j
- USART_InitStructure.USART_BaudRate = 115200;
0 N, B3 L; _$ k5 _: H- P/ [0 g - USART_InitStructure.USART_WordLength = USART_WordLength_8b;
7 h/ R3 m: c. p0 {1 T - USART_InitStructure.USART_StopBits = USART_StopBits_1;4 I L0 k4 k. X/ {9 F3 K
- USART_InitStructure.USART_Parity = USART_Parity_No ;, K, {4 y0 l: x- g, v
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
( m2 s- ~$ u, v+ { - USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;! Q' {5 k5 @) a- E: n
- ' T. z, U$ @% r1 J
- USART_Init(USART2, &USART_InitStructure); # ?" Q0 t8 ?9 \/ ?3 w6 p
-
/ S( d- K0 l* T6 @+ n: z( w - /* 配置中断优先级 */. L3 m2 R. a7 t0 u4 O
- NVIC_Configuration();
/ c9 U) V0 U4 J2 L: s9 [/ Y! N - /* 使能串口2接收中断 */
" _% ~0 U; l9 x e) Y5 z6 f - USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
+ q0 x( K: G5 ~: z - 5 b" E% m7 O8 Y7 ?5 y
-
7 B- U# z0 ?& _/ i0 ~/ q - USART_Cmd(USART2, ENABLE);
: I5 i1 m' \. D8 k8 H* I - }
9 w; i2 M2 Q) B
( j" M3 a& {& |. T* K9 `- /*( p1 o5 W/ X+ i
- * 函数名:fputc0 h+ d6 n( b& c6 W
- * 描述 :重定向c库函数printf到USART20 m; k+ g" U& F& |" Z: d
- * 输入 :无1 F% w" E; D( m9 s
- * 输出 :无
9 e0 T% I Z3 S" A( k - * 调用 :由printf调用5 {. l4 C. D0 ?* |) a& ]8 q
- */! g2 ~6 `. X; V3 l: D. A
- //int fputc(int ch, FILE *f)3 e) [/ {7 s6 T+ F% b$ @7 r
- //{, d. y4 @2 y% m' _/ h
- ///* 将Printf内容发往串口 */
" f# G& ]# }0 `7 P - // USART_SendData(USART2, (unsigned char) ch);: p& G+ |" f4 \1 c
- // while (!(USART2->SR & USART_FLAG_TXE));0 G, t( Z% i& x) r& B; E
- // # n, T. `+ j" b6 c$ L8 ^, V/ E
- // return (ch);
q# z+ N( o% w( {5 V - //}* k: r1 ` M/ ^' L( Z/ j# G
- # k* C5 c- ~; @" o& Q2 U3 U, S2 B
- /*- ?6 y( `0 d. q V8 ^4 ?) G* {
- * 函数名:itoa+ I8 N) g* }% J# ?
- * 描述 :将整形数据转换成字符串! V0 Y% b2 S4 H: J/ x2 ]* [
- * 输入 :-radix =10 表示10进制,其他结果为0
. C' Y- I1 h: i! d& O2 p* x - * -value 要转换的整形数9 x1 z$ |9 J2 W
- * -buf 转换后的字符串 [ R& `: t8 U; S' o
- * -radix = 10
1 [# H3 E, `2 V" g- k- f1 Y - * 输出 :无
' L& D" K# b, u# [. G - * 返回 :无; O: f3 R& f7 p& u
- * 调用 :被USART2_printf()调用2 w; }: \! ?3 q9 D
- */
" V- C8 D) D# B+ W* [' s - static char *itoa(int value, char *string, int radix)6 v) M Z$ Y4 F- G% D& J
- {
" ?" D% @1 F1 Z - int i, d;
' q" d% Y& E- z - int flag = 0;
2 K& y% L# G3 m+ E% x$ F) s4 v; b - char *ptr = string;
; B6 d7 b$ _& m, ?0 y8 Q3 z
1 G6 `0 a- M0 ], M0 e; ^( _- /* This implementation only works for decimal numbers. */5 W! Y8 N, J: O/ w$ ~6 ~
- if (radix != 10)
# V( [! C& h9 m - {
8 \3 [. ~5 W! U - *ptr = 0;
3 l4 P ]- o: ^ - return string;" P) b7 ~: O' p
- }- @8 e- s1 e, |+ J# s4 j
- ! r) U4 T6 @& ~1 M9 b8 R8 R% N% w
- if (!value)' i4 {# u5 k9 w5 a4 n
- {
n+ w; _8 L* n, H - *ptr++ = 0x30;) |) K5 ~1 }4 C7 G7 `8 _' a& o. C
- *ptr = 0;
) p4 R/ h2 {; R/ @5 q1 z' D - return string;1 ~6 I7 S$ ]. W9 [( h
- }/ [' k x" Z4 C/ a
- : X' F5 x9 S5 {% \* S
- /* if this is a negative value insert the minus sign. */
- l. ]% D0 K4 C* A: t, l' b - if (value < 0)
2 m z* E7 t/ v; I7 t - {' S+ n+ d9 y9 a7 r% m1 f
- *ptr++ = '-';
" O5 I( N" s9 p/ A9 o9 y# M - & J" S9 u- Z' k. _, ?
- /* Make the value positive. */* g0 }2 s7 R- E' R6 c- D7 K
- value *= -1;
- j; o$ P* s" p - }1 T1 B* P1 W: T
- ! T, K* Y7 j( n. R
- for (i = 10000; i > 0; i /= 10)4 s M, N2 V% M) d* h0 T# g
- {
0 {$ J' C, y& H* L! r: m' | - d = value / i;
9 \' [, r8 v4 n+ F- x
K9 Z: x) ?, L v5 s2 L7 K' ~- if (d || flag)9 x) r# G/ v- v* [1 t
- {
) L2 ^4 r; h3 C( B - *ptr++ = (char)(d + 0x30);7 }- \7 `- C! j% X, Q Q
- value -= (d * i);
# E3 O$ r7 L: F5 `7 m" g U, F) ^ - flag = 1;
2 M% T, _% N3 |- U; | - }" S6 \! |: N" g, i+ c
- }6 \4 a+ V% e- `- S, t Q B; E
& k* Y* S) z( w) P- /* Null terminate the string. */1 t5 X+ w8 R6 Y) b! H/ Z: Y
- *ptr = 0;
* E) S3 [4 `2 w. J* z" u1 g
. v; L1 |# W1 G# s4 V2 B5 w/ h2 K% E+ s- return string;" O" {; q' v0 w& W3 j( T+ Q
' i9 P V, }3 d0 B- } /* NCL_Itoa */
# T5 ~" k' o5 e/ s
9 X. [8 d* J, D# g$ N- 6 F2 B# n; P* C% N( C3 s) B; ]
- #if 13 F6 w: N" z( r. Y X$ ?
- //中断缓存串口数据
4 z- G$ G" Z$ I - #define UART_BUFF_SIZE 2550 Z. j- t7 D' c7 ?
- volatile uint8_t uart_p = 0;
. N( B: d$ [6 a9 b. V - uint8_t uart_buff[UART_BUFF_SIZE];9 E n2 f- m( \7 _
6 O% ^6 A% i+ I8 k- void bsp_USART2_IRQHandler(void)
' K& W4 A' f1 K4 }# g A1 I9 ]# w - {* v' z, w) ?9 J" W+ L* x7 E
- if(uart_p<UART_BUFF_SIZE). Y! k6 \# Z7 W
- {* r5 ?: {* c: ]& M# M
- if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
, n% g; S5 D/ C y" Q9 U4 T D - {
$ G$ U: [) s$ U$ S. r4 C/ S - uart_buff[uart_p] = USART_ReceiveData(USART2); d6 q4 ?4 O. F7 ]
- uart_p++;
3 e1 A. t4 y- A# L2 z5 Z, Q. @7 _ - }
, P* @7 L L5 D$ _; {/ x - }
8 B; B! K5 S1 t; L7 o% p( B y - }9 R& \1 l3 F$ H' s1 [
* u3 s- Z Y) u, _( _- & Y" A+ o9 s. c1 V2 s" t% u8 y
0 C) o4 ?* H5 d# ?( r/ `6 G1 g; c X- //获取接收到的数据和长度, y8 E/ t! N1 {; e
- char *get_rebuff(uint8_t *len)
& W/ o" o; d: O) `* X - {7 A, D5 ^2 \$ N/ p
- *len = uart_p;
& I* K8 p( @3 `+ a& L. ] - return (char *)&uart_buff;- Y3 t; L3 W. U/ |5 h; v
- }
' V! ]; G) g. |% ~* @& g
]& ^. j5 q) e% r, `- void clean_rebuff(void)! w- n. z) C/ o$ X m: I! Z
- {
+ U. j1 l" I$ l - uint16_t i=UART_BUFF_SIZE+1;7 x |6 H3 J( O# @( u% A$ ^& M
- uart_p = 0;
- _# j, d1 Y$ ~ - while(i)
+ m) M9 {& A! W" v9 ~; m - uart_buff[--i]=0;
/ r5 D9 ]) f" P+ S4 y6 G - }( v, n4 z1 z, n/ g/ [6 {
- , P4 X# S3 U4 s/ F& j( y/ N
- #endif
! l. T5 a& W( d. M3 V
! b! @3 g6 X/ w( o& [- /*7 I* Q9 f' x+ |2 t4 `1 E9 s
- * 函数名:USART2_printf
* r! v! o- \: l$ v - * 描述 :格式化输出,类似于C库中的printf,但这里没有用到C库5 h9 {( n+ k1 q& G, l" _
- * 输入 :-USARTx 串口通道,这里只用到了串口2,即USART2
x2 D u$ J- x9 C/ ^; | - * -Data 要发送到串口的内容的指针; u- q8 A7 K0 [% [5 r, z& r
- * -... 其他参数
" F- z- g! n y; |. r( G5 ?: }9 n9 r6 y - * 输出 :无
; E9 s2 P' v7 z - * 返回 :无
' \2 }( K Z! b$ q* P/ n: ] - * 调用 :外部调用
, A5 c$ R3 D" \ - * 典型应用USART2_printf( USART2, "\r\n this is a demo \r\n" );
& p( W. a) Q5 s$ z* Q8 s - * USART2_printf( USART2, "\r\n %d \r\n", i );* }1 q7 [$ S3 S0 {6 I1 b
- * USART2_printf( USART2, "\r\n %s \r\n", j );
7 }& \: L% ], M - */
5 B0 t$ ^0 p4 v( ], w x% v3 ` - void USART2_printf(USART_TypeDef* USARTx, char *Data,...)
s! e, t" w2 _/ g$ l - {
, g/ F/ V8 s ]. d - const char *s;
/ x' l! X/ S' _+ N& H9 d - int d; / l, H' h. J' p$ O( H3 X' n
- char buf[16];
4 S6 A' I5 ]5 D3 F! k' v - % H% A- n2 U2 c; ?
- va_list ap; w* M" @2 Q2 l9 f- N2 ^, r1 o: |. }
- va_start(ap, Data);
8 s9 }9 g5 x: M4 e - 1 U2 Q ^. ]4 N
- while ( *Data != 0) // 判断是否到达字符串结束符
1 C! C, j0 l) ^" B' } - {
. t E0 X/ i9 Z - if ( *Data == 0x5c ) //'\') j! {4 ~% z* Y9 ?$ ?
- { ; g( q7 K2 T7 Y) r9 G
- switch ( *++Data )
$ W3 Q, p1 \3 w' U$ w& c* g( N$ l - {) z) i( }+ \& i( @( v+ f4 Y
- case 'r': //回车符" p. k& @; K1 y& _, {9 Z
- USART_SendData(USARTx, 0x0d);
) W0 E0 M% M; P- ~: @- Q, o - Data ++;( L' L( N/ E" D9 ]$ P
- break;$ P. m' e! A' c+ i
- & U& L# e7 Q9 p! J) t0 e" I
- case 'n': //换行符: g4 [3 ?! ^) _$ j# `' I: [! U/ w
- USART_SendData(USARTx, 0x0a); $ H5 d. D2 h, U2 D
- Data ++;
4 R0 b6 Y! b4 Z2 S9 o% Y; W; t - break;- w6 f J8 N. N% w9 t
- - y' h/ R$ H% ]/ |& d* r1 N
- default:
4 g. r1 u# ?' j/ X/ T - Data ++;$ V8 n8 l) N4 M# r, y
- break;
/ v I6 L# f- p5 j- d5 Z - } ' K" h% w/ S- `- Z
- }! z. X+ ~& ^- p; u$ }6 Q; ]" j
- else if ( *Data == '%')% l9 }8 }+ _. T2 R7 N! G
- { //
1 G8 \9 e" A6 l' c7 q. s# @ - switch ( *++Data )
. z) i" }7 |* r* g6 ^ - {
4 M: P; a q; E - case 's': //字符串( i4 o) B3 e# }; s( _3 }
- s = va_arg(ap, const char *);
/ Q* s* i! w9 O! Z& W. [2 K - for ( ; *s; s++) 2 A% ~' k" \5 X7 `0 R9 P3 C
- {
8 o/ k( v' }$ n% S. x - USART_SendData(USARTx,*s);
) E) j1 I) M- p$ n - while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
. B4 \+ _! ?3 _* J7 ? - }
' O. G, ^! G# g0 q& i - Data++;
) G) t0 f) v& x# Z4 I) s7 _ - break;
* e5 v9 A. K" C7 C f
1 b, ]0 S" j9 S8 |" ]- case 'd': //十进制
: i. R. G3 V( h2 }: h - d = va_arg(ap, int);0 B" w8 v0 c. L0 ]6 ?/ D2 P
- itoa(d, buf, 10);) D+ y8 ?2 E2 {, q' ]- v) I
- for (s = buf; *s; s++) " v+ t6 J5 H Z& @6 L
- {
" J% C. m; d2 n - USART_SendData(USARTx,*s);
0 k9 R& O4 Z5 k7 O8 T1 N0 J - while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );1 {& ?# A# `5 R2 {) N! c
- }4 S7 Q* p; F7 N5 E5 v! C: L! V. |- E
- Data++;. D4 f; }+ q/ k% W% ]% h
- break;0 q% `+ F# V' m: a& { x5 r
- default:; |5 j: y& Q; d1 M: ^$ i' {3 s
- Data++;# \+ g1 R$ X' ^1 z8 a6 `" i0 d6 q
- break;: l* b! |; ?' Y1 R: X) Z" m1 c
- }
/ Q4 N/ P5 D( s7 s6 C" E - } /* end of else if */
* E, @) }& M! M0 O - else USART_SendData(USARTx, *Data++);4 D( [4 r$ f, Q7 W. D; @$ ^$ q
- while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
0 f; J4 d. |& `9 k% i6 g - }
{; |8 v7 _# k" H - }
0 k$ X' D$ C# L - /******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/
复制代码
) j1 ?% t" I/ E9 u8 k# |7 |bsp_usart3.c - /******************** (C) COPYRIGHT 2012 WildFire Team ************************** g' B' ]: [2 R6 V1 s/ s1 |7 [
- * 文件名 :usart3.c8 d6 \% d; r8 z- i
- * 描述 :将printf函数重定向到USART2。这样就可以用printf函数将单片机的数据3 r, [4 {9 l8 \7 p+ U
- * 打印到PC上的超级终端或串口调试助手。
" E3 q) j) X8 f+ m - * 实验平台:野火STM32开发
; I4 j; t7 c7 Q9 |/ W8 | - * 库版本 :ST3.5.0/ a, o$ S3 A2 K. B3 x% v, }* U
- *' ?# W* [) v) V9 i
- * 作者 :wildfire team ) `% \: Y r) _4 S- U) U. T; a5 ^
- **********************************************************************************/7 u! e4 t4 G. \0 C/ K9 r
- #include "bsp_usart3.h"//头文件要在外面改头文件名,现只将其中内容改为usart3
, @1 o1 a# g! A! \- M! p$ T5 _ - #include <stdarg.h>
& p, g5 K/ p* Z# M; w( w/ G - * N% }9 s! e: F \' x: T4 Q8 d
- " V; @) G) X& t2 B+ f3 h% X
& S, h1 n5 w# P/ D: G) j- {" J- 6 r- G# ]2 q. A. F. A
- /*
! G! Y- x) r* e1 k8 u" g - * 函数名:USART2_Config
. z( f; ?* S5 t) \$ g - * 描述 :USART2 GPIO 配置,工作模式配置) M% p! e# N; A, D2 w/ W( o; m
- * 输入 :无
9 m( ?* {: i/ O' X& N2 q$ B2 B: c - * 输出 : 无: ?* q8 u8 u9 C9 H
- * 调用 :外部调用# `6 {. H( e' t/ N: w' D! U
- */! v- u! s9 `8 ^, L1 g# P. C$ `
- void USART3_Config(void)/ ^+ c2 O" l' y* S6 F- G
- {
/ Y2 c; Q5 K( Y, y- T+ B" h - GPIO_InitTypeDef GPIO_InitStructure;* Q- b+ Z7 e( v
- USART_InitTypeDef USART_InitStructure;# P" V; |1 u0 p+ F
- |$ M; B7 t* i- H% f# [
- /* config USART2 clock */) F1 k& w) |3 Q" j6 e7 T& k
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//此处也要修改,修改为GPIOB
+ i& C9 C0 y1 A - RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);) x9 q+ e% O0 L5 [# F
# C) j$ D, p8 I9 w3 h- /* USART2 GPIO config */
$ A' e2 W# t3 P) |* m" t - /* Configure USART2 Tx (PB.10) as alternate function push-pull *///此处改为b10# J1 \! @9 ?$ C" h1 V$ J5 {
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;1 }# M% z1 F5 T, z" x7 w5 }/ F
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
8 t7 ~1 R+ ^# f* X* ~ M2 |' b9 J - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
7 o" }( E- ]* Y' t7 _ - GPIO_Init(GPIOB, &GPIO_InitStructure);) k5 D F' h3 I8 i$ W* q, J
-
; |) r& t+ p% ~ - /* Configure USART2 Rx (PB.11) as input floating */ //此处改为b11
% }' u" ?! Z/ g: E1 f4 ?7 L4 Y - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
2 z7 D7 S& ~. ^( ]4 p' B" j - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;7 N* W2 N& d$ }1 w9 b7 V
- GPIO_Init(GPIOB, &GPIO_InitStructure);
+ i3 [( m& |7 T% e! c - 8 V1 l! U% m4 f; R
- /* USART2 mode config */
! Y7 V# U; h: {1 k9 D - USART_InitStructure.USART_BaudRate = 9600; //GPS模块默认使用波特率:9600# P$ E+ j/ `5 }; G
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;3 |0 E8 X4 ^1 g* X/ w1 b
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
) d& @8 l* a# W" ~0 E1 k - USART_InitStructure.USART_Parity = USART_Parity_No ;
8 i, \# E8 s6 C& c- I2 P ^% o - USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
2 S' p. L7 J, ]" c- k - USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
: W _, R3 ~0 G5 g3 e - 7 ?4 T P6 \2 Q$ e; E: ]! j% K. D
- USART_Init(USART3, &USART_InitStructure);
% |5 b1 o9 v- m9 _7 p - ' Z- \. M/ W1 V5 i Z; l
- USART_Cmd(USART3, ENABLE);
% l y! `! M/ G1 ]/ N - }
复制代码 # p* {0 q) K- I* p R( s5 r
gps_config.c - /**) F5 H& ?3 `+ n# G( w
- ******************************************************************************! Y) a* Y6 U- B6 P& q
- * @file gps_config.c( ^: I/ x, X9 L: Q
- * @author fire8 Z7 S4 v/ W$ q% Z6 R5 {
- * @version V1.0/ n2 u5 a! {+ @! |0 I: E" W! h
- * @date 2014-08-xx* ~0 Y8 F4 g3 L7 G) E4 J* O; M
- * @brief gps模块接口配置驱动; ^- d& H G3 A
- ******************************************************************************& W1 S: D) |; j; `& s/ s
- * @attention
6 b* B- p/ _, _ - *
9 B; t, ]; o0 l) L( R - * 实验平台:野火 ISO-STM32 开发板
8 F: q$ @* b- ~: @/ L) g9 ~ - *) I0 }) g8 D, n
- ******************************************************************************
% E* b. O8 q( N: F- q - */
, F R$ m% i$ ]+ y; V; n4 B
4 j- P1 |! c2 q: B& ?- #include "gps_config.h"! m3 J* u' d2 F
- #include "bsp_usart3.h"
* S& E7 b; }& V# ?) x# f2 Q - #include "nmea/nmea.h"
3 `+ ]4 Z: R! y - ; U9 }" J$ ]1 `* Z; E; @) v
- % |/ e& N: d C0 v& `# m- k B5 M
- /* DMA接收缓冲 */6 T- X/ p6 c+ Z5 N' C3 |; A, x0 l
- uint8_t gps_rbuff[GPS_RBUFF_SIZE];
0 j5 k) u, d4 u( X$ q" A - , n. x/ m# t$ n- I9 a' ]' {8 @
- /* DMA传输结束标志 */
Q+ V) a: v8 B' f* ?" P - __IO uint8_t GPS_TransferEnd = 0, GPS_HalfTransferEnd = 0; D: v: X+ j7 k4 X. o8 X
+ M* {4 e5 E8 M: q
J% M! k5 h0 A4 i8 F8 ^
( N2 Q$ M9 X( d! n: A# t) f- /**6 I' X# s) [ @1 }: s5 l2 D
- * @brief GPS_Interrupt_Config 配置GPS使用的DMA中断
3 T$ S+ @5 W' p+ i - * @param None.3 P$ O' E: x! n+ F2 A* h+ R
- * @retval None.( j) w- T2 U/ E k: S
- */
8 q3 H& n( m/ d3 h5 e* T- |4 N - static void GPS_Interrupt_Config(void)
5 S8 M. G" M2 b5 J - {: Q$ L& N; z" R. k: \# M
- NVIC_InitTypeDef NVIC_InitStructure;+ d" a0 J( T! S0 ?3 o: Y( e, s1 Y
- 1 V1 C" t+ r' Q1 \- ]! A' i
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);: D m9 y' k$ U c6 |+ j$ _$ G
- 4 k1 ?5 T$ q f+ c7 u7 `
- // DMA2 Channel Interrupt ENABLE
2 `* i3 ~- y9 T( { - NVIC_InitStructure.NVIC_IRQChannel = GPS_DMA_IRQn;//中断用的是RX不是TX啊啊啊啊fuxx!!
% c9 |3 w7 A( w7 X( C2 r - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;! H& h$ A2 F* a) M8 G7 K' D
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;3 X. V7 S/ v3 a
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
4 D$ ?% g3 s- p. N3 B3 i% x: p& K - NVIC_Init(&NVIC_InitStructure);2 V& f- c4 u8 O" c- f
- 0 x" @ Z9 ]* p
- }
/ W1 M2 W. J Q6 A; G - / q4 L0 F8 U, n" [' q# h k$ P3 D% H4 q
- ! k; N" s s" {' e8 h/ L0 d
- /**# _2 G1 J' a% @! Y3 ~: ?
- * @brief GPS_ProcessDMAIRQ GPS DMA中断服务函数: x1 Z+ P: P& o5 F
- * @param None.
! @2 l' \5 \4 n8 v& K# I - * @retval None." R5 \; p0 R+ \! n) u
- */
+ Y$ {" [1 s5 h, u: e" E0 g1 I6 A - void GPS_ProcessDMAIRQ(void)8 b$ b2 L( H( q3 ]% G# {- A6 p
- {/ P% {- U4 C" v+ S: B: V( g; f# ~
-
1 D; h! h6 ~5 i4 D' t - if(DMA_GetITStatus(GPS_DMA_IT_HT) ) /* DMA 半传输完成 */( @5 p& r; P6 i; }( n# Z
- {
+ s5 Z: M8 X* S; @; X7 w, ?) s: p - GPS_HalfTransferEnd = 1; //设置半传输完成标志位5 e4 j$ G9 Y3 G0 g- V" n+ D/ Y
- DMA_ClearFlag(GPS_DMA_FLAG_HT);
* ~3 L/ @& V$ {8 }7 L# `" a - * x( Q1 c4 A% Y n
- }' I& R: {# @+ m. s* a. r
- else if(DMA_GetITStatus(GPS_DMA_IT_TC)) /* DMA 传输完成 */
; X7 J. T# s4 g0 x1 o6 H6 M3 j - {1 w- {/ `$ S5 {8 ]
- GPS_TransferEnd = 1; //设置传输完成标志位
" u4 H8 a3 `+ b% W7 Z2 q" M) W3 e6 D - DMA_ClearFlag(GPS_DMA_FLAG_TC);& _( e. U9 l0 K
% o0 F4 q* j* c6 O' D/ x( D- }5 U! k6 g1 X1 L) S
- }6 x0 `- y6 r6 t! E
3 E( v% r. {% ^. r2 T# _; m* H$ u
% |( v; g! n* A, @, M- /**
# F# ^# d& F: V - * @brief GPS_DMA_Config gps dma接收配置" ?5 Y( r' d4 y# C2 w! \* A- X3 }
- * @param 无' o' z# c; ]6 S! I" G$ y0 I: G
- * @retval 无* K0 H1 P! P e1 e% ?) Y
- */; U$ `6 I# c' P; j* f
- static void GPS_DMA_Config(void) //其为一个函数9 I+ R# v7 D; e) [- W5 q
- {2 x. f# S* ]- D Z
- DMA_InitTypeDef DMA_InitStructure; //定义一个DMA_InitTypeDef类型的结构体,名为DMA_InitStructure% u) a) k& N$ G. Z2 F
-
% Z# S+ j! O4 S$ t% }0 o - /*开启DMA时钟*/9 f" s" m+ l- \1 B& g) A5 R/ `0 G
- RCC_AHBPeriphClockCmd(GPS_DMA_CLK, ENABLE);
7 y- `3 u; [2 M# n1 g( F' V - ! T* l' Q, W/ H
- /*设置DMA源:串口数据寄存器地址*/
0 t7 P) I1 n& Q - DMA_InitStructure.DMA_PeripheralBaseAddr = GPS_DATA_ADDR; //带点号为结构体内的成员,可直接赋值,相当于变量& U3 a' H$ W' x. p+ n
- //从该处进入gps.config.h可见,gps的串口通信定义为USart2,我们可从这里修改( D7 j) s# t* E$ A [
- /*内存地址(要传输的变量的指针)*/
. A" M3 P5 ]9 l9 k2 Y - DMA_InitStructure.DMA_MemoryBaseAddr = (u32)gps_rbuff;( A) b! Q3 G' M- q% N2 O
- / L- I/ |( E3 O6 R V+ r
- /*方向:从外设到内存 */ 0 j: S% y1 c/ i- R
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
0 A# S4 C" ?2 w9 n
+ I2 e/ B* V; t3 t- /*传输大小DMA_BufferSize=SENDBUFF_SIZE*/
9 K; {: M* I, M0 Y6 J. t0 k8 b - DMA_InitStructure.DMA_BufferSize = GPS_RBUFF_SIZE;
9 j2 g6 a0 J1 U- I! w+ F. m - 1 b7 i- x9 @# D$ u8 K
- /*外设地址不增*/ # ]5 S$ s, P2 V7 V! Q7 Z
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //想修改可直接找到相对应的名字修改% i( ~" I7 D \- l1 W/ Q$ Q
_) x5 n! ?8 S. @3 e& I# I- /*内存地址自增*/
X8 ]% s! F2 ~+ |( o - DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; d& K' O5 n$ G7 y7 o
- 9 [ \5 \+ i& W( z. f$ N {! f! ^
- /*外设数据单位*/
' |6 r4 Y6 d4 \5 F - DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;% k a9 j/ ?$ z, V
\: }1 y6 ?3 D3 f: s) l- /*内存数据单位 8bit*/4 Q) F: e+ U7 q2 \9 i( e) Z
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; * N& ^) V/ [1 ^) V9 q( J# [6 L5 @
- ~1 u% s4 A. y# J) Q) ^8 t- /*DMA模式:不断循环*/) z) { l4 z, w
- DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; ; z4 c5 T m. m+ j$ Z
3 o# l. Y3 g0 H- /*优先级:中*/
' @2 y4 M) m, w7 q0 Q. ?, i8 W, _; a - DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; & U: w! W+ F) r; ^3 ~* S
" N3 U% g- j/ U/ s4 Z- /*禁止内存到内存的传输 */* z4 H9 \& w, F1 H( _6 v" h0 Y
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;6 s) v" b2 D# h
- 1 ?- Q9 g& M# L& }
- /*配置DMA的通道*/ 6 D* N/ C" l- V4 v7 U, e
- DMA_Init(GPS_DMA_CHANNEL, &DMA_InitStructure); & _5 a3 b3 a( F3 B! F
-
1 Z- C6 F0 Z( W" H5 v5 }& Q - GPS_Interrupt_Config();
# S: p% O( R* o& u - ' x% e& _7 e2 z' }* x' V9 t
- DMA_ITConfig(GPS_DMA_CHANNEL,DMA_IT_HT|DMA_IT_TC,ENABLE); //配置DMA发送完成后产生中断
. z- u! ]/ b4 d4 v; c - " F0 k/ T$ f* E
- /*使能DMA*/
. i8 Y) Y$ `; @6 K) K/ Q - DMA_Cmd (GPS_DMA_CHANNEL,ENABLE); - d% ~; O$ z5 ]* [0 u
- " [* W8 F& ?+ u; Q( ?
- /* 配置串口 向 DMA发出TX请求 */
$ N; {; w3 L" ]# f( N- G3 i. X - USART_DMACmd(GPS_USART, USART_DMAReq_Rx, ENABLE);
# w- P- ?9 s1 B6 y" ?. g" T - ! M0 r' \6 X, d2 u3 J8 E+ U, L
- % k- Y4 k2 @5 Y- K1 X
- }
+ W; H, L4 o& }, z8 O& i
k E& |/ p% d! \3 [( s% a- /**9 L" B7 N# c8 ]1 [/ M7 @
- * @brief GPS_Config gps 初始化
' ~# b2 _/ t1 u3 J" b( _' t - * @param 无$ J0 `2 z0 i! D( o/ N6 U1 _3 G$ D
- * @retval 无
/ T$ p+ t+ G1 @* ?8 t - */
. ]; F+ {, b; R+ S- f7 B - void GPS_Config(void). C, L4 z) a& h
- {1 N& v0 ]# t+ x$ x% Z8 B+ p9 Z
- GPS_USART_INIT(); //初始化串口$ e3 K; y: e% e$ `8 Y" x
- GPS_DMA_Config(); //初始化串口配套的DMA模式. B% [3 e8 M) Z1 N# `3 O4 ?
-
1 _5 I3 x9 P5 i - }3 \, n$ ^! Z2 S* L' `; L" b- N
/ d6 Y* M# C# L3 j ]- + ~; X/ y+ ~# K+ S$ K" S4 r' t6 f
- - k7 d% W+ i& |* F
- /**: B5 `! T0 A+ L) t, S; p
- * @brief trace 在解码时输出捕获的GPS语句& C& a. m+ e8 @7 Q
- * @param str: 要输出的字符串,str_size:数据长度
+ o* ]9 s* D5 l9 S- x" N2 ?' y - * @retval 无
1 ]0 M7 ?: k0 C* q - */0 v9 e$ F* A" J% r1 |
- void trace(const char *str, int str_size)/ I; M2 f% t/ E) f$ U+ I* f" g0 M
- {
/ a. l( K b! {* z! X" h - #ifdef __GPS_DEBUG //在gps_config.h文件配置这个宏,是否输出调试信息! L: x6 @: }1 R! m0 j6 ~( t
- uint16_t i;
( E+ g3 o7 t$ K; x$ p - printf("\r\nTrace: ");$ ^ o h9 e p
- for(i=0;i<str_size;i++)
2 s m! L: A }$ p5 D! o6 w - printf("%c",*(str+i));' O$ ~: \( R8 T& L: C0 c8 y+ |
- : E( x4 v/ t [( @3 Y3 r
- printf("\n");5 N% ^" D% }! Q. U$ Y$ Z2 e7 I( g# X- J
- #endif+ i' R* f+ U3 F) b0 d6 W- W4 _
- }6 M" i4 {# z; j: J- T" e4 z# D
- 9 H3 H5 O5 Y8 s
- /**
7 q) ?. g U8 k, | H - * @brief error 在解码出错时输出提示消息1 ]* _0 ]: m, i& n
- * @param str: 要输出的字符串,str_size:数据长度" X' }1 p/ Z* U3 o" E; J3 v
- * @retval 无
3 u1 o5 p2 H c - */0 T" J% F& x: _7 E
- void error(const char *str, int str_size)
+ ? \$ p8 @1 `! Y5 o: V* ] - {
- x" l0 ~# B( F# m: c. s - #ifdef __GPS_DEBUG //在gps_config.h文件配置这个宏,是否输出调试信息
- G- u) o9 Y. b3 L3 C - ' x( S4 @; L$ n: \+ {+ t
- uint16_t i;
2 X. ^# Y/ D$ g/ v" H+ |3 J - printf("\r\nError: ");
7 B0 K* i# r( \- Y2 a+ V - for(i=0;i<str_size;i++). M0 [1 i* j! G3 J! L1 l5 R
- printf("%c",*(str+i));
4 A6 o. }$ K2 u+ i' ^, n - printf("\n");
% h7 @+ s' _( E) |0 B - #endif
2 t7 h4 K8 p* Z - }& } o. A; R; c; y- F& [: g; ?
. F O. a- t1 X6 n- & I/ f5 v2 m/ q# g0 ^; o
$ ]1 q, m; A1 S2 G- /********************************************************************************************************
9 D D1 M; b8 |( j4 \ - ** 函数名称: bit IsLeapYear(uint8_t iYear) - ^* R$ Y/ Z0 x4 r: w! [9 z
- ** 功能描述: 判断闰年(仅针对于2000以后的年份) 0 M/ w- h; O& P/ G3 p' J& v
- ** 入口参数: iYear 两位年数
- c/ A6 X( `' W. @ - ** 出口参数: uint8_t 1:为闰年 0:为平年 / x/ b4 D2 L- p
- ********************************************************************************************************/ ; m9 L) a3 s" S7 u0 `
- static uint8_t IsLeapYear(uint8_t iYear) ( x, p* |+ g6 x9 i, @
- { * e' q: b5 `8 d, @
- uint16_t Year; 5 D. x9 b4 M( @. u1 v& `6 n9 v
- Year = 2000+iYear; 6 E- Q4 G' q" V% p& I R
- if((Year&3)==0)
/ }" }9 X/ J0 R& {. E4 ~6 y' B, P - { e- |3 `$ z. k
- return ((Year%400==0) || (Year%100!=0));
5 ~* {- a! X( e1 Y3 j - } 8 r: W6 T, P& N
- return 0;
* j- z% @* }2 b V# L) M6 f- \ - }
+ k8 D* P2 o9 H- G - ) \* \& l- z1 @
- /********************************************************************************************************
/ D. Q" @8 R# o7 ^& F5 [* M - ** 函数名称: void GMTconvert(uint8_t *DT,uint8_t GMT,uint8_t AREA) % h/ o9 o; F ]: f& e) |3 o
- ** 功能描述: 格林尼治时间换算世界各时区时间 " J+ b* o: U$ A
- ** 入口参数: *DT: 表示日期时间的数组 格式 YY,MM,DD,HH,MM,SS
" ]. [. H9 `4 P h& R4 G; R8 e - ** GMT: 时区数
% N' [; u' U" e- {. U9 w( ] - ** AREA: 1(+)东区 W0(-)西区 ) b& q% w% n" Q% V$ |
- ********************************************************************************************************/ 7 j q" S4 E3 W
- void GMTconvert(nmeaTIME *SourceTime, nmeaTIME *ConvertTime, uint8_t GMT,uint8_t AREA) Q: G6 E+ k$ Z/ T% I: k
- {
( ^2 c. |% K( H - uint32_t YY,MM,DD,hh,mm,ss; //年月日时分秒暂存变量
8 U5 S8 z: D2 _( K$ X$ \ - * x- G9 p4 C( {/ q+ p) O, J' o4 i1 \
- if(GMT==0) return; //如果处于0时区直接返回 7 j% B Y7 N4 j& ]+ r
- if(GMT>12) return; //时区最大为12 超过则返回 % K, o8 T9 \! V
- ) }; C% E3 K/ N& f) O* U
- YY = SourceTime->year; //获取年 & e& a5 w9 C. F S! e7 T+ {3 V( Z
- MM = SourceTime->mon; //获取月
, P: l- j: P. G" h - DD = SourceTime->day; //获取日
# K2 R9 o3 S A9 `: g0 {$ H - hh = SourceTime->hour; //获取时
0 S6 r" g% E9 U! B) C+ N+ C3 O" V - mm = SourceTime->min; //获取分 , e: R+ D0 J( L0 V
- ss = SourceTime->sec; //获取秒 ' P* T. O( Z* U5 Z! k7 `
1 b/ t+ V2 |, K# W& |' R5 }" j- if(AREA) //东(+)时区处理
* U6 }6 B' j! i. p - {
$ w7 ?4 g+ [2 G* X& k6 ^# ^ - if(hh+GMT<24) hh += GMT;//如果与格林尼治时间处于同一天则仅加小时即可
$ W5 d) `% I8 z8 G. d5 u9 a; |4 i) H - else //如果已经晚于格林尼治时间1天则进行日期处理 * T( _% F" |- `( M3 y& @ q* c9 t
- { $ g5 e: w1 r* k: H
- hh = hh+GMT-24; //先得出时间
+ d" ^4 f `1 t1 K! D( T - if(MM==1 || MM==3 || MM==5 || MM==7 || MM==8 || MM==10) //大月份(12月单独处理) # x d! S8 g/ [; B
- { 3 X" n8 P; B" r
- if(DD<31) DD++; : f) q1 s) [% {3 k
- else $ }7 K7 \2 U1 a7 a: w2 r
- { % E5 n5 D- g |$ i, z- e
- DD = 1;
! m$ q4 v" q) m$ c/ t6 Q; Y - MM ++;
4 |3 ?- w* k _+ m' I5 M& A - }
" x/ A* q' P! d* o* j - } & i8 u3 O; N0 q3 F! U& W6 V
- else if(MM==4 || MM==6 || MM==9 || MM==11) //小月份2月单独处理)
7 c# l+ b1 Q) j |) N, b5 Y! D - { + e8 M: C; U& {, r
- if(DD<30) DD++; 0 ?$ C$ e* ?5 B7 W) g
- else
! [$ \; b U& b' T! d - { ! S/ ]8 d0 S, m, y8 V5 V( M
- DD = 1; ; P0 }0 i$ ^+ Q
- MM ++;
! n2 C2 u! b( o6 | - } 3 P+ R4 O4 E* F+ ~3 _) y j
- }
, P) w% E/ v9 S8 M - else if(MM==2) //处理2月份 1 a9 \1 b* G1 t6 O# D3 e- |
- { / G& D* k! r8 m: B
- if((DD==29) || (DD==28 && IsLeapYear(YY)==0)) //本来是闰年且是2月29日 或者不是闰年且是2月28日
- o, \6 L- z& B - {
9 D! {" t* B' L' V6 R; D+ @9 j4 M - DD = 1;
& \- p! {5 n' V6 a/ [6 v - MM ++; 9 N m4 @/ O3 o' o& A
- } , _7 ^5 T, t2 A
- else DD++; ( y4 j {: H5 @
- } 5 d; _, k, L6 ^/ c) W2 X/ H( Q
- else if(MM==12) //处理12月份 # Y" ?) o1 |+ R. h( p1 P
- {
- b2 D" D3 c# K5 P# {) i - if(DD<31) DD++;
" R8 q( D* j4 W& s3 n - else //跨年最后一天
* {9 y0 u5 e. K! M% [8 n - { ! O L4 b; J7 E" T# L
- DD = 1; 1 [1 b; E2 ~0 Z- P
- MM = 1; $ P S5 e* ^' P& K2 W, k- F
- YY ++;
2 u) z; V. u0 K+ h, ?5 L( k - }
" F; }0 M# f" l& s7 V - } % D$ s! v6 c, x' y8 ?
- } . A' Q3 l0 P9 z! b: r
- } 9 m$ p1 b1 B8 E5 Q1 u
- else ( ~, M" \% J' j" `. w' p3 Y* z3 ]
- {
7 F H1 u+ [ v g# k, {% V* M - if(hh>=GMT) hh -= GMT; //如果与格林尼治时间处于同一天则仅减小时即可
7 ^8 U, [' s; S; n - else //如果已经早于格林尼治时间1天则进行日期处理 4 ^- k t. }' U" T5 ]2 g
- { ; X- n# z' M& B; [- r
- hh = hh+24-GMT; //先得出时间 6 J" W6 i' t" H1 L/ j
- if(MM==2 || MM==4 || MM==6 || MM==8 || MM==9 || MM==11) //上月是大月份(1月单独处理) 4 P7 \1 `" Q0 h
- {
- }1 i; p8 U% g3 J) a - if(DD>1) DD--; - r; Q. E' ]: a5 U0 ^! c
- else 9 I' I1 K5 v n3 j
- {
) ]) ~6 y. } S* W( B - DD = 31;
# m. v' j9 v9 S1 z - MM --; & U; Q* s4 n; L# \/ u' g
- } + }5 H% B+ ~; F, @
- }
i) a; H& O0 N! C$ U4 I' O - else if(MM==5 || MM==7 || MM==10 || MM==12) //上月是小月份2月单独处理)
) D% f, L( o, |: r+ k - { . q4 ~' j4 u% t* \6 q
- if(DD>1) DD--; ' f0 P9 Z6 n- U! [/ a0 w% a" M
- else
' N! `, b' f4 @$ V7 @ - { ; d- P3 a4 z9 x
- DD = 30; - X8 Q( C% `' O% @! o- l% S
- MM --;
# {) u: n: I' \( {. N2 o - }
0 t0 Y- T1 ]% t3 w% M" Z2 m - } 3 a4 q" o0 U6 x x. o
- else if(MM==3) //处理上个月是2月份 9 w5 `3 R9 }; h) p; w
- {
5 K# @) l$ l" u. [ - if((DD==1) && IsLeapYear(YY)==0) //不是闰年 , d& _& |* P+ N( s0 p; `
- {
1 w( ?0 w8 p% E% H3 \% \# s( g: } - DD = 28;
# [0 \2 b, v# o6 }7 K4 U0 F0 w - MM --; + M/ |. H, Z* h! d3 k& B! p
- }
) l: ]) A* I( p' h4 J. l# f - else DD--; 2 N$ O9 z: Y% `- M% }4 q$ B
- }
' q7 P+ t3 a2 d- N2 r% p- f - else if(MM==1) //处理1月份 & N4 r, D3 v8 B6 n
- { 9 n1 T5 u1 ?3 \# g; W/ A+ g( i
- if(DD>1) DD--; " }1 f. u3 y( ^* |. J; V! i
- else //新年第一天 + o' {: U8 v9 [/ k4 E4 L/ P& e5 ~
- { 5 _" n; ^( p; \7 q- j5 _( C
- DD = 31;
& w l9 R3 n* W) ?9 I - MM = 12;
2 i$ x% Y f4 L1 L; ] \ - YY --; ; S" K q0 C( n
- } 1 h7 k5 d- B+ S( C/ W1 X
- }
% w. @ b. E$ J! Z' y. j3 r - } ; b) H. n) r3 C I2 J0 T4 n% h
- } , |- I: ^5 \7 `+ H/ c8 V
- / q8 v( L7 E0 H8 }8 l. e- q
- ConvertTime->year = YY; //更新年 ! d4 m, R/ Q6 M/ [; Y5 `3 B
- ConvertTime->mon = MM; //更新月 - S5 S! j0 Z3 [# H. g m. A
- ConvertTime->day = DD; //更新日 % N3 E: O. E0 f8 V2 j3 A# u
- ConvertTime->hour = hh; //更新时
3 j, @2 Z0 A/ \ - ConvertTime->min = mm; //更新分
( t2 G) N4 T. Z8 t$ e0 q& z - ConvertTime->sec = ss; //更新秒
# _; \1 g ~ E9 u* Q; H - } 6 K& x, g g6 F- S% d; F
o7 x; Q% {4 C4 N5 A f- M- / [; x# m+ [7 y# l6 a
- + H9 E V) R' T
- " W% _$ ]8 _' x2 R) t, q
3 E" [3 Q3 l# _( n
: o5 q) t4 o9 N- E9 M% X- /*********************************************************end of file**************************************************/
复制代码 nmea_decode_test.c- /**
0 s; E$ z- t: s - ******************************************************************************
# j8 e( }: u0 q& V7 o6 s - * @file nmea_decode_test.c
& {) r* h- b2 V l& `5 B - * @author fire
' S" [2 m* r1 j% V. y5 a( _2 w - * @version V1.0
: v! a' b) y8 y2 @ - * @date 2013-xx-xx" g% Q: d [ ^+ q# d
- * @brief 测试NEMA解码库3 k5 T- U: P2 z% x, p2 {
- ******************************************************************************
% C8 W. y6 T0 f/ U! @- b( f - * @attention
5 j# D% c: o$ m; y - *; }) ]2 [% T% D. t9 y/ \3 U8 M
- * 实验平台:野火 iSO STM32 开发板
8 b! P w8 _' o, z4 ~ - * 论坛 :http://www.chuxue123.com% j5 x- i8 t7 |7 {; p& L8 N: f
- * 淘宝 :http://firestm32.taobao.com) n1 i3 N1 Y+ s! T' u) V2 \# x
- *$ K) E+ x; w8 b3 Z7 _! u4 a
- ******************************************************************************+ M \ H' L* v* s1 C% ^( @5 o
- */
+ ~/ K, ^, g! |) y* K -
- \+ Z9 U) y( m8 C - #include "stm32f10x.h"( U0 r& N% Q( f2 Q! ]# ]& W8 R
- #include "bsp_sdio_sdcard.h"
" e3 N# z- E# {6 J% x3 t w' r - #include "bsp_usart1.h" - f$ Z2 M: B0 @$ s
- #include "bsp_usart3.h"' A# i* T; v$ y8 N+ {/ n
- #include "nmea/nmea.h". L' }8 U$ c! D1 T
- #include "gps_config.h"
- u6 d# D& h( e- g+ s7 W: z* r5 x% X - - N/ y1 I. G7 R3 \3 `: |$ g2 y: G
- + s" E- w! r5 w1 E
- / b. t+ B ?8 v
- H: e j* i1 w# ^
- / ]; q1 |4 x' G
- /**; b H6 b# \" y" Z
- * @brief nmea_decode_test 解码GPS模块信息# o# v# T8 t* S. z+ x& ?4 c
- * @param 无
: e7 P. _# d) S* b5 w2 i% c - * @retval 无$ e8 J2 ?! |/ `: v
- */
( Y* r, k& e/ U) p& V s - int nmea_decode_test(void)//文件中使用的应该是这个函数
1 V# ^& c( z: N9 X: l - {
3 s, Y. o: m6 [0 \/ }/ R -
4 n0 L) h( B" U4 T -
' p2 y+ V. ~4 [( F _ - nmeaINFO info; //GPS解码后得到的信息,为结构体
& @, ?6 J! H. p% H6 ^! g) C - nmeaPARSER parser; //解码时使用的数据结构 2 N. J; e E( P& }
- uint8_t new_parse=0; //是否有新的解码数据标志
7 [4 q. ?% H: e+ V$ v [ -
9 P- [/ s7 H- G6 m - nmeaTIME beiJingTime; //北京时间
9 Z1 |( K! J# q: H, ^9 i1 b: Y -
: m7 R) E$ _; G" k4 B- @ - /* 设置用于输出调试信息的函数 */
7 y, [: _2 F a - nmea_property()->trace_func = &trace;
6 c9 G7 k9 Y- z" R: S7 D" X - nmea_property()->error_func = &error;
5 o/ E9 C, ~4 {# U/ i) v1 I% w - ! _4 `! g z. P) n$ O
- /* 初始化GPS数据结构 */, z6 ], W+ j" i6 Q) p2 Y" S9 W4 z
- nmea_zero_INFO(&info);
' p8 R' f9 H# x8 d0 S0 Y - nmea_parser_init(&parser);
- }' S& T1 z6 ^% ]6 t ~+ h3 d - ! f/ ^; w. A' Q& M
- while(!GPS_HalfTransferEnd);
' p V! h0 }1 l% J. r4 z& @ A - while(GPS_HalfTransferEnd)
7 l2 A6 b, c. t1 _( y - {
5 T' N9 J' r9 t( A - if(GPS_HalfTransferEnd) /* 接收到GPS_RBUFF_SIZE一半的数据 */
! P* s( L9 V; h/ V& K: Y T - {+ ^; v4 ~8 I. d- ]4 J5 t
- /* 进行nmea格式解码 */. B" H) Z' \' X( G& P* Y
- nmea_parse(&parser, (const char*)&gps_rbuff[0], HALF_GPS_RBUFF_SIZE, &info);3 u8 k8 U, X+ F5 |
- 0 R: @; K! @. M& f
- GPS_HalfTransferEnd = 0; //清空标志位
/ c8 U+ x5 c' T6 m: S; x$ i - new_parse = 1; //设置解码消息标志 ////////////////////////////////////////////: A: H' {; ~4 f. D. Q* f% r" O
- }' m( h+ S' K0 J& g7 J, k+ ]
- else if(GPS_TransferEnd) /* 接收到另一半数据 */////////注意每一半的缓存区都足够储存一次完整的GPS的数据,此处不是把一次GPS数据分成两部分;
6 [% d+ h0 |: @" f1 z - {
) i$ i/ w+ ~ e - 2 S3 t+ x6 w) A6 o8 d5 g' ^
- nmea_parse(&parser, (const char*)&gps_rbuff[HALF_GPS_RBUFF_SIZE], HALF_GPS_RBUFF_SIZE, &info);+ n* w6 A% o$ r/ T$ n. O
-
0 y1 z' N3 _/ e8 u0 F2 a - GPS_TransferEnd = 0;# x) m& ~$ L, d6 S
- new_parse =1;! ] x% N W1 M/ e
- }
/ m* U6 R! N8 X" R- m& ~ - & g2 r8 r4 I) f$ N' {9 y
- if(new_parse ) //有新的解码消息 9 ^/ d3 j( s" f9 c
- { . q9 k) `7 I2 ~2 Z0 q6 j9 |7 P
- ' _# Q( \* H! d5 \; x$ ~
- zaishichua=info.lat;//////////////////////////////////////////////////////////// e" x8 N- e! x- E: A" E6 Q9 n
- zaishichub=info.lon;/////////////////////////////////////////////////////////////
- b% d! Z8 v: k9 d; z0 J+ K; S% g- a. x - /* 对解码后的时间进行转换,转换成北京时间 */8 a) \0 y. Y# K
- GMTconvert(&info.utc,&beiJingTime,8,1);7 C# e1 c7 s5 N2 K1 N6 h' D- R
- ; J$ i0 J' Z8 o6 v
- /* 输出解码得到的信息 */$ J2 A* a4 [3 V1 r% ]; ^' X9 [
- 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 ^
- printf("\r\n纬度:%f,经度%f\r\n",info.lat,info.lon);4 w4 \) @0 O% K$ F
- printf("\r\n纬度:%f,经度%f\r\n",zaishichua,zaishichub);///////////////////////////////////////////8 u7 H5 K$ U* d8 r
- printf("\r\n正在使用的卫星:%d,可见卫星:%d",info.satinfo.inuse,info.satinfo.inview); K" L$ F: \3 e, E5 G; ]
- printf("\r\n海拔高度:%f 米 ", info.elv);
1 o# x2 D% d& C, u; n1 R. \ - printf("\r\n速度:%f km/h ", info.speed);) v9 Y* V! l3 f
- printf("\r\n航向:%f 度", info.direction);
' O) e3 P$ u, Z9 K -
. |% l4 s* j* K5 v - new_parse = 0;* ^7 k# I! D* n" U7 u/ N
- }5 ?: T2 x. G5 j2 G/ c$ C; |" k6 ?% |
-
N; _( H5 Y9 g$ G5 F5 Z - }
3 k! C, j8 X: k0 |0 a - $ y8 n) v# P# d" \
- /* 释放GPS数据结构 */
. ^- t( k) N- L4 p$ f+ L" [ - // nmea_parser_destroy(&parser);
1 g5 u. f# P3 u - : w B7 w% Z( M1 ?
-
, u3 s; z6 ?2 p6 O o - return 0;
6 B) `1 t/ ?( H5 o: J' p6 ] - }
7 D6 |( K1 Q# [4 ?4 y7 O- d- {
# q4 W. N4 E' c+ W: K
3 c% ^! E& p) S7 B ]% R
" h5 U g1 z7 k: f$ S7 K8 A, _# n
, g; @- z; e2 ~
: J9 S7 g0 A; P4 I7 @
# Z/ f, Q3 D0 m- `- G$ `9 @- % Q8 r5 G ^0 S
- 8 R) L+ ~2 b9 M3 T
- ( P- E7 m6 k1 f- ^2 T, }
- /**************************************************end of file****************************************/
复制代码 ; q3 I% j/ w6 X# _
gsm.c - #include"gsm.h"
; ^' a4 e: u% w - const char num[]="18112728175";//大帅比的手机号
6 Q/ W8 B B5 u4 N0 z - int gsm(char *p1,char *p2)
5 Z' _( Y0 D8 S8 R8 h! `. l - {! Q/ `/ R! `$ m/ K) Z8 s
- USART2_Config();% K# Y0 U0 S5 R5 I0 a2 a# V
- SysTick_Init();
2 t g4 X9 P1 @; y5 x5 h - sim900a_sms((char *)num,strcat(strcat(p1,","),p2));
! W, a$ j- P! X! t. D - SIM900A_DELAY(5000); //////////////////////////延时是必须的,因为模块接收信息再传输需要时间
W# {) p5 e& |0 u- | - //sim900a_sms((char *)num,p2);" Y% o3 e+ W1 ?) \# t
- * }$ m( W: w _7 f( _/ K
- return 0;
% m' ^0 e, J, \8 M8 _) s9 z - }
复制代码 * j: E/ m, [8 q3 N/ \1 q
bsp_SysTick.c9 O! C' D1 ^& u3 p
- /**0 W5 N! R+ u* l) B3 C( l1 Y3 e
- ******************************************************************************. O1 F$ q2 h7 z
- * @file bsp_SysTick.c; ~% s9 Z, |9 ~5 B' E N' [
- * @author fire4 O" J1 v: e, ?1 M9 V% H3 ^. B f
- * @version V1.0
. q0 j0 }0 T7 y/ ^ - * @date 2013-xx-xx
% N# B& \5 A2 H, M1 O - * @brief SysTick 系统滴答时钟10us中断函数库,中断时间可自由配置,
9 n9 i7 I" M, z( M: d4 T. | - * 常用的有 1us 10us 1ms 中断。
1 s) g/ S0 v5 A( Z% {, z - ******************************************************************************" A* Y* X' i. ~0 p# M% J
- * @attention* j" I) r6 W" a+ I2 g
- *: o3 n" Q# ~9 ^0 P' Y' Y+ A9 p! @& z) g
- * 实验平台:野火 iSO STM32 开发板
n0 F$ S6 e5 \ - *
4 Q# Y! O, U1 ] - ******************************************************************************2 p* X2 j) [3 r3 s3 m0 M( k7 j
- */+ p; ]- s* i# M$ L$ A
-
: T7 Z! F- v& H* C1 S - #include "bsp_SysTick.h"
! \3 ? ~9 Y0 Q/ n* Z5 K3 O - # ~) o9 z/ D9 j2 Q
- static __IO u32 TimingDelay;
& F# z0 ?% a# r( E, M k. h - 0 S/ f1 K. j* n" B D c- l! i* K# l
- /**
# T4 [: l/ ]* H" m - * @brief 启动系统滴答定时器 SysTick8 a" @# W$ l, d6 E2 R! ^3 y
- * @param 无
. H$ O X' V9 q1 G. F& Z3 Z: T - * @retval 无
Y7 ^' \& J- K' N" W$ R7 K - */3 R0 U& f$ B K3 {) W- z
- void SysTick_Init(void)
$ v4 d& T' G% y' g" G$ n - {
0 b0 ~1 ~+ H: b$ t- r3 t - /* SystemFrequency / 1000 1ms中断一次
7 R; h, p9 Z0 ] - * SystemFrequency / 100000 10us中断一次$ J( R& R% O& e* t; ~# u
- * SystemFrequency / 1000000 1us中断一次) @1 w3 S9 v8 a
- */8 v8 j0 H( i6 I9 J
- // if (SysTick_Config(SystemFrequency / 100000)) // ST3.0.0库版本
! ?( _9 V* f0 C D. M d2 U* g8 [ - if (SysTick_Config(SystemCoreClock / 1000000)) // ST3.5.0库版本
; x) ~- @; M" l7 z: f9 x" ]9 E - {
* K( E+ i0 _* w, K# I' S+ d$ [ - /* Capture error */ 5 b( `. L& c! x, }9 a2 r% [
- while (1);5 f. V( }2 y$ f7 ~
- }' n Z+ l" m5 M/ L/ K3 k$ O# z
- // 关闭滴答定时器
- Z2 {+ `; y; l+ {/ G - SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;" [8 k1 }8 e, J# m3 w0 ?, |
- }
9 @5 t* i7 |: _6 O1 Z: d. l7 `
8 m6 ]2 {9 e0 | S/ J- /**
, V5 C6 a3 Y" X- b - * @brief us延时程序,10us为一个单位 ]7 w. r1 c1 T' r4 |5 y: d
- * @param ' D# Q% Q+ ~9 w
- * @arg nTime: Delay_us( 1 ) 则实现的延时为 1 * 10us = 10us
0 i* g {5 w% I1 B7 G - * @retval 无& b0 M7 {2 o' X& L2 c+ }% Z
- */
8 k$ D/ G& {. \ - void Delay_us(__IO u32 nTime)
0 c: p% c- W% Y; Y7 ^# Q" e8 J: {/ {$ [ - {
" g5 E7 m9 T2 O+ \; I! w - TimingDelay = nTime; , C7 r0 v' B$ S0 g6 w M7 ~1 c
- 8 j4 `# U) R5 J% J. Y+ e. L
- // 使能滴答定时器
0 d y8 ?9 D+ _. i) X - SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;4 z. `- H, I$ S, ~
- ; B# z* `6 g9 h+ j
- while(TimingDelay != 0);
$ V$ T5 o( B" b+ _& H( D5 W% x5 V- | - }
; e2 Q2 L; p' k V - 3 S1 L1 L! R0 b4 i! ~8 z' R# f
- /**: o/ n0 Z5 u/ ~' C4 i/ A: f
- * @brief us延时程序,10us为一个单位9 H6 T. \ u7 c1 [1 c% Z: ]
- * @param ' ^: x, E7 z' f* M3 q) } r" `
- * @arg nTime: Delay_us( 1 ) 则实现的延时为 1 * 10us = 10us
9 v- D. g) d$ d( d9 y - * @retval 无
# m" G# \& Y6 ]3 p, I - */
7 a& K E8 `4 t- ]2 A( I6 H& G - void Delay_ms(__IO u32 nTime)
3 m N; s k. v0 r$ M! ?; C( J2 o - {
! d9 G! s8 k& B$ N! k* @/ K5 C - while(nTime--)
& `7 M* _ M) Q! K( W5 ^: s0 t - {
8 d4 S% k; c! |* l" w1 K0 O% | - Delay_us(1000);
" ?. J# g: E U6 u% a0 D - }* p" z/ }1 C! r7 T
- }5 u7 Y& G$ {' [: W/ `! q& K
: _5 d& Z8 i# T3 v9 m6 K- /**
6 X! }5 O2 B4 u4 p. m( E% i0 ` - * @brief 获取节拍程序; x! S: I: B4 q9 T
- * @param 无
4 e4 s6 I8 `+ k - * @retval 无
0 G( H, [& U& z/ \9 `, [" p0 p - * @attention 在 SysTick 中断函数 SysTick_Handler()调用6 W5 _3 S2 s% k l Z
- */
" u3 c& @3 I4 @% ~, q3 L# X9 ~ - void TimingDelay_Decrement(void)
, u5 T$ M, l+ s" A9 z4 @1 | - {' c7 D7 S8 `; J# {: f# m! b
- if (TimingDelay != 0x00)4 ?( X1 j( I$ s7 b0 G' p
- {
2 a! G1 b* [: h6 I; }9 D4 ~1 | - TimingDelay--;
, O( @9 H2 K7 S- ^ - }" i, b. N+ C+ d0 |# R l
- }# J, q( Q) N! X: a. E2 D
- /*********************************************END OF FILE**********************/
复制代码 0 s8 ^$ b: O& Z h# h6 O4 X
sim900a.c - #include <stdarg.h>
) m9 O1 a- Y5 U: x - #include <string.h>
* Y* u+ p) R; {( W3 S# C - #include <stdlib.h>
4 Q& d" z, T9 o( L$ N - //#include "bsp_usart1.h" I- f3 u$ _9 w8 K1 [+ o
- #include "bsp_usart2.h"
. d# b3 q1 d. U( S' { - #include "sim900a.h" Q; H' i. w5 e
- ; O x- L& n, P* {) M+ |! p
. P* L1 A8 S8 j9 ?" B1 ]- A6 F# t
; ~# U, n: [# q) ~" m# V- void sim900a_sms(char *num,char *smstext)
( [* b: c. f" e' m) j V - {& y' d6 K, v% g! Y+ g' {# [
- // char ucsbuff[160];
6 N+ d( b$ b; x& [3 a/ U. N5 @$ t - SIM900A_CLEAN_RX(); //清空了接收缓冲区数据6 `6 l# g& G. j$ [/ J; I# U1 K9 w
- //英文
& r0 N% l4 t7 W5 C" [, P - sim900a_tx_printf("AT+CSCS="GSM"\r"); //"GSM"字符集
* i1 S8 x2 k, g - SIM900A_DELAY(100);
0 k7 ]# D, x2 n7 i* A% f" x& U( P - + L7 ~2 N3 u# o7 B, N$ e$ c7 {
- sim900a_tx_printf("AT+CMGF=1\r"); //文本模式" I: U# x h, I& U( `; Y7 Z# G, t$ s8 k
- SIM900A_DELAY(100);
8 N$ J$ `; {8 O5 B% a - 7 o( R3 r3 A1 S [' P5 E) W5 @
- sim900a_tx_printf("AT+CMGS="%s"\r",num); //电话号码* g6 F; p6 Q$ F# K
- SIM900A_DELAY(100);
( E; d4 Q$ s0 D: H! u4 ~9 k - ) a" ^: s- w- {! x7 l) d9 e
- sim900a_tx_printf("%s",smstext); //短信内容3 u8 i. r( ]2 n. s
- //SIM900A_DELAY(100); 8 H4 x7 [. R: b" @. v, b
- 3 E( Z4 y8 h! s" V- b
- 1 T: k" e/ E/ @# J1 F4 Z
- SIM900A_DELAY(1);
! \# |6 s% B* \$ B) j - USART2->DR=(u32)0x1A; //发送十六进制数:0X1A,信息结束符号//////////////////(gsm模块中以此为标志位,才发送短信)
# s/ `% |8 @7 [, c$ J - }7 n1 p& m" I0 }! Z5 L+ _' h
( f" E+ r9 `: X- ' y# r& |4 d, y
7 z- ^" ?' C, x
# P- m. ]8 G1 S# {" f- % x9 {$ l: u2 i! o2 U% _: F
- /*---------------------------------------------------------------------*/
复制代码 9 r% _/ L& {* H2 u( m) u3 x3 B% Y
|