#include "usart.h"
#include
#include
#include
void Usart1_Init(unsigned int baud)
{
? ? GPIO_InitTypeDef gpio_initstruct;
? ? USART_InitTypeDef usart_initstruct;
? ? NVIC_InitTypeDef nvic_initstruct;
? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
? ? //PA9? ?TXD
? ? gpio_initstruct.GPIO_Mode = GPIO_Mode_AF_PP;
? ? gpio_initstruct.GPIO_Pin = GPIO_Pin_9;
? ? gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
? ? GPIO_Init(GPIOA, &gpio_initstruct);
? ? //PA10? RXD
? ? gpio_initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
? ? gpio_initstruct.GPIO_Pin = GPIO_Pin_10;
? ? gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
? ? GPIO_Init(GPIOA, &gpio_initstruct);
? ? usart_initstruct.USART_BaudRate = baud;
? ? usart_initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;? ? ? ? //無(wú)硬件流控
? ? usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;? ? ? ? ? ? ? ? ? ? ? ? //接收和發(fā)送
? ? usart_initstruct.USART_Parity = USART_Parity_No;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //無(wú)校驗(yàn)
? ? usart_initstruct.USART_StopBits = USART_StopBits_1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//1位停止位
? ? usart_initstruct.USART_WordLength = USART_WordLength_8b;? ? ? ? ? ? ? ? ? ? ? ? ? ? //8位數(shù)據(jù)位
? ? USART_Init(USART1, &usart_initstruct);
? ? USART_Cmd(USART1, ENABLE);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //使能串口
? ? USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //使能接收中斷
? ? nvic_initstruct.NVIC_IRQChannel = USART1_IRQn;
? ? nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;
? ? nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 0;
? ? nvic_initstruct.NVIC_IRQChannelSubPriority = 2;
? ? NVIC_Init(&nvic_initstruct);
}
void Usart2_Init(unsigned int baud)
{
? ? GPIO_InitTypeDef gpio_initstruct;
? ? USART_InitTypeDef usart_initstruct;
? ? NVIC_InitTypeDef nvic_initstruct;
? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
? ? RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
? ?
? ? gpio_initstruct.GPIO_Mode = GPIO_Mode_AF_PP;
? ? gpio_initstruct.GPIO_Pin = GPIO_Pin_10;
? ? gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
? ? GPIO_Init(GPIOB, &gpio_initstruct);
? ??
? ? gpio_initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
? ? gpio_initstruct.GPIO_Pin = GPIO_Pin_11;
? ? gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
? ? GPIO_Init(GPIOB, &gpio_initstruct);
? ? usart_initstruct.USART_BaudRate = baud;
? ? usart_initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;? ? ? ? //無(wú)硬件流控
? ? usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;? ? ? ? ? ? ? ? ? ? ? ? //接收和發(fā)送
? ? usart_initstruct.USART_Parity = USART_Parity_No;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //無(wú)校驗(yàn)
? ? usart_initstruct.USART_StopBits = USART_StopBits_1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//1位停止位
? ? usart_initstruct.USART_WordLength = USART_WordLength_8b;? ? ? ? ? ? ? ? ? ? ? ? ? ? //8位數(shù)據(jù)位
? ? USART_Init(USART3, &usart_initstruct);
? ? USART_Cmd(USART3, ENABLE);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //使能串口
? ? USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //使能接收中斷
? ? nvic_initstruct.NVIC_IRQChannel = USART3_IRQn;
? ? nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;
? ? nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 0;
? ? nvic_initstruct.NVIC_IRQChannelSubPriority = 0;
? ? NVIC_Init(&nvic_initstruct);
}
void Usart_SendString(USART_TypeDef *USARTx, unsigned char *str, unsigned short len)
{
? ? unsigned short count = 0;
? ? for(; count < len; count++)
? ? {
? ? ? ? USART_SendData(USARTx, *str++);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//發(fā)送數(shù)據(jù)
? ? ? ? while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);? ? ?//等待發(fā)送完成
? ? }
}
void UsartPrintf(USART_TypeDef *USARTx, char *fmt,...)
{
? ? unsigned char UsartPrintfBuf[296];
? ? va_list ap;
? ? unsigned char *pStr = UsartPrintfBuf;
? ? va_start(ap, fmt);
? ? vsnprintf((char *)UsartPrintfBuf, sizeof(UsartPrintfBuf), fmt, ap);? ? ? ? ? ? ? ? ? ? ? ? ?//格式化
? ? va_end(ap);
? ? while(*pStr != 0)
? ? {
? ? ? ? USART_SendData(USARTx, *pStr++);
? ? ? ? while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);
? ? }
}
void USART1_IRQHandler(void)
{
? ? if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷
? ? {
? ? ? ? USART_ClearFlag(USART1, USART_FLAG_RXNE);
? ? }
}
//這是串口初始化,下面是esp8266的代碼
#include "debug.h"
#include "esp8266.h"
#include "usart.h"
#include
#include
#define ESP8266_WIFI_INFO? ? ? ?"AT+CWJAP=\"IQOOneo5\",\"12345678\"\r\n"
unsigned char esp8266_buf[512];
unsigned short esp8266_cnt = 0, esp8266_cntPre = 0;
void ESP8266_Clear(void)
{
? ? memset(esp8266_buf, 0, sizeof(esp8266_buf));
? ? esp8266_cnt = 0;
}
_Bool ESP8266_WaitRecive(void)
{
? ? if(esp8266_cnt == 0)? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果接收計(jì)數(shù)為0 則說(shuō)明沒(méi)有處于接收數(shù)據(jù)中,所以直接跳出,結(jié)束函數(shù)
? ? ? ? return REV_WAIT;
? ? if(esp8266_cnt == esp8266_cntPre)? ? ? ? ? ? ? ?//如果上一次的值和這次相同,則說(shuō)明接收完畢
? ? {
? ? ? ? esp8266_cnt = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? //清0接收計(jì)數(shù)
? ? ? ? return REV_OK;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //返回接收完成標(biāo)志
? ? }
? ? esp8266_cntPre = esp8266_cnt;? ? ? ? ? ? ? ? ? ?//置為相同
? ? return REV_WAIT;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //返回接收未完成標(biāo)志
}
_Bool ESP8266_SendCmd(char *cmd, char *res)
{
? ? unsigned char timeOut = 200;
? ? Usart_SendString(USART3, (unsigned char *)cmd, strlen((const char *)cmd));
? ? while(timeOut--)
? ? {
? ? ? ? if(ESP8266_WaitRecive() == REV_OK)? ? ? ? ? ? ? ? ? ? ? ? ? //如果收到數(shù)據(jù)
? ? ? ? {
? ? ? ? ? ? UsartPrintf(USART_DEBUG, " Hardware init OK\r\n");
? ? ? ? ? ? if(strstr((const char *)esp8266_buf, res) != NULL)? ? ? //如果檢索到關(guān)鍵詞
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ESP8266_Clear();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //清空緩存
? ? ? ? ? ? ? ? return 0;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? Delay_Ms(10);
? ? }
? ? return 1;
}
void ESP8266_SendData(unsigned char *data, unsigned short len)
{
? ? char cmdBuf[32];
? ? ESP8266_Clear();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //清空接收緩存
? ? sprintf(cmdBuf, "AT+CIPSEND=%d\r\n", len);? ? ? //發(fā)送命令
? ? if(!ESP8266_SendCmd(cmdBuf, ">"))? ? ? ? ? ? ? ?//收到‘>’時(shí)可以發(fā)送數(shù)據(jù)
? ? {
? ? ? ? Usart_SendString(USART3, data, len);? ? ? ? //發(fā)送設(shè)備連接請(qǐng)求數(shù)據(jù)
? ? }
}
unsigned char *ESP8266_GetIPD(unsigned short timeOut)
{
? ? char *ptrIPD = NULL;
? ? do
? ? {
? ? ? ? if(ESP8266_WaitRecive() == REV_OK)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果接收完成
? ? ? ? {
? ? ? ? ? ? ptrIPD = strstr((char *)esp8266_buf, "IPD,");? ? ? ? ? ? ? ?//搜索“IPD”頭
? ? ? ? ? ? if(ptrIPD == NULL)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果沒(méi)找到,可能是IPD頭的延遲,還是需要等待一會(huì),但不會(huì)超過(guò)設(shè)定的時(shí)間
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //UsartPrintf(USART_DEBUG, "\"IPD\" not found\r\n");
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ptrIPD = strchr(ptrIPD, ':');? ? ? ? ? ? ? ? ? ? ? ? ? ?//找到':'
? ? ? ? ? ? ? ? if(ptrIPD != NULL)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ptrIPD++;
? ? ? ? ? ? ? ? ? ? return (unsigned char *)(ptrIPD);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? return NULL;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? Delay_Ms(10);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //延時(shí)等待
? ? } while(timeOut--);
? ? return NULL;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //超時(shí)還未找到,返回空指針
}
void ESP8266_Init(void)
{
? ? ESP8266_Clear();
? ? UsartPrintf(USART_DEBUG, "1. AT\r\n");
? ? while(ESP8266_SendCmd("AT\r\n", "OK"))
? ? ? ? Delay_Ms(500);
? ? UsartPrintf(USART_DEBUG, "2. CWMODE\r\n");
? ? while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
? ? ? ? Delay_Ms(500);
? ? UsartPrintf(USART_DEBUG, "3. AT+CWDHCP\r\n");
? ? while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))
? ? ? ? Delay_Ms(500);
? ? UsartPrintf(USART_DEBUG, "4. CWJAP\r\n");
? ? while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))
? ? ? ? Delay_Ms(500);
? ? UsartPrintf(USART_DEBUG, "5. ESP8266 Init OK\r\n");
}
void USART2_IRQHandler(void)
{
? ? if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中斷
? ? {
? ? ? ? if(esp8266_cnt >= sizeof(esp8266_buf))? esp8266_cnt = 0; //防止串口被刷爆
? ? ? ? esp8266_buf[esp8266_cnt++] = USART3->DATAR;
? ? ? ? USART_ClearFlag(USART3, USART_FLAG_RXNE);
? ? }
}
卡到連接第一步。