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

STM32 MSN&Dial

[复制链接]
gzweiyan-44649 发布时间:2009-2-14 14:21
- ]* E+ {8 V. t  W
一.实验内容
5 z9 k/ R% M- |" H, f. ]  U; e基于stm32平台控制手机模块拨打电话,取消拨打电话以及发送短信。2 ?: k+ A$ |5 ~2 X$ M: S0 x; v( b
按下WKUP键拨打电话,按下Tamper键则取消拨打,按下SEL键就以短信形式发送一串英文字符到手机。
/ {* U4 m# T$ t( s: B5 z: `1 \+ H2 G二.实验流程
  G& [6 a- {% G+ q- X) O! _0 Z/ ~8 i$ O( i
 
: }, K8 G3 d! M; d. n三.实验结果
  B7 b9 |' E6 p9 a7 L! ^1 f7 Q按下WKUP键,拨通手机;按下Tamper键截断通话;按下SEL键往手机发送短信。
1 A* k4 S  A% B4 F: \$ [+ L四.实现原理
6 g- V7 o3 y: W4 i  u4.1拨打电话命令为atd+电话号码+分号+回车,只要通过串口往手机模块发送这一串命令就可以实现拨打电话  {  j5 W8 S/ o$ [. v" o+ h6 L
功能。* |5 h; ^0 w7 n  T$ }$ x! w; A/ `
4.2截止拨号命令为ath+回车,理解方式是at+hold(举起或停下来),同样,拨打的相对应at指令为atd可以理, K: ~- r: k# n4 Q# J# t
解为at+dial(拨打)
" t  C/ Q& n. g; J) P4 s6 t4.3发送短信的命令相比拨打电话和截止拨号有点复杂,具体分为三步。第一步设置短信消息的格式,第二步* p6 H1 Y) W, T1 T
设置接收短信的手机号码,第三步就是编写短信消息的内容。"AT+CMGF=1\r\n",作用是设置短信消息为英文
) _' t' z. y3 g* z1 a格式,手机模块接到这串命令之后会返回" OK \r\n",那么STM32不停循环检测串口返回来的信息,直至出现
6 y. S/ m7 N: M+ p0 v  Z回车符才进行下一步动作。接着往手机模块发送"AT+CMGS=\"13800138000\"\r\n",作用是设置短信接收的手5 t$ A9 z6 f/ B1 T3 H
机号码,接着手机模块会返回'>'符号,同理STM32不停循环检测串口接收的信息,直至出现'>'才进行下一步
, I# l- b* o+ V8 s8 }动作。下一步就是往手机模块发送"We are the best team!\x1a",“We are the best team!”为信息的内
: c( U  ^6 W6 R! s, E* c9 C, z容,字符” \x1a”为键盘“CTRL+Z”的ASCII码值。这里分为三步,每一步都要完成动作之后才能进行下一, E6 }1 d$ L* N1 ~, m# _& E
步,假如不循环检测串口返回的信息,一连串往手机模块发送三串命令,手机模块会相应不来,导致丢失部
, s' S  }  `; U+ k: k分命令的后果。/ k4 D2 a/ `9 m0 S
% P- ~/ ^4 Z3 E) Y' _4 I
主循环:
5 f( g. \& n9 w9 A2 Qwhile(1)" e9 W  ]+ [5 l) w  l+ d
 { //如果按下WKUP键,则拨打号码为“13800138000”的手机
$ ^5 W! _% O: { if(!GPIO_Keypress(GPIO_WKUP, BUT_WKUP))# T& V* i6 t" _) t% u1 _6 \
  Serial_PutString("atd13800138000;\r\n");+ H! W+ n" a  i
  while(!GPIO_Keypress(GPIO_WKUP, BUT_WKUP));- t" E! N. g2 i1 |' ^
 //如果按下Tamper键,则截止通话3 n0 _& {2 m' r' H
    if(GPIO_Keypress(GPIO_KEY, BUT_Tamper))
) r( _; y4 s3 T# H7 E5 P8 {  D  Serial_PutString("ATH\r\n");
. c7 N' N% u8 n/ _. s  while(GPIO_Keypress(GPIO_KEY, BUT_Tamper));# i" _4 I$ Y5 j$ w. a( H
 //如果按下SEL键,则调用MSN()函数,达到发送短信的目的
6 ?4 y5 v; x5 P  E6 T" h& _. o, s    if(GPIO_Keypress(GPIO_KEY, BUT_SEL))
4 C- q  V0 s, h% l5 ]  MSN();
. ^& e& P; G/ D  |+ u  while(GPIO_Keypress(GPIO_KEY, BUT_SEL));3 u2 `* }$ Z& L& @. X( C
 //延迟的作用为简单的防按键抖动功能
$ x5 S+ T/ ~2 I& E, ] Delay(100);
4 Q. F2 q2 C) |' b$ _  U }# q5 Y9 U& r4 n2 B$ E: H5 O& z
发送短信的命令:# _# U7 @# B: m- L- c7 J( J. J
void MSN(void)8 q1 \) }, R2 [
{u8 word;
9 u8 f; [7 ^& X; b- Y& W) H  Serial_PutString("AT+CMGF=1\r\n");         //设置短信消息为英文格式
, g( H! r0 o1 ?2 {% T0 X  while(1)
" N8 ?  u7 J# c: }3 N6 L: |3 o& l   {word=USART_ReceiveData(USART3);
9 ?- w0 \5 e% M6 |3 c7 V' I, Q    if(word=='\n')
, y; B1 c  j) d& [& q$ \/ C    break;
4 o# d9 h& H9 H" r+ a% u/ e9 `8 s& X    }
) }4 b! _$ _5 f( L: _ Serial_PutString("AT+CMGS=\"13800138000\"\r\n");   //设置短信接收的号码( E. d: V4 d. y& K6 k
 while(1)
8 _; j# d/ ]) z4 @4 L   {word=USART_ReceiveData(USART3);
1 q& G2 `! l2 j" ^' a, F, h    if(word=='>')
+ v7 o: E6 M" j# r4 O% `    break;7 z" s3 c: n6 m+ T5 I
    } + p* i. p8 D& e% b' v
 Serial_PutString("We are the best team!\x1a");    //编写短信内容3 l. t$ a/ P7 E; O) Q# n* z! z
 while(1)4 p( {* w3 M* u( [
   {word=USART_ReceiveData(USART3);
+ v  X* J% R$ c; V1 v9 }8 |6 f    if(word=='\n')4 X5 H  ~# p5 M3 ?  f+ ]0 w$ a+ [4 [8 P
    break;
6 {( E" \: u; J: S    }
5 V( B1 m, C8 C: }* N7 i }
, X- L# j) p9 b# w2 i) V/ a* ?: u五.程序深入分析, v1 \. |% C& g, z( x
5.1 . g0 m* ]; R& `5 d8 ]1 U
STM32需要用到的每一只引脚都需要使能引脚时钟,本程序需要用到三个按键以及一个串口(USTAR3),其中两
% p  Z! O- P9 O. c' n/ q" k+ E( m个按键在PC口,一个按键在PA口,程序在RCC_Configuration()函数里面实现:
& _' o) @) p3 {/*使能GPIOx 时钟 */
: Z/ `& a6 g) c9 E2 O RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE);
% B% O8 Q" r" d) z# X+ D! Y  |/* 使能USARTx 时钟 */8 e3 p9 i, T4 O6 |% Q/ h  K% l
RCC_APB1PeriphClockCmd(RCC_APB_Periph_USARTx, ENABLE);
6 B8 S( V2 O! |2 o% O3 f6 s3 l( e/* 使能按键引脚时钟 */
$ j) \  Z3 k5 h* n6 B  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO| RCC_APB2Periph_GPIO_BUTTON | # N  I! L5 P  m" A5 e9 q
RCC_APB2Periph_GPIO_WKUP , ENABLE);+ e& V2 j) ?8 ]2 d  C
5.2
# E  F/ [2 h: q4 uSTM32每一只引脚都有复用功能,所以用到的每一只引脚都需要配置引脚的功能,程序在! ]5 E" Z+ T' F! v$ p3 O
GPIO_Configuration()函数里面实现:
! f$ k% M/ S0 {. LGPIO_InitTypeDef GPIO_InitStructure;
; w4 w8 Q, m# O* |! G2 p  GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);
( @& @  e& V# u& l  /* 设置USARTx_Tx 为复用推挽输出,频率为50MHz */
. {1 B' V2 N, N  GPIO_InitStructure.GPIO_Pin = GPIO_TxPin;4 v% z3 {, ~" L
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
" d  d# M$ {* _5 W3 P# E# A  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
. _5 q, z; ^6 R! E. l7 F  GPIO_Init(GPIOx, &GPIO_InitStructure);, T$ X' d! ]/ B; t
  /* 设置USARTx_Rx为浮空输入,频率为50MHz */
3 {1 w, I0 c3 ~+ J  GPIO_InitStructure.GPIO_Pin = GPIO_RxPin;
0 |* V. X5 N* N8 s9 Q  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
9 y6 L. J, r3 D- v1 Z$ j3 P  GPIO_Init(GPIOx, &GPIO_InitStructure);, ^7 P- N" ^6 Z
  /* 设置按键引脚为浮空输入,频率为2MHz */; x. z/ m* O6 K" ^
  GPIO_InitStructure.GPIO_Pin = BUT_LEFT | BUT_RIGHT | BUT_UP | BUT_DOWN | BUT_Tamper | " m, O' w, {8 T2 s- J
BUT_SEL;
8 \, D- u% h4 l  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- G' B" f! f' M: p  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;; F7 V, q$ Q  t
  GPIO_Init(GPIO_KEY, &GPIO_InitStructure);
9 c. c" `% p: s' X0 Y  GPIO_InitStructure.GPIO_Pin = BUT_WKUP;
, @' T! |4 ^4 Z# J2 u  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
* w6 c6 F3 @) z) L7 W2 _7 J! I  GPIO_Init(GPIO_WKUP, &GPIO_InitStructure);) A7 W; f, F1 G$ y9 P- X- u* f
引脚的配置有三项,Pin、Speed与Mode,在设置USARTx_Tx时把三项都设置了,而在设置USART_Rx时却只设置
/ p. y' |5 |, b. b7 l) Y0 l7 y了两项,其中Speed没有设置,则保持上一次设置的状态,也就是在设置USART_Tx时的50MHz。同理在设置上
/ d9 {4 Z: ^, p  r3 d! s下左右与Tamper、SEL键对应引脚时都设置了三项,而设置WKUP键对应引脚时只是配置了两项。; D9 B+ n. l4 u: f3 j/ N
5.3 在主函数的死循环里面最后一步是调用delay()函数来延迟100ms,作用是防止按键的抖动。而delay0 e! O: i9 W' e- c% d% ]
函数的实现是通过调用SysTick时钟源溢出中断来实现的,SysTick时钟源在main函数的开头设置了为1ms中断. D  h. Z8 e3 `
一次。
6 e& N4 [& k$ Y! [# y# ?6 ?5.4 主程序是通过串口3和手机模块通信的,而波特率设置为115200,程序如下:& v) X+ |% z# y5 p& T  N
USART_InitStructure.USART_BaudRate = 115200;
' y" a# a3 B9 j, G! [  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
7 n. B9 o- x) B4 m( F, u; J  USART_InitStructure.USART_StopBits = USART_StopBits_1;
% @3 J  ^+ k8 x  USART_InitStructure.USART_Parity = USART_Parity_No ;
% X! x7 ~2 Y& D5 p8 y  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
+ k2 e/ J$ Y3 `4 S5 H  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
! d0 r. i. c9 @* j# w* |- G% N其实手机模块也有其通讯频率的,假如两者的频率不同,那么就不能达到通讯的目的,现在就让我们来看看6 ?0 h" c1 z/ e. r# m) [% t+ u6 X
如何查看和修改手机模块的通讯频率。硬件的连接很简单,只需要把手机模块的电源接上,插上手机模块和
; c$ [$ n) S" _0 @: e+ o* \, Q& C5 C( e手机卡,用USB转串口线把电脑和手机模块连接起来,打开SecureCRT软件,并设置好通讯频率。假如软件设
  W9 r, [* d0 ^4 Z0 \3 V% Z置的通信频率和手机模块的实际频率不同,那么在软件的窗口就会出现乱码。现在有一个疑问啦,假如手机+ g. q5 e. @( x3 S
模块刚买回来,不知道通信频率怎么办,不用担心,手机模块如果没经设置,它的通讯频率是默认第一次接; {7 m/ `; h" X
收数据的数据频率。下面举例子把手机模块的通讯频率由115200改为57600,具体操作如下:
% |6 o0 }( J9 \7 X+ n3 @6 i* Y6 j8 }& t3 h
 
$ b' {0 t; K4 E3 x指令at+ipr?的作用为查看当前手机模块的通讯频率,at+ipr=115200为设置手机模块的当前通讯频率。回车
5 Y) H+ t( K' X之后,再次输入数据就会出现乱码,因为手机模块的通讯频率已经修改了,现在只需停止串口软件通信,然
$ t+ G0 @/ M" u6 m8 [, j) K% D后把软件的通讯频率改为115200就可以了。6 r( R7 s7 H1 u2 ^% B4 C

" q" x. q- s0 {8 o  T伟研科技,http://www.gzweiyan.com/html/products/20081201/56.html
收藏 评论0 发布时间:2009-2-14 14:21

举报

0个回答

所属标签

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