这里简单的记录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
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 }
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);
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 }
注意:切不可在中断函数中给USART发消息,不然会进入死循环,因为在这里发送,中断USART就会收到消息进入中断,中断中又继续给自己发送消息,所以会进入死循环,至于为什么另外一种发送可以发送,我想因为是操作了一些寄存器的值,这里我没有去研究,我只在下面这篇文章稍微记录了下,算是给自己提个醒。
原文:https://www.cnblogs.com/QSHL/p/13193497.html