STM32 之串口WIFI应用--基于RTOS的环境

STM32的产品应用

文章目录

  • STM32的产品应用
  • [1 项目介绍](#1 项目介绍)
    • [1.1 ATK-ESP8266介绍](#1.1 ATK-ESP8266介绍)
    • [1.2 ATK-ESP8266 WIFI 模块的原理图](#1.2 ATK-ESP8266 WIFI 模块的原理图)
    • [1.3 常见指令](#1.3 常见指令)
    • [1.4 数据传输](#1.4 数据传输)
  • [2 STM32接口](#2 STM32接口)
    • [2.1 原理图说明](#2.1 原理图说明)
    • [2.2 硬件初始化](#2.2 硬件初始化)
      • [2.2.1 初始化寄存器](#2.2.1 初始化寄存器)
      • [2.2.2 配置中断获取程序](#2.2.2 配置中断获取程序)
      • [2.2.3 发送程序](#2.2.3 发送程序)
  • [3 WIFI 模组初始化程序](#3 WIFI 模组初始化程序)
    • [3.1 背景知识介绍](#3.1 背景知识介绍)
    • [3.2 配置代码](#3.2 配置代码)

1 项目介绍

本次项目利用WIFI模块设置成为STA模式,访问特定目标机。把检测到温湿度数据上传到

1.1 ATK-ESP8266介绍

ATK-ESP8266 是 ALIENTEK 推出的一款高性能的 UART-WiFi(串口-无线)模块,ATK-ESP8266 板载正点原子团队自主开发的 ATK-ESP-01 模块,该模块通过 FCC,CE 认证,可直接用于产品出口欧美地区。

ATK-ESP8266 模块采用串口(LVTTL)与 MCU(或其他串口设备)通信,内置 TCP/IP协议栈,能够实现串口与 WIFI 之间的转换。

通过 ATK-ESP8266 模块,传统的串口设备只是需要简单的串口配置,即可通过网络(WIFI)传输自己的数据。

ATK-ESP8266 模块支持 LVTTL 串口,兼容 3.3V 和 5V 单片机系统,可以很方便的与你的产品进行连接。模块支持串口转 WIFI STA、串口转 AP 和 WIFI STA+WIFI AP 的模式,从而快速构建串口-WIFI 数据传输方案,方便你的设备使用互联网传输数据。

ATK-ESP8266 模块非常小巧(29mm*19mm),模块通过 6 个 2.54mm 间距的排针与外部连接,


1.2 ATK-ESP8266 WIFI 模块的原理图

1.3 常见指令

在 AT 模式下可以通过串口的 AT 指令对系统参数做配置。指令格式如下:

AT+=\r\n

根据不同指令,模块将返回不同的返回值。其中\r\n 为回车换行符,用 16 进制表示,

就是 0X0D,0X0A。

例如:"AT+CWMODE?\r\n"查询当前模块的 WIFI 模式。

例如:"AT+CWMODE=3\r\n"设置模块 WIFI 模式为 AP+STA 模式。

1.4 数据传输

数据通过串口直接发送,发送直接需要指令,告知需要发送多少字节。

2 STM32接口

2.1 原理图说明

STM32 连接到 串口模块

W_TX 连接到 RXD_TTL

W_RX 连接到 TXD_TTL

VCC 连接到 VCC

GND 连接到 GND

2.2 硬件初始化

2.2.1 初始化寄存器

与WIFI 模块默认通讯波特率115200,使用是PB10和PB11号口。

c 复制代码
void usart3_init(void)
{  
	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
		
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //使能GPIOB时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//使能USART3时钟
 	USART_DeInit(USART3);  //复位串口3
	
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3); //GPIOB11复用为USART3
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3); //GPIOB10复用为USART3	
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_10; //GPIOB11和GPIOB10初始化
	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(GPIOB,&GPIO_InitStructure); //初始化GPIOB11,和GPIOB10
	
	USART_InitStructure.USART_BaudRate = usart3_baud_rate;//波特率 
	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(USART3, &USART_InitStructure); //初始化串口3
 	
	USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断   
	USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);//开启中断   
	
	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级2
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
	
	USART_Cmd(USART3, ENABLE);               //使能串口
//  创建信号量
	rt_sem_init(&rt_sem_usart3,"wifi_sem",0,RT_IPC_FLAG_FIFO);
}
INIT_BOARD_EXPORT(usart3_init);    // 初始化流程

2.2.2 配置中断获取程序

利用接收中断,来采集数据。 利用空闲中断,设置字符串结束标志位。

c 复制代码
void USART3_IRQHandler(void)
{  
	rt_interrupt_enter();
	if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据
	{	
		USART3_RX_BUF[USART3_RX_CNT++]=USART_ReceiveData(USART3);	  // 采集信息		
		if(USART3_RX_CNT>=USART3_MAX_RECV_LEN)
			USART3_RX_CNT=0;	
		USART_ClearITPendingBit(USART3, USART_IT_RXNE);
	}
	else if(USART_GetITStatus(USART3, USART_IT_IDLE) != RESET)
	{	
		USART_ReceiveData(USART3);		  // 清楚标志位
		USART3_RX_BUF[USART3_RX_CNT]='\0';  // 添加结束符号
		USART3_RX_CNT=0;
		rt_sem_release(&rt_sem_usart3);  // 释放信号量
	}
	rt_interrupt_leave();	
}

2.2.3 发送程序

循环发送字符串,利用字符串截至符号控制发送的长度

c 复制代码
void usart_send(USART_TypeDef *usart,char *p_str)
{
	u32 size = rt_strlen(p_str);
	for(u32 i=0;i<size;i++)
	{
		USART_SendData(usart, *p_str++);
		while (USART_GetFlagStatus(usart, USART_FLAG_TC) == RESET)
				{}
	}
}

3 WIFI 模组初始化程序

3.1 背景知识介绍

串口无线 STA(COM-WIFI STA)模式,模块作为无线 WIFI STA,用于连接到无线网络,实现串口与其他设备之间的无线(WIFI)数据转换互传。该模式下,根据应用场景的不同,可以设置 3 个子模式:TCP 服务器、TCP 客户端,UDP。

接下来看看如何听过 AT 指令配置模块,达到我们所要的功能,这里仅列出必要配置。配置准备:1,模块处于默认设置(即出厂设置);2,准备一个无线路由器,且路由器开启DHCP 服务。

  1. 配置UDP 模式
  2. 串口无线 STA 模式,TCP 客户端配置
  3. 串口无线 STA 模式,TCP 服务器配置。

3.2 配置代码