|
本帖最后由 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的串口。
(附有测试文件)
配置初始化串口- <font color="black">int fputc(int ch, FILE *f)
- {
- while((USART1->SR&0x40)==0);
- USART1->DR = (u8) ch;
- return ch;
- }
- void USART1_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //使能USART1时钟
- //串口1对应引脚复用映射
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1
- //USART1端口配置
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHZ
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉­
- GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10。
- //USART1初始化设置
- USART_InitStructure.USART_BaudRate = 115200; //波特率设置
- USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式
- 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; //收发模式
- USART_Init(USART1, &USART_InitStructure); //初始化串口1
-
- USART_Cmd(USART1, ENABLE); //使能串口1
-
- USART_ClearFlag(USART1, USART_FLAG_TC);
-
- #if EN_USART1_RX
- USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启相关中断
- //USART NVIC配置
- NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口1中断通道
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3; //抢占优先级3
- NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
- NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化NVIC寄存器
- #endif
-
- }
- void USART_PutChar(char Data)
- {
- USART_SendData(USART1,Data);
- while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET)
- {
- }
- }
- void USART_PutStr(char *str)
- {
- while(0 != *str)
- {
- USART1->SR;
- USART_PutChar(*str);
- str++;
- }
- }
- void USART1_IRQHandler(void)
- {
- u8 Res;
-
- if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET) //接收中断
- {
-
- Res =USART_ReceiveData(USART1); //读取接收到的数据
-
- if((USART_RX_STA&0x8000)==0) //接收未完成
- {
- if(USART_RX_STA&0x4000) //接收到了0x0D
- {
- if(Res!=0x0a)USART_RX_STA=0; //接收错误 重新开始
- else USART_RX_STA|=0x8000; //接收完成了
- }
- else //还没有收到0X0D
- {
- if(Res==0x0d)USART_RX_STA|=0x4000;
- else
- {
- USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
- USART_RX_STA++;
- if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0; //数据接收错误 重新开始接收
- }
- }
- }
- } </font>
- <font color="black">}</font>
复制代码 功能代码
- <font color="black">int main(void)
- {
- delay_init(168); //初始化延时函数
- LED_Init();
- USART1_Init();
- USART_PutStr("ATD此处改为目标电话号码;\r"); //拨打电话
-
- while(1)
- {
- delay_ms(1000);
- }
-
- }</font>
复制代码
|
|