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

STM32 MSN&Dial

[复制链接]
gzweiyan-44649 发布时间:2009-2-14 14:21

一.实验内容
基于stm32平台控制手机模块拨打电话,取消拨打电话以及发送短信。
按下WKUP键拨打电话,按下Tamper键则取消拨打,按下SEL键就以短信形式发送一串英文字符到手机。
二.实验流程

 
三.实验结果
按下WKUP键,拨通手机;按下Tamper键截断通话;按下SEL键往手机发送短信。
四.实现原理
4.1拨打电话命令为atd+电话号码+分号+回车,只要通过串口往手机模块发送这一串命令就可以实现拨打电话
功能。
4.2截止拨号命令为ath+回车,理解方式是at+hold(举起或停下来),同样,拨打的相对应at指令为atd可以理
解为at+dial(拨打)
4.3发送短信的命令相比拨打电话和截止拨号有点复杂,具体分为三步。第一步设置短信消息的格式,第二步
设置接收短信的手机号码,第三步就是编写短信消息的内容。"AT+CMGF=1\r\n",作用是设置短信消息为英文
格式,手机模块接到这串命令之后会返回" OK \r\n",那么STM32不停循环检测串口返回来的信息,直至出现
回车符才进行下一步动作。接着往手机模块发送"AT+CMGS=\"13800138000\"\r\n",作用是设置短信接收的手
机号码,接着手机模块会返回'>'符号,同理STM32不停循环检测串口接收的信息,直至出现'>'才进行下一步
动作。下一步就是往手机模块发送"We are the best team!\x1a",“We are the best team!”为信息的内
容,字符” \x1a”为键盘“CTRL+Z”的ASCII码值。这里分为三步,每一步都要完成动作之后才能进行下一
步,假如不循环检测串口返回的信息,一连串往手机模块发送三串命令,手机模块会相应不来,导致丢失部
分命令的后果。

主循环:
while(1)
 { //如果按下WKUP键,则拨打号码为“13800138000”的手机
 if(!GPIO_Keypress(GPIO_WKUP, BUT_WKUP))
  Serial_PutString("atd13800138000;\r\n");
  while(!GPIO_Keypress(GPIO_WKUP, BUT_WKUP));
 //如果按下Tamper键,则截止通话
    if(GPIO_Keypress(GPIO_KEY, BUT_Tamper))
  Serial_PutString("ATH\r\n");
  while(GPIO_Keypress(GPIO_KEY, BUT_Tamper));
 //如果按下SEL键,则调用MSN()函数,达到发送短信的目的
    if(GPIO_Keypress(GPIO_KEY, BUT_SEL))
  MSN();
  while(GPIO_Keypress(GPIO_KEY, BUT_SEL));
 //延迟的作用为简单的防按键抖动功能
 Delay(100);
 }
发送短信的命令:
void MSN(void)
{u8 word;
  Serial_PutString("AT+CMGF=1\r\n");         //设置短信消息为英文格式
  while(1)
   {word=USART_ReceiveData(USART3);
    if(word=='\n')
    break;
    }
 Serial_PutString("AT+CMGS=\"13800138000\"\r\n");   //设置短信接收的号码
 while(1)
   {word=USART_ReceiveData(USART3);
    if(word=='>')
    break;
    }
 Serial_PutString("We are the best team!\x1a");    //编写短信内容
 while(1)
   {word=USART_ReceiveData(USART3);
    if(word=='\n')
    break;
    }
 }
五.程序深入分析
5.1
STM32需要用到的每一只引脚都需要使能引脚时钟,本程序需要用到三个按键以及一个串口(USTAR3),其中两
个按键在PC口,一个按键在PA口,程序在RCC_Configuration()函数里面实现:
/*使能GPIOx 时钟 */
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE);
/* 使能USARTx 时钟 */
RCC_APB1PeriphClockCmd(RCC_APB_Periph_USARTx, ENABLE);
/* 使能按键引脚时钟 */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO| RCC_APB2Periph_GPIO_BUTTON |
RCC_APB2Periph_GPIO_WKUP , ENABLE);
5.2
STM32每一只引脚都有复用功能,所以用到的每一只引脚都需要配置引脚的功能,程序在
GPIO_Configuration()函数里面实现:
GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);
  /* 设置USARTx_Tx 为复用推挽输出,频率为50MHz */
  GPIO_InitStructure.GPIO_Pin = GPIO_TxPin;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOx, &GPIO_InitStructure);
  /* 设置USARTx_Rx为浮空输入,频率为50MHz */
  GPIO_InitStructure.GPIO_Pin = GPIO_RxPin;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOx, &GPIO_InitStructure);
  /* 设置按键引脚为浮空输入,频率为2MHz */
  GPIO_InitStructure.GPIO_Pin = BUT_LEFT | BUT_RIGHT | BUT_UP | BUT_DOWN | BUT_Tamper |
BUT_SEL;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_Init(GPIO_KEY, &GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin = BUT_WKUP;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIO_WKUP, &GPIO_InitStructure);
引脚的配置有三项,Pin、Speed与Mode,在设置USARTx_Tx时把三项都设置了,而在设置USART_Rx时却只设置
了两项,其中Speed没有设置,则保持上一次设置的状态,也就是在设置USART_Tx时的50MHz。同理在设置上
下左右与Tamper、SEL键对应引脚时都设置了三项,而设置WKUP键对应引脚时只是配置了两项。
5.3 在主函数的死循环里面最后一步是调用delay()函数来延迟100ms,作用是防止按键的抖动。而delay
函数的实现是通过调用SysTick时钟源溢出中断来实现的,SysTick时钟源在main函数的开头设置了为1ms中断
一次。
5.4 主程序是通过串口3和手机模块通信的,而波特率设置为115200,程序如下:
USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No ;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
其实手机模块也有其通讯频率的,假如两者的频率不同,那么就不能达到通讯的目的,现在就让我们来看看
如何查看和修改手机模块的通讯频率。硬件的连接很简单,只需要把手机模块的电源接上,插上手机模块和
手机卡,用USB转串口线把电脑和手机模块连接起来,打开SecureCRT软件,并设置好通讯频率。假如软件设
置的通信频率和手机模块的实际频率不同,那么在软件的窗口就会出现乱码。现在有一个疑问啦,假如手机
模块刚买回来,不知道通信频率怎么办,不用担心,手机模块如果没经设置,它的通讯频率是默认第一次接
收数据的数据频率。下面举例子把手机模块的通讯频率由115200改为57600,具体操作如下:

 
指令at+ipr?的作用为查看当前手机模块的通讯频率,at+ipr=115200为设置手机模块的当前通讯频率。回车
之后,再次输入数据就会出现乱码,因为手机模块的通讯频率已经修改了,现在只需停止串口软件通信,然
后把软件的通讯频率改为115200就可以了。

伟研科技,http://www.gzweiyan.com/html/products/20081201/56.html
收藏 评论0 发布时间:2009-2-14 14:21

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

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