返回列表 发新帖

用STM32F407开发板实现4G模块L610接听电话功能

[复制链接]

28

主题

45

帖子

1万

积分

允许发帖

积分
10186
发表于 2020-6-2 15:11:27 | 显示全部楼层 | 阅读模式
本帖最后由 Mcuzone_TKN 于 2020-6-9 09:27 编辑

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


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

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

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

(附有测试文件)


串口代码
  1. 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;//上拉­
  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. void USART1_IRQHandler(void)
  65. {
  66. static u8 Count = 0, i[4] = {0};
  67. if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)  //接收中断
  68. {
  69.   USART_ClearFlag(USART1, USART_IT_RXNE);   //清除中断
  70.   i[Count++] = USART_ReceiveData(USART1);   //读取接收到的数据
  71.   if(Count == 4)
  72.   {
  73.    if((i[0] == 'R') && (i[1] == 'I') && (i[2] == 'N') && (i[3] == 'G'))
  74.    {
  75.     for(Count=0; Count<4; Count++)
  76.     {
  77.      i[Count] = 0;
  78.     }
  79.     GPIO_ResetBits(GPIOA,GPIO_Pin_7);
  80.     USART_PutStr("ATA\r");
  81.    }
  82.    Count = 0;
  83.   }
  84. }
  85. }
复制代码
主函数代码
  1. int main(void)
  2. {  
  3.         delay_init(168);
  4.         LED_Init();
  5.         USART1_Init();
  6.         USART_PutStr("AT+CAVIMS=1\r"); //开启VoLTE模式
  7.         delay_ms(1000);
  8.          delay_ms(1000);
  9.         
  10.         while(1)
  11.         {
  12.           GPIO_ResetBits(GPIOA,GPIO_Pin_6);
  13.           delay_ms(500);
  14.           GPIO_SetBits(GPIOA,GPIO_Pin_6);
  15.            delay_ms(500);
  16.         }
  17.         
  18. }
复制代码



L610_USART_RING.hex

15.46 KB, 下载次数: 0

测试文件

回复

使用道具 举报

28

主题

45

帖子

1万

积分

允许发帖

积分
10186
发表于 2020-6-2 17:24:47 | 显示全部楼层
本帖最后由 Mcuzone_TKN 于 2020-6-2 17:31 编辑

L610通过串口与STM32F407开发板连接,因为L610是1.8V,STM32F407是3.3V,所以需要通过电平转换芯片来连接两者。
微信图片_20200602172148.jpg
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表