微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 第092例:GSM模块例程-1. 语音通话功能

第092例:GSM模块例程-1. 语音通话功能

时间:10-02 整理:3721RD 点击:
【HAL库每天一例】系列例程从今天开始持续更新。
我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。
例程下载:
资料包括程序、相关说明资料以及软件使用截图

百度云盘:https://pan.baidu.com/s/1slN8rIt 密码:u6m1

360云盘:https://yunpan.cn/OcPiRp3wEcA92u密码 cfb6

(硬石YS-F1Pro开发板HAL库例程持续更新\2. 软件设计之高级裸机例程(HAL库版本)\YSF1_HAL-124. GSM模块例程)
/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: 1. 语音通话功能
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:http://www.ing10bbs.com
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */
【1】例程简介
  SIM900A是紧凑型、高可靠性的无线模块,采用SMT封装的双频GSM/GPRS模块解决方案,采用
功能强大的处理器ARM9216EJ-S内核,能满足低成本、紧凑尺寸的开发要求。
  本次实验是利用硬石提供的GSM模块来进行的,实现开发板和手机端的通话。
  
【2】跳线帽情况
******* 为保证例程正常运行,必须插入以下跳线帽 **********
丝印编号     IO端口      目标功能引脚        出厂默认设置
  JP1        PA10        TXD(CH340G)          已接入
  JP2        PA9         RXD(CH340G)          已接入
  CN10       PA2         RX(HC05)             已接入
  CN10       PA3         TX(HCO5)             已接入
【3】操作及现象
    使用开发板配套的MINI USB线连接到开发板标示“调试串口”字样的MIMI USB接口(需要安
装驱动),在电脑端打开串口调试助手工具,设置参数为115200 8-N-1,将GSM模块装入SIM卡,接好线
同时将例程中的号码改为自己的号码,编译下载程序后,即可在串口助手观察到相关信息,也能实现
通话。
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/






bsp_gsm.h文件内容

  1. #ifndef __BSP_GSM_H__
  2. #define __BSP_GSM_H__

  3. /* 包含头文件 ----------------------------------------------------------------*/
  4. #include "stm32f1xx_hal.h"
  5. #include "usart/bsp_usartx.h"

  6. /* 类型定义 ------------------------------------------------------------------*/
  7. typedef enum
  8. {
  9.   GSM_TRUE,
  10.   GSM_FALSE,   
  11. }GSM_res_e;

  12. /* 宏定义 --------------------------------------------------------------------*/
  13. #define GSM_config()                                         GSM_USARTx_Init()
  14. #define GSM_tx_printf(fmt, ...)     GSM_USART_printf(GSM_USARTx,fmt,##__VA_ARGS__)     //printf格式发送命令(纯发送,不进行任何接收数据处理)

  15. #define GSM_CLEAN_RX()              clean_rebuff()
  16. #define GSM_ate0()                  GSM_cmd("ATE0\r","OK",100) //关闭回显
  17. #define GSM_TX(cmd)                        GSM_tx_printf("%s",cmd)
  18. #define GSM_IS_RX()                 (USART_GetFlagStatus(GSM_USARTx, USART_FLAG_RXNE) != RESET)
  19. #define GSM_RX(len)                 ((char *)get_rebuff(&(len)))
  20. #define GSM_DELAY(time)             HAL_Delay(time) //延时
  21. #define GSM_SWAP16(data)                        __REVSH(data)

  22. /*************************** 电话 功能 ***************************/
  23. #define GSM_HANGON()                                GSM_TX("ATA\r");                                                               
  24. #define GSM_HANGOFF()                                GSM_TX("ATH\r");        //挂断电话        

  25. /* 扩展变量 ------------------------------------------------------------------*/
  26. /* 函数声明 ------------------------------------------------------------------*/
  27. //                  指令             正常返回
  28. //本机号码          AT+CNUM\r         +CNUM: "","13265002063",129,7,4            //很多SIM卡默认都是没设置本机号码的,解决方法如下 http://www.multisilicon.com/blog/a21234642.html
  29. //SIM营运商         AT+COPS?\r        +COPS: 0,0,"CHN-UNICOM"   OK
  30. //SIM卡状态         AT+CPIN?\r        +CPIN: READY   OK
  31. //SIM卡信号强度     AT+CSQ\r          +CSQ: 8,0   OK
  32. uint8_t GSM_cmd(char *cmd,char *reply,uint32_t waittime);
  33. uint8_t GSM_cmd_check(char *reply);
  34. uint8_t GSM_init(void); //初始化并检测模块

  35. /*************************** 电话 功能 ***************************/
  36. uint8_t GSM_cnum(char *num); //获取本机号码
  37. void GSM_call(char *num); //发起拨打电话(不管接不接通)
  38. uint8_t IsRing(char *num); //查询是否来电,并保存来电号码

  39. /***************************  短信功能  ****************************/
  40. void GSM_sms(char *num,char *smstext); //发送短信(支持中英文,中文为GBK码)
  41. char *GSM_waitask(uint8_t waitask_hook(void)); //等待有数据应答,返回接收缓冲区地址
  42. void GSM_gbk2ucs2(char * ucs2,char * gbk);           
  43. uint8_t IsReceiveMS(void);
  44. uint8_t readmessage(uint8_t messadd,char *num,char *str);
  45. uint8_t hexuni2gbk(char *hexuni,char *chgbk);

  46. /*************************** GPRS 功能 ***************************/
  47. void GSM_gprs_init(void); //GPRS初始化环境
  48. uint8_t GSM_gprs_tcp_link(char *localport,char * serverip,char * serverport); //TCP连接
  49. uint8_t GSM_gprs_udp_link(char *localport,char * serverip,char * serverport); //UDP连接
  50. uint8_t GSM_gprs_send(const char * str); //发送数据
  51. uint8_t GSM_gprs_link_close(void); //IP链接断开
  52. uint8_t GSM_gprs_shut_close(void); //关闭场景
  53. uint8_t        PostGPRS(void);
  54. #endif  /* __BSP_GSM_H__ */

  55. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/

复制代码


main.c文件内容

  1. /**
  2.   ******************************************************************************
  3.   * 文件名程: main.c
  4.   * 作    者: 硬石嵌入式开发团队
  5.   * 版    本: V1.0
  6.   * 编写日期: 2015-10-04
  7.   * 功    能: GSM模块功能实现:通话功能
  8.   ******************************************************************************
  9.   * 说明:
  10.   * 本例程配套硬石stm32开发板YS-F1Pro使用。
  11.   *
  12.   * 淘宝:
  13.   * 论坛:http://www.ing10bbs.com
  14.   * 版权归硬石嵌入式开发团队所有,请勿商用。
  15.   ******************************************************************************
  16.   */
  17. /* 包含头文件 ----------------------------------------------------------------*/
  18. #include "stm32f1xx_hal.h"
  19. #include "stm32f1xx_it.h"
  20. #include "usart/bsp_debug_usart.h"
  21. #include "led/bsp_led.h"
  22. #include "key/bsp_key.h"
  23. #include "usart/bsp_usartx.h"
  24. #include "gsm/bsp_gsm.h"
  25. #include <string.h>

  26. /* 私有类型定义 --------------------------------------------------------------*/
  27. /* 私有宏定义 ----------------------------------------------------------------*/
  28. #define GSM_PHONE_NUM                     "18316021780"

  29. /* 私有变量 ------------------------------------------------------------------*/
  30. static uint8_t timecount=0;
  31. char    testbuff[100];
  32. uint8_t len;
  33. char *  rebuff;

  34. /* 扩展变量 ------------------------------------------------------------------*/
  35. /* 私有函数原形 --------------------------------------------------------------*/
  36. /* 函数体 --------------------------------------------------------------------*/
  37. /**
  38.   * 函数功能: 系统时钟配置
  39.   * 输入参数: 无
  40.   * 返 回 值: 无
  41.   * 说    明: 无
  42.   */
  43. void SystemClock_Config(void)
  44. {
  45.   RCC_OscInitTypeDef RCC_OscInitStruct;
  46.   RCC_ClkInitTypeDef RCC_ClkInitStruct;

  47.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;  // 外部晶振,8MHz
  48.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  49.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREdiv_div1;
  50.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  51.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  52.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;  // 9倍频,得到72MHz主时钟
  53.   HAL_RCC_OscConfig(&RCC_OscInitStruct);

  54.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  55.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  56.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;       // 系统时钟:72MHz
  57.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_div1;              // AHB时钟:72MHz
  58.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_div2;               // APB1时钟:36MHz
  59.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_div1;               // APB2时钟:72MHz
  60.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);

  61.          // HAL_RCC_GetHCLKFreq()/1000    1ms中断一次
  62.         // HAL_RCC_GetHCLKFreq()/100000         10us中断一次
  63.         // HAL_RCC_GetHCLKFreq()/1000000 1us中断一次
  64.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);  // 配置并启动系统滴答定时器
  65.   /* 系统滴答定时器时钟源 */
  66.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  67.   /* 系统滴答定时器中断优先级配置 */
  68.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  69. }

  70. /**
  71.   * 函数功能: 简单的延时函数
  72.   * 输入参数: 无
  73.   * 返 回 值: 无
  74.   * 说    明: 无
  75.   */
  76. static uint8_t timeout_40s(void)
  77. {  
  78.   static uint16_t timeout_count;
  79.   GSM_DELAY(10);
  80.   timeout_count++;
  81.   if(timeout_count>4000)
  82.     return GSM_TRUE;
  83.   else
  84.     return GSM_FALSE;
  85. }

  86. /**
  87.   * 函数功能: 主函数.
  88.   * 输入参数: 无
  89.   * 返 回 值: 无
  90.   * 说    明: 无
  91.   */
  92. int main(void)
  93. {
  94.   char num[20]={0};
  95.   /* 复位所有外设,初始化Flash接口和系统滴答定时器 */
  96.   HAL_Init();
  97.   /* 配置系统时钟 */
  98.   SystemClock_Config();
  99.   /* 板载LED初始化 */
  100.   LED_GPIO_Init();

  101.   /* 板子按键初始化 */
  102.   KEY_GPIO_Init();

  103.   /* 初始化串口并配置串口中断优先级 */
  104.   MX_DEBUG_USART_Init();
  105.   
  106.   printf("硬石GSM模块拨号例程\n");
  107.   
  108.   /* 检测模块响应是否正常 */
  109.   while(GSM_init()!= GSM_TRUE)
  110.   {
  111.     printf("\n模块响应测试不正常!\n");
  112.     printf("若模块响应测试一直不正常,请检查模块的连接或是否已开启电源开关\n");
  113.     GSM_DELAY(1000);
  114.   }
  115.   
  116.   printf("\n通过了模块响应测试,5秒后开始拨号测试...\n");
  117.   /* 延时5秒再发送命令到模块 */
  118.   GSM_DELAY(5000);
  119.   
  120.   //拨打电话
  121.   GSM_call(GSM_PHONE_NUM);                      //拨打112电话测试
  122.   rebuff = GSM_waitask(0);  
  123.   if(strstr(rebuff,"OK") != NULL)           //响应OK,表示模块正常接收到命令
  124.   {
  125.     printf("\n正在呼叫\n");
  126.     GSM_CLEAN_RX();                     //清除接收缓冲区
  127.     rebuff = GSM_waitask(timeout_40s);            //重新等待消息
  128.     if(strstr(rebuff,"NO CARRIER") != NULL) //响应NO CARRIER,通话结束
  129.     {
  130.       printf("通话结束\n");
  131.     }
  132.     else if(strstr(rebuff,"NO ANSWER") != NULL)   //响应NO ANSWER,无人接听
  133.     {
  134.       printf("你拨打的电话暂时无人接听,请稍后再拨\n");
  135.     }
  136.     else
  137.     {
  138.       printf("对方电话忙,请稍后再拨\n");
  139.     }      
  140.   }
  141.   
  142.   printf("\n进行接电话测试:使用另外一台手机拨打GSM模块手机号码\n");  
  143.         GSM_TX("AT+CLIP=1\r");
  144.         GSM_CLEAN_RX(); // 清除接收缓冲区
  145.   
  146.         /* 无限循环 */
  147.   while(1)
  148.         {
  149.                 if(timecount>=100)
  150.                 {
  151.                         if(IsRing(num)== GSM_TRUE)
  152.                         {
  153.                                 printf("Ringing:\nFrom:%s\n请按下KEY2接听或者按下KEY1挂断\n\r",num);        
  154.                         }
  155.                         timecount=0;
  156.                 }
  157.                 if(KEY2_StateRead() == KEY_DOWN)
  158.                 {
  159.                         GSM_HANGON();
  160.                 }
  161.                 if(KEY1_StateRead() == KEY_DOWN)
  162.                 {
  163.                         GSM_HANGOFF();
  164.                 }        
  165.                 timecount++;
  166.                 GSM_DELAY(10);
  167.         }
  168. }



  169. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

复制代码





这个转载不错哦。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top