Mcuzone 野芯科技

标题: 用STM32F407开发板实现4G模块L610拨打电话功能 [打印本页]

作者: Mcuzone_TKN    时间: 2020-6-2 15:04
标题: 用STM32F407开发板实现4G模块L610拨打电话功能
本帖最后由 Mcuzone_TKN 于 2020-6-9 09:25 编辑

关键词:STM32F407 4G模块 L610 拨打电话 广和通 串口 AT命令

概述:用stm32f407串口连接4G模块L610通过AT命令实现拨打电话的功能。


描述:L610的电平是1.8v,STM32F407的电平是3.3v,所以需要通过电平转换模块连接两者,电平转换模块A端的电平要大于B端的电平。测试时,电话号码写在程序里面。

硬件连接:STM32的串口(PA9,PA10)通过电平转换模块连接到L610的串口。

(附有测试文件)




配置初始化串口
  1. <font color="black">int fputc(int ch, FILE *f)
  2. {
  3. while((USART1->SR&0x40)==0);
  4. USART1->DR = (u8) ch;
  5. return ch;
  6. }

  7. void USART1_Init(void)
  8. {  
  9.   GPIO_InitTypeDef GPIO_InitStructure;
  10. USART_InitTypeDef USART_InitStructure;
  11. NVIC_InitTypeDef NVIC_InitStructure;
  12.         
  13.    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
  14.    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //使能USART1时钟
  15. //串口1对应引脚复用映射
  16.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1
  17.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1
  18. //USART1端口配置
  19.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10
  20.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
  21.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHZ
  22.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
  23.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉&shy;
  24.         GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10。
  25. //USART1初始化设置
  26.         USART_InitStructure.USART_BaudRate = 115200; //波特率设置
  27.         USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式
  28.         USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位
  29.         USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验
  30.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流控制
  31.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
  32.   USART_Init(USART1, &USART_InitStructure); //初始化串口1
  33.         
  34.   USART_Cmd(USART1, ENABLE);  //使能串口1
  35.         
  36.         USART_ClearFlag(USART1, USART_FLAG_TC);
  37.         
  38.         #if EN_USART1_RX        
  39.         USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  //开启相关中断

  40. //USART NVIC配置
  41.   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口1中断通道
  42.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;  //抢占优先级3
  43.         NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3
  44.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
  45.         NVIC_Init(&NVIC_InitStructure);  //根据指定的参数初始化NVIC寄存器

  46. #endif
  47.         
  48. }

  49. void USART_PutChar(char Data)
  50. {
  51.         USART_SendData(USART1,Data);
  52.         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET)
  53.         {        
  54.         }
  55. }
  56. void USART_PutStr(char *str)
  57. {
  58.         while(0 != *str)
  59.         {
  60.                 USART1->SR;
  61.                 USART_PutChar(*str);
  62.                 str++;
  63.         }
  64. }

  65. void USART1_IRQHandler(void)
  66. {
  67.         u8 Res;
  68.         
  69.         if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)  //接收中断
  70.         {
  71.                
  72.                 Res =USART_ReceiveData(USART1);  //读取接收到的数据
  73.                                 
  74.                 if((USART_RX_STA&0x8000)==0) //接收未完成
  75.                 {
  76.                         if(USART_RX_STA&0x4000) //接收到了0x0D
  77.                         {
  78.                                 if(Res!=0x0a)USART_RX_STA=0; //接收错误 重新开始
  79.                                 else USART_RX_STA|=0x8000;  //接收完成了
  80.                         }
  81.                         else  //还没有收到0X0D
  82.                         {        
  83.                                 if(Res==0x0d)USART_RX_STA|=0x4000;
  84.                                 else
  85.                                 {
  86.                                         USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
  87.                                         USART_RX_STA++;
  88.                                         if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0; //数据接收错误 重新开始接收
  89.                                 }                 
  90.                         }
  91.                 }                    
  92.   } </font>
  93. <font color="black">}</font>
复制代码
功能代码
  1. <font color="black">int main(void)
  2. {  
  3.         delay_init(168);  //初始化延时函数
  4.         LED_Init();
  5.         USART1_Init();
  6.         USART_PutStr("ATD此处改为目标电话号码;\r");    //拨打电话
  7.         
  8.         while(1)
  9.         {
  10.                 delay_ms(1000);
  11.         }
  12.         
  13. }</font>
复制代码





L610_USART_Call.hex

15.24 KB, 下载次数: 0

测试文件


作者: Mcuzone_TKN    时间: 2020-6-2 17:23
本帖最后由 Mcuzone_TKN 于 2020-6-2 17:27 编辑

L610通过串口与STM32F407开发板连接,因为L610是1.8V,STM32F407是3.3V,所以需要通过电平转换芯片来连接两者。

微信图片_20200602172148.jpg (6.8 MB, 下载次数: 9891)

微信图片_20200602172148.jpg





欢迎光临 Mcuzone 野芯科技 (http://testbbs.mcuzone.com/) Powered by Discuz! X3.1