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