STM32+ESP8266配置

  这里简单的记录STM32+ESP8266配置

MCU:STM32F030R8

ESP8266模块:ESP-01S

ESP8266工作模式:WIFI AP、TCP Client

MCU、ESP8266互连USART:USART1

MCU信息打印USART:USART2(下面有些代码涉及USART2,可以忽略,因为现在是从项目代码中复制出来的,处理干净感觉麻烦)

  以下只针对ESP8266相关代码的

1. 在esp8266.h中增加如下代码

 1 #ifndef __ESP8266_H
 2 #define __ESP8266_H
 3 
 4 #include "stm32f0xx.h"
 5 #include "stdio.h"
 6 #include "string.h"
 7 #include "stm32f0xx_it.h"
 8 
 9 extern char esp8266_cmd[100];  //用于储存ESP8266命令,这里没有用到
10 extern char esp8266_buff[100];    //用于存储ESP8266指令返回的信息
11 extern uint8_t i;                //esp8266_buff索引变量
12 
13 void USART1_GPIO_Config(void);      //USART1用到的GPIO配置TX--PA9,RX--PA10
14 void USART1_Config(uint32_t BaudRate);    //USART1配置
15 void ESP8266_Init(void);                //ESP8266各项初始化
16 void USART1_Send_Byte(USART_TypeDef* pUSARTX, uint8_t Data);  //USART1单个字节发送函数
17 void ESP8266_Printf(char* str);                                //向USART1发送多个字符
18 void ESP8266_Config(void);                                    //ESP8266工作模式配置
19 void USART1_NVIC_Config(void);                                //USART1中断优先级配置
20 void UART_DMA_Config(void);                                    //USART1 DMA配置
21 void esp8266_send_cmd(char * cmd, char * ack);                //ESP8266命令发送函数
22 void esp8266_exit_trans(void);                                //ESP8266退出透传模式
23 
24 #endif
View Code

2. 在esp8266.c中增加如下代码

  1 #include "esp8266.h"
  2 
  3 
  4 char esp8266_cmd[100] = 0;
  5 char esp8266_buff[100] = 0;
  6 uint8_t i = 0;
  7 
  8 
  9 void USART1_GPIO_Config(void)
 10 {
 11 
 12 
 13 
 14     GPIO_InitTypeDef Uart_GPIO_InitStructure;
 15     
 16     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);    
 17      GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);     //Tx
 18       GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);    //Rx
 19     Uart_GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;   
 20 
 21     Uart_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  
 22     Uart_GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  
 23     Uart_GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
 24       Uart_GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 25     
 26       GPIO_Init(GPIOA, &Uart_GPIO_InitStructure);   
 27 
 28 
 29 
 30 
 31     
 32 
 33 
 34 }
 35 
 36 
 37 void USART1_Config(uint32_t BaudRate)
 38 {
 39     
 40     USART_InitTypeDef Uart_Config_Struct;
 41 
 42     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
 43 
 44 
 45     Uart_Config_Struct.USART_BaudRate = BaudRate;
 46     Uart_Config_Struct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
 47     Uart_Config_Struct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
 48     Uart_Config_Struct.USART_Parity = USART_Parity_No;
 49     Uart_Config_Struct.USART_StopBits = USART_StopBits_1;
 50     Uart_Config_Struct.USART_WordLength = USART_WordLength_8b;
 51 
 52 
 53     USART_Init(USART1, &Uart_Config_Struct);
 54 
 55     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
 56 
 57     USART_Cmd(USART1, ENABLE);
 58 
 59 
 60 }
 61 
 62 
 63 
 64 
 65 void ESP8266_Init(void)
 66 {
 67     USART1_GPIO_Config();
 68     
 69     USART1_Config(115200);
 70     USART1_NVIC_Config();
 71     ESP8266_Config();
 72     UART_DMA_Config();
 73 
 74 }
 75 
 76 
 77 
 78 
 79 void USART1_Send_Byte(USART_TypeDef* pUSARTX, uint8_t Data)
 80 {
 81 
 82    
 83     pUSARTX->TDR = (Data & (uint16_t)0x01FF);   
 84 
 85      while(USART_GetFlagStatus(pUSARTX, USART_FLAG_TXE) == RESET);
 86     
 87 }
 88 
 89 
 90 
 91 void ESP8266_Printf(char* str)
 92 {
 93     int i,temp;
 94     
 95     temp = strlen(str) + 1;
 96 
 97 
 98     for(i = 0; i < temp; i++)
 99     {
100         USART1_Send_Byte(USART1, *(str + i));
101 
102 
103     }
104 
105      while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
106 
107 
108 }
109 
110 
111 
112 
113 
114 void ESP8266_Config(void)
115 {
116 
117     esp8266_exit_trans();  //无论ESP8266是否处于透传状态,一概执行一下退出透传指令,
118                         //此语句实际上应该不需要,但调试时,若没有此语句很麻烦,因为
119                         //执行一次透传后,后面会一直是这个状态,需要重新上电才行
120     
121     esp8266_send_cmd("AT+CWMODE=2\r\n","OK");
122     esp8266_send_cmd("AT+RST\r\n","ready"); //这里没有使用"OK"字符进行确认是因为esp8266_buff
123                                             //只存储100个字符,一旦复位会有操作100个字符,
124                                             //“OK”会被冲掉,所以使用最后的“ready”来确认
125                                             
126     esp8266_send_cmd("AT+CWSAP=\"HM_WIFI\",\"12345678\",1,4\r\n","OK");
127     esp8266_send_cmd("AT+CIPMUX=0\r\n","OK");
128     esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"192.168.4.2\",8086\r\n","CONNECTED");
129     esp8266_send_cmd("AT+CIPMODE=1\r\n","OK");
130     esp8266_send_cmd("AT+CIPSEND\r\n","OK");
131 
132 
133 
134 
135 }
136 
137 
138 void USART1_NVIC_Config(void)
139 {
140     NVIC_InitTypeDef NVIC_struct;
141 
142     NVIC_struct.NVIC_IRQChannel = USART1_IRQn;
143     NVIC_struct.NVIC_IRQChannelCmd = ENABLE;
144     NVIC_struct.NVIC_IRQChannelPriority = 1;
145 
146 
147      NVIC_Init(&NVIC_struct);
148 
149 }
150 
151 
152 
153 void esp8266_send_cmd(char * cmd, char * ack)
154 {
155     while(1)
156     {
157         i = 0;
158         memset(esp8266_buff,0,sizeof(esp8266_buff));
159 
160         USART2_Printf(cmd);
161         ESP8266_Printf(cmd);
162         delay(5000000);
163 
164     
165         if(strstr(esp8266_buff, ack))
166             break;
167 
168     }
169 
170 }
171 
172 
173 //退出透传使用这种方式,ESP8266_Printf这个函数发送问题,无法退出,因为暂时不知道
174 void esp8266_exit_trans(void)
175 {
176 
177 
178     USART1_Send_Byte(USART1,'+');
179     USART1_Send_Byte(USART1,'+');
180     USART1_Send_Byte(USART1,'+');
181     
182     delay(5000000);
183     esp8266_send_cmd("AT\r\n","OK");
184 
185 }
View Code

3. 在stm32f0xx_it.h增加如下代码

 1 #include "esp8266.h"
 2 #include "usart2.h"
 3 #include "esp8266.h"
 4 #include "stdio.h"
 5 
 6 
 7 
 8 
 9 void USART1_IRQHandler(void);
10 void USART2_IRQHandler(void);
View Code

4. 在stm32f0xx_it.c增加如下代码

 1 void USART1_IRQHandler(void)
 2 {
 3 
 4 
 5     if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
 6     {
 7         esp8266_buff[i++] = USART_ReceiveData(USART1);
 8         
 9 
10     }
11 
12 
13 }
View Code

注意:切不可在中断函数中给USART发消息,不然会进入死循环,因为在这里发送,中断USART就会收到消息进入中断,中断中又继续给自己发送消息,所以会进入死循环,至于为什么另外一种发送可以发送,我想因为是操作了一些寄存器的值,这里我没有去研究,我只在下面这篇文章稍微记录了下,算是给自己提个醒。

STM32 USART中断函数进入死循环的问题

猜你喜欢

转载自www.cnblogs.com/QSHL/p/13193497.html